퍼셉트론(Perceptron): 덧셈과 곱셈으로 뉴런 구현하기
이 글은 나만 알기 아까운 딥러닝 시리즈에 포함된 글입니다. 그러나 전체 글을 읽지 않아도 이해할 수 있습니다. 전체 목차는 여기에서 확인하실 수 있습니다.
딥러닝의 기반 이론인 인공신경망(Artificial Neural Networks:ANN)은 인간의 뉴런 세포들과 이들이 시냅스를 통해 연결된 구조를 컴퓨터 내부에서 수학적 모델로 구현해보고자 한 월터 피츠 교수의 연구에서 시작됐다.
그의 논문이 나온 후 1958년, 프랭크 로젠블렛 교수는 인공신경망의 뉴런 역할을 수행할 수학적 모델인 퍼셉트론(Perceptron)을 제안했다.
퍼셉트론은 일종의 선형 분리기인데, 여기서 선형이란 아주 크게 보면 그래프가 직선으로 표현되는 1차 방정식을 의미한다고 보면 된다.
f(x) = ax + b
위 식에서, a와 b에 임의의 수를 넣고 f(x)를 그래프로 그리면 아래와 같은 직선을 볼 수 있다.
2x 뒤의 어떤 수 b를 0~3으로 바꿔주니 직선이 조금씩 움직였지만, 모든 그래프는 같은 기울기의 직선을 형성했다. 이를 통해 우리는 선형 함수에 어떤 수를 더해줌으로써 그래프를 이동시킬 수 있다는 것을 알 수 있다.
이번에는 b는 0으로 고정해두고 x에 곱해주는 수 a를 바꿔보자.
a를 다른 값으로 해주니 그래프의 기울기가 변화했다.
이것이 퍼셉트론과 어떤 관련이 있는지 알아보자.
퍼셉트론 또한 하나의 선형 함수이다. 퍼셉트론은 임의의 입력값(들)을 입력받아 하나의 값을 출력하는데, 그 식은 아래와 같다.
한 개의 퍼셉트론은 n개의 입력(x)을 받는다. 이 입력들은 각 입력에 대응되는 가중치(weight)를 곱한 후, 모두 합쳐진다. 이때 입력값에 가중치를 곱한 값들의 합이 임의의 임계값(Threshold) Θ보다 크다면 퍼셉트론은 1(True라고 해석해도 좋다.), 아니라면 0을 출력하는 것이다.
이는 뇌에서 뉴런 세포가 이전 뉴런에서 시냅스를 통해 전달된 신호의 크기가 임계값을 초과하면 다시 시냅스를 통해 뒤쪽 뉴런으로 보낼 신호를 발사(fire)하는 과정을 수학적으로 구현한 것이다.
각 입력에 하나의 상수(w)가 곱해지고, 이를 단순히 더한다. 입력값끼리의 곱을 하지 않기 때문에, 퍼셉트론은 선형 함수라고 할 수 있으며, 이를 그래프로 나타내면 아래 형태로 나타난다.
변수가 2개인 선형 함수의 그래프는 3차원 공간상의 직선의 확장 체인 평면의 형태로 나타난다. 입력을 n개 가지는 퍼셉트론의 그래프는 n차원 공간을 둘로 분리하는 하나의 n차원 상의 직선을 만들 것이다.
퍼셉트론으로 AND, OR, NOT 게이트 만들기
이제 0 또는 1의 값을 두 개 입력받아 AND, NOT, OR 연산을 수행하는 퍼셉트론과 한 개의 값을 입력받아 NOT 연산을 수행하는 퍼셉트론을 파이썬으로 만들어보자. 다만, 실제 딥러닝이나 뇌 내에서 처리하는 입력과 가중치는 0과 1이 아닌 복잡한 실수임을 유의해두기 바란다.
먼저 OR 연산이다. 전자계산기에서 OR 연산은, 두 입력 중에서 적어도 하나의 입력이 1(참)이면 1(참)을 출력하고, 두 입력이 모두 0(거짓)이면 0(거짓)을 출력하는 연산이다.
def orPerceptron(a,b):
w1 = 1
w2 = 1
theta = 0.5
total = a*w1 + b*w2
if total > theta:
return 1
else:
return 0
위 파이썬 함수는 a와 b, 두 가지 입력을 받는다. 입력 중 하나라도 1이 있다면, 가중치 1이 곱해져서 total 값이 임계값 0.5를 초과할 것이고, 이는 결국 함수가 참을 출력하도록 할 것이다.
이번에는 0 또는 1의 값을 하나 입력받아 거꾸로 바꿔 출력하는 NOT 게이트를 만들어 보자.
def notPerceptron(a):
w = -1
theta = -0.1
if w*a > theta:
return 1
else:
return 0
위 함수는 약간 복잡해 보일 수 있다. 입력값이 0인 경우를 생각해보자. 0은 -1을 곱해 0이 된다. 이는 임계값 -0.1 보다 큰 값이므로 1이 출력된다.
입력이 1이라면 -1을 곱해 -1이 되고, 0이 출력된다.
이렇게 임계값이나 가중치를 음수로 설정하여 문제를 해결할 수도 있다.
AND 연산을 수행하는 퍼셉트론은 직접 설계해보자. AND 연산에서는, 두 입력을 받아 두 입력이 모두 1일 때만 1을 출력하면 된다.
퍼셉트론의 기하적 의미: 선형분리
퍼셉트론은 각 가중치와 입력값의 곱의 합을 기준으로 1을 출력할지, 0을 출력할지를 결정한다. 이때, 임계값을 이항 하여 퍼셉트론을 g(a, b) = wa + wb - Θ 식으로 나타낼 수 있다. 이때, 이항 된 임계값을 편향(bias)라고 부른다. 위에서 구현한 OR 퍼셉트론의 g를 그래프로 표현하면 아래와 같다.
그래프에서 빨간색과 초록색 축이 각각 입력값 a, b이고, 3차원 그래프를 위에서 내려다보는 시점이다.
그래프 g 위에서, 점 D(0,0,-0.5)만이 결괏값(z)이 0 이하이고, OR 연산의 조건에 충족되는 A(1,0,0.5), B(0,1,0.5), C(1,1,1.5) 세 점은 모두 양의 결괏값을 가지고 있다.
이때, z=0 평면이 그래프와 만나는 접선(그림에서는 노란 선)을 그으면, 그래프가 입력값 (a, b)로 구성된 평면을 둘로 나누고 있는 것을 확인할 수 있다.
즉, 퍼셉트론을 이용하여 선형 분리를 수행한다는 것은, 퍼셉트론의 가중치(기울기)와 편향(b)를 조정하며 문제를 해결하기에 적합한 직선을 찾아내는 것이라고 할 수 있다.
잘 이해가 되지 않는다면 아래 링크의 3차원 계산기로 직접 확인해보길 바란다.
https://www.geogebra.org/3d?lang=ko
퍼셉트론의 한계
내 지난 글, 딥러닝의 역사를 읽은 독자라면, 이후 퍼셉트론 이론의 한계를 마빈 민스키 교수가 지적한 것을 기억할 것이다.
그가 지적한 퍼셉트론의 한계는 너무나도 명확했다. 이 세상의 문제들은 대부분이 선형적으로 분리할 수 없다. 예를 들어, 사람의 행동을 선과 악으로 명확히 구분할 수 없고, 사람의 얼굴을 보고 그가 누구인지 100% 확신하여 답할 수 없다. (100%라고 생각할 수 있으나, 이는 여러분의 뇌가 90% 이상의 높은 확률로 추론한 것을 우리가 100%라고 멋대로 착각한 것에 불과하다.)
마빈 민스키는 가장 단순한 예시로 단일 퍼셉트론으로 XOR 게이트를 구현할 수 없음을 들어 퍼셉트론의 한계를 지적했다.
XOR 게이트는 배타적 논리합이라고도 불리는데, 두 입력 중 하나가 참이면 참을 반환하는 점에서 OR과 비슷하지만, 두 입력이 모두 참이면(AND 이면) 거짓을 반환한다.
A | B | A XOR B |
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
다층 퍼셉트론으로 XOR 구현하기
사실 퍼셉트론으로 XOR을 구현하는 것이 완전히 불가능한 것은 아니다. 퍼셉트론을 여러 계층(Layer)으로 쌓아서 XOR 게이트를 구현할 수 있다.
XOR은 NAND 게이트와 OR 게이트의 AND 연산으로 구현할 수 있는데, NAND 게이트란 단순히 AND 게이트에 NOT을 붙여 값을 반전시킨 게이트이다.
즉, 우리가 위에서 만들어 본 AND, OR, NOT 퍼셉트론을 조합하면 XOR을 퍼셉트론으로 구현할 수 있다.
이런 구조를 다층 퍼셉트론(Multi-layer perceptron)이라고 한다.
def xorPerceptron(a,b):
return andPerceptron(notPerceptron(andPerceptron(a,b)), orPerceptron(a,b))
그러나 마빈 민스키 교수가 지적한 단점은, 실제로 매우 방대한 데이터를 처리하는 다층 퍼셉트론에서, 각 퍼셉트론의 가중치와 편향을 비롯한 변수들을 계산할 방법이 없다는 것이었다.
XOR 퍼셉트론을 예시로 생각해보자, XOR 퍼셉트론은 각각 하나의 NOT 퍼셉트론과 OR 퍼셉트론, 두 개의 AND 퍼셉트론으로 구성되는데, NOT, OR, AND 퍼셉트론은 각각 2,3,3 개의 변수를 갖는다.(가중치 + 편향)
즉, XOR 퍼셉트론을 구현하기 위해 위에서 사용한 변수의 수는 11개로, 이는 적지 않은 숫자이다.
우리가 무엇을 구현하려는지 알지 못하는 상태에서, 대뜸 두개의 입력과 하나의 출력으로 구성된 데이터들을 주며 11개의 매개변수를 설정하라 했다고 생각해보자. 머리를 싸매며 이를 직관으로 해결하기에는 시간도 오래 걸릴 것이며, 이것이 맞는 정답인지를 알 방법도 없을 것이다.
이 문제는 결국 투자자들과 연구자들의 딥러닝(당시에는 퍼셉트론) 기술에 대한 투자 의욕을 잃게 만들었고, 이후 첫 번째 AI 겨울이라 불리는 투자 공백을 만드는 계기가 된다.
활성화 함수
위에서 다층 퍼셉트론의 의의와 한계를 살펴봤다. 정리로 넘어가기 전에 마지막으로 활성화 함수(Activation Function)에 대해 간단히 설명하고자 한다.
A(x1,x2) 퍼셉트론이 지난 계층의 퍼셉트론 a(x)와 b(x) 퍼셉트론의 값을 입력으로 받는다고 생각해보자. 이는 A(a(x),b(x))로 나타낼 수도 있을 것이다.
이때, 퍼셉트론은 모두 선형 방정식을 가지므로, a(x) = 2x, b(x) = 3x이고, A(a,b) = 3a + 5b 라면, A(a(x),b(x)) = 6x + 15x = 11x로 나타낼 수 있다.
결국 a,b,A 세 개의 퍼셉트론을 쌓은 의미를 잃고 하나의 선형 방정식이 되는 것이다. 이를 방지하고 계층을 쌓는 것의 이점을 얻기 위해, a(x)와 b(x)의 결과를 그대로 A에 넘기는 대신, 활성화 함수라는 것을 활용한다.
a(x)와 b(x)의 선형 방정식을 통과한 값에 비선형 함수를 한 번 적용해 줌으로서, 선형성을 상실시키는 것이다.
활성화 함수로 가장 대중적으로 쓰이는 비선형 함수는 시그모이드 함수(Sigmoid)와 ReLU 함수가 있다. 이 글에서는 시그모이드 함수만을 설명하고, 각 활성화 함수간의 비교와 소개는 다른 글에서 자세히 다뤄보겠다.
시그모이드 함수의 식은 아래와 같다.
시그모이드 함수는 지수 함수를 활용하여 기울기가 일정하지 않은 비선형 함수를 그리는데, 그래프는 아래와 같다.
시그모이드 함수는 S자 함수라는 뜻으로, 그 이름처럼 0과 1 사이의 값으로 수렴하는 S자 모양의 그래프를 그리며 값을 비선형화 한다.
이쯤되면 독자들은 위에서 만든 XOR 퍼셉트론이 왜 동작하는지 의문을 가질 것이다. 이는 사실 우리가 배운 퍼셉트론의 초기 모델에서, 임계값을 돌파하면 1, 아니면 0을 출력하는 if 연산이 비선형 연산이기 때문이다.
그러나 이러한 if 스위치 구조의 활성화 구조는 1과 0만을 출력값으로 가지고 그 중간이 없다. 이는 신경망에 기울기가 없음을 나타내고, 컴퓨터로 하여금 문제를 해결할 실마리를 못 찾게 만든다. 이에 대한 자세한 내용은 경사 하강법 파트에서 배우도록 하겠다.
정리
인공신경망에서 뉴런을 구현하기 위해 퍼셉트론이 고안되었다. 퍼셉트론은 n개의 입력에 대해 각각 n개의 대응되는 가중치(weight)를 곱하고 이들을 합한 값이 임계값을 넘으면 1, 넘지 않으면 0을 반환하는 선형 함수이다.
AND, NOT, OR 게이트 등 선형 분리가 가능한 문제를 퍼셉트론으로 해결할 수 있었고, XOR 게이트처럼 선형 분리가 불가능한 문제도 퍼셉트론을 여러 층으로 쌓아서 해결할 수 있었다.
그러나 실제 상황에서, 문제는 XOR 게이트 처럼 간단하지 않고, 입력 또한 1과 0의 이진 값이 아닌 실수 값이 입력되기에 거대한 다층 퍼셉트론을 사람이 수작업으로 설정하는 것은 불가능했다.
다음 글에서는 학자들이 이 문제를 해결한 방법이자 딥러닝의 가장 중요하며 기반이 되는 지식인 경사 하강법과 오차 역전파를 다뤄보도록 하겠다.
활성화 함수도 매우 중요하나, 아직은 시그모이드 함수를 활용한다는 것만 알아두기 바란다.
'강의 > 딥러닝 기초' 카테고리의 다른 글
데이터 일반화 vs 표준화 (Normalization and Standardization of Data) (3) | 2020.04.28 |
---|---|
Convexity와 딥러닝 (Convex Function과 Convex Set) (1) | 2020.04.13 |
경사하강법과 손실 함수: 심층 신경망 학습시키기 (Gradient Descent and Loss Function) (8) | 2020.01.23 |
왜 지금인가? - 딥러닝의 역사 (0) | 2020.01.06 |
나만 알기 아까운 딥러닝 연재 계획 (0) | 2020.01.05 |
댓글
이 글 공유하기
다른 글
-
Convexity와 딥러닝 (Convex Function과 Convex Set)
Convexity와 딥러닝 (Convex Function과 Convex Set)
2020.04.13 -
경사하강법과 손실 함수: 심층 신경망 학습시키기 (Gradient Descent and Loss Function)
경사하강법과 손실 함수: 심층 신경망 학습시키기 (Gradient Descent and Loss Function)
2020.01.23 -
왜 지금인가? - 딥러닝의 역사
왜 지금인가? - 딥러닝의 역사
2020.01.06 -
나만 알기 아까운 딥러닝 연재 계획
나만 알기 아까운 딥러닝 연재 계획
2020.01.05