2.1. 퍼셉트론이란?
퍼셉트론은 프랑크 로젠블라트(Frank Fosenblatt)가 1957년에 고안한 알고리즘이다.
신경망(딥러닝)의 기원이 되는 알고리즘이기 때문에 퍼셉트론의 구조를 배우는 것은 신경망과 딥러닝으로 나아가는 데 중요한 아이디어를 배우는 일이기도 하다.
지금 기술하는 퍼셉트론은 정확히 말하는 '인공 뉴런' 혹은 '단순 퍼셉트론'을 지칭한다.
퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력한다.
퍼셉트론 신호는 '흐른다/안 흐른다(1이나 0)'의 두 가지 값을 가질 수 있다.
위의 그림은 입력으로 2개의 신호를 받은 퍼셉트론의 예다.
x1과 x2는 입력 신호, y는 출력 신호, w1과 w2는 가중치를 뜻한다(w는 weight의 머리글자).
그림의 원을 뉴런 혹은 노드라고 부른다. 입력 신호가 뉴런에 보내질 때는 각각 고유한 가중치가 곱해진다(w1x1, w2x2).
뉴런에서 보내온 신호의 총합이 정해진 한계(θ, 임계값)를 넘어설 때만 1을 출력한다. 이를 '뉴런이 활성화한다'라고 표현하기도 한다.
퍼셉트론의 동작 원리는 이게 전부다.
복수의 입력 신호 각각에 고유한 가중치를 부여하고, 가중치는 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용한다. 즉, 가중치가 클수록 해당 신호가 그만큼 더 중요하다.
2.2. 단순한 논리 회로
2.2.1. AND 게이트
입력 신호와 출력 신호의 대응표를 진리표라고 한다.
AND 게이트 진리표는 두 입력이 모두 1일 때만 1을 출력하고, 그 외에는 0을 출력한다.
AND 게이트를 퍼셉트론으로 표현하기 위해서는 진리표대로 작동하도록 하는 (w1, w2, θ) 의 값을 정하는 것이다.
(w1, w2, θ)쌍의 예 : (0.5, 0.5, 0.7), (1.0, 1.0, 1.0), ...
2.2.2. NAND 게이트와 OR 게이트
NAND는 Not AND를 의미하며, 그 동작은 AND 게이트의 출력을 뒤집은 것이 된다.
AND 게이트의 매개변수 부호를 모두 반전하면 된다.
(w1, w2, θ)쌍의 예 : (-0.5, -0.5, -0.7), ...
OR 게이트는 입력 신호 중 하나 이상이 1이면 출력이 1이 되는 논리 회로다.
퍼셉트론의 구조는 AND, NAND, OR 게이트 모두에서 똑같다. 세 가지 게이트에서 다른 것은 매개변수(가중치와 임계값)의 값뿐이다.
퍼셉트론의 매개변수 값을 정하는 것은 컴퓨터가 아니라 인간이 한다. 인간이 직접 진리표라는 '학습 데이터'를 보면서 매개변수의 값을 생각하다.
기계학습 문제는 이 매개변수의 값을 정하는 작업을 컴퓨터가 자동으로 하게 한다. 학습이란 적절한 매개변수 값을 정하는 작업이며, 사람은 퍼셉트론의 구조(모델)을 고민하고 컴퓨터에 학습할 데이터를 주는 일을 한다.
2.3. 퍼셉트론 구현하기
2.3.1. 간단한 구현부터
논리회로를 파이썬으로 구현해본다.
#x1과 x2를 인수로 받는 AND 함수
def AND(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.7 #매개변수 초기화
tmp = x1*w1 + x2*w2
if tmp <= theta:
return 0
elif tmp > theta:
return 1
AND(0,0) #0을 출력
AND(0,1) #0을 출력
AND(1,0) #0을 출력
AND(1,1) #1을 출력
2.3.2. 가중치와 편향 도입
처음의 퍼셉트론 식과 의미는 같다. b는 편향(bias)이다.
편향은 '한쪽으로 치우쳐 균형을 깬다'라는 의미를 담고 있다. 두 입력이 모두 0이어도 결과로 0이 아닌 편향 값을 출력한다.
위의 퍼셉트론 식은 입력 신호에 가중치를 곱한 값과 편향을 합하여, 그 값이 0을 넘으면 1을 출력하고 그렇지 않으면 0을 출력한다.
넘파이를 사용해서 식을 구현해보겠다.
import numpy as np
x = np.array([0, 1]) #입력
w = np.array([0.5, 0.5]) #가중치
b = -0.7 #편향
print(w*x) #[0. 0.5]
print(np.sum(w*x)) #0.5
print(np.sum(w*x) +b ) #-0.19999999999999996
넘파이 배열끼리의 곱셈은 두 배열의 원소 수가 같다면 각 원소끼리 곱한다([0, 1] * [0.5, 0.5] => [0, 0.5]).
np.sum() 메서드는 입력한 배열에 담긴 모든 원소의 총합을 계산한다.
이 가중치에 편향을 더하면 계산이 완료된다.
2.3.3. 가중치와 편향 구현하기
가중치와 편향을 도입한 AND 게이트는 아래와 같이 구현할 수 있다.
#가중치와 편향을 도입한 AND 게이트
def AND(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.7
tmp = np.sum(w*x) +b
if tmp <= 0:
return 0
else:
return 1
편향은 가중치 w1, w2와 기능이 다르다는 사실에 주의해야 한다.
w1, w2는 각 입력 신호가 결과에 주는 영향력(중요도)을 조절하는 매개변수고,
편향은 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력)하느냐를 조정하는 매개변수다.
b가 -0.7이면 각 입력 신호에 가중치를 곱한 값들의 합이 0.7은 넘어야 뉴런이 활성화 한다.
이어서 NAND 게이트와 OR 게이트를 구현해본다.
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5])
b = 0.7
tmp = np.sum(w*x) +b
if tmp <= 0:
return 0
else:
return 1
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0,5])
b = -0.2
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
NAND 함수는 AND 함수와 w와 b만 다르다.
AND, NAND, OR는 같은 구조의 퍼셉트론이고, 차이는 가중치와 편향 값 설정만 다르다.
2.4. 퍼셉트론의 한계
2.4.1. XOR 게이트
XOR 게이트는 배타적 논리합이라는 논리 회로다.
x1, x2 중 한쪽이 1일 때만 1을 출력한다('배타적'=자기 외에는 거부).
지금까지의 퍼셉트론으로는 XOR 게이트를 설명할 수 없다.
OR 게이트는, 예를 들어 가중치 매개변수가 (b, w1, w2) = (-0.5, 1.0, 1.0)일 때 해당될 수 있다.
이때의 퍼셉트론은 아래의 식으로 표현된다.
왼쪽 어두운 영역은 0을 출력하는 영역이며, 오른쪽 밝은 영역은 OR 게이트의 성질을 만족한다.
OR 게이트를 만들려면 ○과 △를 직선으로 나눠야 한다.
위의 식이라면 (0,1), (1,0), (1,1)이 만족하지만, XOR 게이트라면 (0,1), (1,0)이 만족한다.
따라서 XOR 게이트의 경우는 ○과 △을 직선 하나로 나눌 수 없다.
2.4.2. 선형과 비선형
'직선'이라는 제약을 없앤다면 어떨까. 곡선이라면 ○과 △을 나눌 수 있다.
퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계가 있다. 즉 곡선은 표현할 수 없다.
위와 같은 그림에서 곡선의 영역을 비선형 영역, 직선의 영역을 선형 영역이라고 한다.
기계학습 분야에서 자주 쓰이는 용어다.
2.5. 다층 퍼셉트론이 출동한다면
퍼셉트론으로는 XOR 게이트를 표현할 수 없지만, 다층 퍼셉트론(multi-layer perceptron)을 만들 수 있다.
단층 퍼셉트론은 직선형 영역만 표현할 수 있고, 다층 퍼셉트론은 비선형 영역도 표현할 수 있다.
층을 하나 더 쌓아 XOR을 표현해볼 것이다.
2.5.1. 기존 게이트 조합하기
XOR 게이트를 만드는 방법은 다양하지만 그중 하나는 AND, NAND, OR 게이트를 조합하는 방법이다.
아래는 게이트 기호인데, NAND 게이트 출력부에 있는 ○기호는 '출력을 반전한다'는 뜻이다.
세 가지의 게이트 조합으로 XOR을 완성하면 다음과 같다.
x1과 x2가 입력신호, y가 출력 신호다. x1과 x2는 NAND와 OR 게이트의 입력이 되고, NAND와 OR의 출력이 AND 게이트의 입력으로 이어진다.
NAND의 출력을 s1, OR의 출력을 s2로 해서 진리표를 만들면 위처럼 된다.
x1, x2, y에 주목하면 XOR의 출력과 같다.
2.5.2. XOR 게이트 구현하기
XOR 게이트를 파이썬으로 구현해보겠다.
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
XOR(0, 0) #0을 출력
XOR(1, 0) #1을 출력
XOR(0, 1) #1을 출력
XOR(1, 1) #0을 출력
XOR는 아래와 같은 다층 구조의 네트워크다.
XOR는 2층 퍼셉트론이다. 이처럼 층이 여러 개인 퍼셉트론을 다층 퍼셉트론이라 한다.
사진에서 보면 모두 3층으로 구성되지만, 가중치를 갖는 층은 사실 2개(0층과 1층 사이, 1층과 2층 사이)뿐이니 '2층 퍼셉트론'이다.
퍼셉트론은 층을 쌓아(깊게 하여) 더 다양한 것을 표현할 수 있다.
<참고 문헌>
사이토 고키(2019), 『밑바닥부터 시작하는 딥러닝』, 한빛미디어, pp.47-62.
'Study > 책『밑바닥부터 시작하는 딥러닝』' 카테고리의 다른 글
4-2. 신경망 학습 (0) | 2020.03.25 |
---|---|
4-1. 신경망 학습 (0) | 2020.03.16 |
3-2. 신경망 (0) | 2020.03.09 |
보충) numpy 행렬의 형상 차이 - (N,) (N,1)(1,N) (0) | 2020.03.08 |
3-1. 신경망 (0) | 2020.03.07 |
댓글