[딥러닝 알아듣기] 1.4. 퍼셉트론

“딥러닝 알아듣기” 시리즈는 딥러닝의 기초 지식을 저만의 방식으로 쉽게 풀어내는 시리즈입니다. 이번 챕터에서는 인공신경망의 이론적 토대가 되는 퍼셉트론 구조에 대해 알아봅니다.


이번 챕터부터 인공 신경망의 이론적인 발전을 천천히 따라가 보자. 딥 러닝을 공부하는 것이 곧 인공 신경망의 구조와 동작 원리에 대해 공부하는 것이므로, 인공 신경망 이론이 어떻게 발전해왔는지 그 흐름을 파악하는 것이 중요하다. 이번 챕터에서 가장 먼저 살펴볼 것은, 인공 신경망의 기본적인 구조와 동작 흐름을 처음 제시한 기념비적 연구인 퍼셉트론(Perceptron) 이다. 퍼셉트론은, 입력 데이터를 받아 일정한 연산을 거쳐 출력 데이터를 내놓는 간단한 알고리즘이다. 그 과정에서 뇌신경망을 구성하는 가장 기초적인 단위인 뉴런끼리의 신호 전달 체계를 모방한다.

1.4.1. 퍼셉트론

뇌신경망에서 뉴런끼리 신호를 어떻게 주고 받는지 살펴보자. 하나의 뉴런은 여러 입력 신호들을 받아 다음 뉴런으로 신호를 출력한다. 자극을 받지 않고 있는 뉴런은 아무런 신호도 보내지 않는다. 그러나 뉴런이 자신과 연결된 여러 뉴런에게 전기적인 자극을 전달받으면 흥분 상태가 된다. 그러다 뉴런이 받은 자극이 일정 임계치 이상으로 커지면, 자연스럽게 전기적 신호를 내보낼 수 있는 통로가 열려 다음 뉴런으로 자극을 보내게 된다. 이렇게 이루어지는 뉴런끼리의 기본적인 상호작용이, 뇌 안에서 일어나는 정보 전달의 가장 기본적인 단위로 알려져 있다.

퍼셉트론은 뉴런끼리의 신호 전달 과정을 컴퓨터 알고리즘으로 비슷하게 옮겨놓은 것이다. 기본적으로 여러 입력 값에 대한 이중 분류(Binary Classification) 을 수행하기 위해 디자인되었다. 입력에 따른 출력을 두 분류로 구분하는 것이다. 뉴런이 임계치 이상의 자극을 받았을 때만 신호를 출력하는 것처럼, 노드의 계산 결과가 특정한 임계치를 넘었을 때는 1을, 그렇지 못할 때는 0을 출력하는 분류기로 이용한다.

<그림 1> 퍼셉트론

퍼셉트론이 뉴런의 연결 구조를 모방했다고 하지만, 고전적인 머신 러닝 알고리즘들과 동일하게 수학적으로 설계되어 있다. 향후 나올 모든 인공 신경망과 딥 러닝 알고리즘들도 그럴 것이다.

그러면 퍼셉트론이 어떻게 뉴런과 뉴런 사이의 연결 관계를 수학적으로 표현했는지 살펴보자. 퍼셉트론에서의 뉴런은 노드(Node) 라고 칭한다. 하나의 노드는 여러 개의 입력 값을 받는다. 노드는 자신이 가지고 있는 가중치(Weight)편향(Bias), 입력 값들을 사용해 자극을 받은 정도를 계산한다. 그리고 실제 뉴런과 같이 계산한 값이 일정 임계치(Threshold) 보다 클 경우, 다음 노드로 값을 출력한다. 노드의 계산 결과에 따라 실제 출력 값을 결정하는 함수를 활성 함수(Activation Function) 라고 한다. 퍼셉트론에서 노드의 활성 함수는 노드의 계산 결과를 받아서 값이 임계치를 넘는지 여부에 따라 0 또는 1을 출력하는 함수이다. 활성 함수의 출력이 노드의 최종 출력이므로, 퍼셉트론의 노드는 무조건 0 또는 1만 출력한다.

<그림 2> 퍼셉트론의 기본적인 구조

퍼셉트론은 하나의 입력당 하나의 가중치를 가지고 있다. 노드가 자극을 받은 정도는 각 입력과 가중치를 곱한 총합에 편향을 더한 값으로 계산된다. 가중치가 달라지면 노드의 출력에 해당 입력이 미치는 영향이 달라진다.

<그림 3> 퍼셉트론의 계산과 출력

임계치 \(T\)를 가지는 노드의 활성 함수를 수학적으로 아래와 같이 정의할 수 있을 것이다. 노드의 계산 결과가 \(T\)보다 작으면 0, 크면 1을 출력하는 활성 함수이다.

\[y = w_1x_1 + w_2x_2 + b\] \[\text{act}(y) = \left\{\begin{matrix} 0 \ \ \text{if} \ \ y \ < \ T & \\ 1 \ \ \text{if} \ \ y \ \geq \ T& \end{matrix}\right.\]

퍼셉트론이 획기적인 아이디어였던 핵심적인 이유는, 퍼셉트론이 스스로 학습 할 수 있도록 디자인되었기 때문이다. 퍼셉트론은 입력 데이터와 그에 맞는 정답 데이터가 모여 있는 이중 분류 데이터셋으로 학습시킬 수 있다. 정답 데이터와 더 비슷하게 분류해낼 수 있도록 가중치와 편향을 스스로 조절하는 것이다. 이런 능력이 없었다면 기존의 단순한 컴퓨터 알고리즘과 크게 다를 바가 없다. 이 장에서 퍼셉트론의 학습 방법을 직접 다루어보지는 않을 것이다. 이 장에서는 실제로 퍼셉트론이 가중치와 편향을 이용해 이중 분류기를 어떻게 구현하는지 살펴보고, 그러한 퍼셉트론을 학습으로도 만들어낼 수 있다는 점만 기억하고 넘어가면 된다.

1.4.2. AND / OR 게이트 퍼셉트론 구현해보기

이중 분류를 수행하는 퍼셉트론을 간단히 직접 구현해보자. 학습시키진 않을 것이고, 모든 가중치와 편향 값을 직접 설정해서 실제로 퍼셉트론이 잘 동작하는지 확인해보겠다.
이중 분류를 수행하는 퍼셉트론의 대표적인 예로, AND 게이트OR 게이트 를 구현하는 퍼셉트론을 생각해볼 수 있다. AND 게이트는 논리합 게이트라고도 불리며, 두 개의 입력이 모두 1인 경우에만 1을 출력한다. OR 게이트는 논리곱 게이트라고도 불리며, 두 개의 입력 중 하나만 1이어도 1을 출력한다. 아래는 두 게이트의 입출력을 정리한 진리표이다.

<그림 4> AND 게이트와 OR 게이트의 진리표

진리표에서 볼 수 있듯이, AND와 OR 게이트를 구현하는 퍼셉트론도 \(x_1, x_2\)를 입력으로 받아 0 또는 1을 출력하는 아래와 같은 형태일 것이다.

\[y = w_1x_1 + w_2x_2 + b\] \[\text{act}(y) = \left\{\begin{matrix} 0 \ \ \text{if} \ \ y \ < \ T & \\ 1 \ \ \text{if} \ \ y \ \geq \ T& \end{matrix}\right.\]

\(w_1, \ w_2, \ b, \ T\)를 적절히 설정해주면 AND와 OR 게이트 퍼셉트론을 구현할 수 있다. 가중치와 편향, 임계치 등 입력을 제외하고 퍼셉트론의 출력에 영향을 주는 모든 값들을 파라미터(Parameter) 라고 한다. 파라미터들을 각각 아래와 같이 설정하면, AND와 OR 게이트를 구현할 수 있다.

진짜 위의 파라미터들이 AND와 OR 게이트를 구현해주는지 파이썬 코드로 직접 확인해보자. 노드의 계산과 활성 함수를 각각 파이썬 함수로 구현해 확인해보자.

먼저 AND 게이트 퍼셉트론을 구현해보자. AND 게이트 퍼셉트론의 활성 함수는 아래와 같이 파이썬 코드로 옮길 수 있다.

# 활성화 함수 #
def act_function(y):
    T = 0.72
    if y < T:
        return 0
    else:
        return 1

이제 AND 게이트 퍼셉트론을 구현하는 함수를 작성해보자. 가중치와 편향 변수를 모두 설정해준 후, 위에서 보았던 퍼셉트론의 노드 계산 과정과 같이 계산해주면 된다.

# AND 게이트 #
def AND(x1, x2):
    w1, w2, b, T = 0.3, 0.3, 0.3, 0.72   # 파라미터 설정
    y = w1*x1 + w2*x2 + b               # 노드 계산
    output = act_function(y, T)         # 활성화 함수 출력
    return output

구현한 AND 게이트 퍼셉트론 함수에 진리표에 있는 각각의 입력을 집어넣으면, AND 게이트를 잘 구현하고 있음을 확인할 수 있다.

print('AND 0, 0 :', AND(0, 0))
print('AND 0, 1 :', AND(0, 1))
print('AND 1, 0 :', AND(1, 0))
print('AND 1, 1 :', AND(1, 1))
AND 0, 0 : 0
AND 0, 1 : 0
AND 1, 0 : 0
AND 1, 1 : 1

AND 게이트와 마찬가지로 OR 게이트도 구현해볼 수 있다. OR 게이트의 파라미터들에 맞게 활성 함수와 퍼셉트론 구현 함수를 수정해준다.

# 활성화 함수 #
def act_function(y):
    T = 0.5
    if y < T:
        return 0
    else:
        return 1
# OR 게이트 #
def OR(x1, x2):
    w1, w2, b, T = 0.3, 0.3, 0.3, 0.5   # 파라미터 설정
    y = w1*x1 + w2*x2 + b               # 노드 계산
    output = act_function(y, T)         # 활성화 함수 출력
    return output
print('OR 0, 0 :', OR(0, 0))
print('OR 0, 1 :', OR(0, 1))
print('OR 1, 0 :', OR(1, 0))
print('OR 1, 1 :', OR(1, 1))

우리의 퍼셉트론이 OR 게이트 역시 잘 구현하고 있음을 볼 수 있다.

OR 0, 0 : 0
OR 0, 1 : 1
OR 1, 0 : 1
OR 1, 1 : 1

퍼셉트론이 가지고 있는 가중치와 편향에 따라, 활성화 함수의 임계값도 같이 달라져야 할 것이다. 예를 들어, 아래와 같이 파라미터와 임계치를 설정해도 AND와 OR 게이트를 구현할 수 있다. 이처럼 임계값과 파라미터는 밀접한 관계를 가지고 있다.

1.4.3. 퍼셉트론을 수학적으로 이해하기

퍼셉트론도 결국 알고리즘이므로, 수학적으로 분석하면 원리를 이해하는 데에 큰 도움이 된다. 특히 지금 이 내용은 앞으로 머신 러닝과 딥 러닝을 공부하면서 가장 확실하게 알아두어야 할 개념 중 하나이기 때문에, 확실히 이해하고 넘어가도록 하자.

생물의 뉴런이야 복잡하겠지만, 활성화 함수를 거치기 전까지 퍼셉트론 노드의 연산은 결국 덧셈과 곱셈의 연속이다. 따라서 퍼셉트론의 계산 과정을 어떠한 하나의 선형 함수로 표현 가능 할 것이다. 우리는 위에서부터 계속 퍼셉트론을 수식으로 나타냈다.

\[y = w_1x_1 + w_2x_2 + b\]

\(x_1, x_2\) 두 개의 변수를 가지고 있는 전형적인 선형 함수의 모습이다. 가중치 \(w_1, w_2\)는 이 선형 함수를 나타낸 직선의 기울기일 것이고, 편향 \(b\)는 직선의 위치를 조정하는 y절편과 같을 것이다.

자, 퍼셉트론이 결국에는 하나의 함수를 나타낸 구조니, 퍼셉트론의 입출력을 그래프에 그려볼 수도 있을 것이다. 위에서 구현했던 AND 게이트를 이용해보자.

\[y = 0.3x_1 + 0.3x_2 + 0.3\]

이 퍼셉트론의 계산 결과를 임의의 실수 \(r\)로 고정하면, \(x_1, x_2\)에 대한 직선의 방정식 형태로 퍼셉트론을 표현할 수 있을 것이다. 즉, 퍼셉트론의 계산 결과가 \(r\)이 나오는 모든 \(x_1, x_2\)를 그래프 위에 그려볼 수 있다.
AND 게이트 퍼셉트론의 임계치는 \(T = 0.72\)이다. 퍼셉트론의 계산 결과가 0.72로 나오도록 하는 모든 \((x_1, x_2)\)를 그래프에 나타내보자.

<그림 5> AND 게이트 퍼셉트론의 계산 결과가 0.72인 입력 데이터의 그래프

퍼셉트론을 들어봤다면 한번쯤을 보았을 그림이다. 퍼셉트론의 계산 결과가 임계치에 딱 맞게 나오는 입력들을 그래프에 나타낸 직선이, 출력이 0인 입력과 1인 입력을 구분하고 있는 모양이다.
퍼셉트론을 나타낸 함수가 선형 함수이기 때문에, 계산 결과가 임계치보다 작은 입력은 그래프상에서 무조건 파란 직선 밑에 위치할 수밖에 없다. 반대로 계산 결과가 임계치보다 큰 입력은 파란 직선 위에 위치할 것이다. 다시 말해서, 위 그래프에서 파란 직선을 기준으로 입력에 대한 출력이 0과 1로 나뉘게 된다.

<그림 6> AND 게이트 퍼셉트론의 결정 경계

위 그래프에서의 파란 직선을 결정 경계(Decision Boundary) 라고 부른다. 이 직선을 기준으로 해서 퍼셉트론의 출력이 나뉘기 때문에 이러한 이름이 붙었다.

퍼셉트론의 가중치, 편향, 임계치에 따라 결정 경계는 다양하게 변할 수 있다. 따라서 분류 성능이 좋은 퍼셉트론이란 말은, 입력 데이터를 잘 구분하는 좋은 결정 경계를 가지고 있는 퍼셉트론이라는 뜻이다. 이는 곧 입력을 잘 구분하도록 가중치와 편향 등의 파라미터를 잘 설정했다는 말과 같다.

AND 게이트에서와 같이, OR 게이트에 대한 결정 경계도 그래프에 그려볼 수 있다. OR 게이트의 파라미터를 이용해서 그래프를 그려보자.

<그림 7> OR 게이트 퍼셉트론의 결정 경계