퍼셉트론이란?
업데이트:
2. 퍼셉트론
신경망의 기원이 되는 알고리즘인 퍼셉트론을 배워보자.
2.1 퍼셉트론이란?
-
다수의 신호를 받아 하나의 신호를 출력. (0, 1)
\(y=\begin{cases} 0\,(w_1x_1 + w_2x_2 \leq \theta) \\ 1\, (w_1x_1+w_2x_2>\theta) \end{cases}\)
- $\theta$는 임계값
2.2 단순한 논리 회로
2.2.1 AND 게이트
- 모두 1일 때 1 출력
-
AND 게이트 진리표
- 위를 만족하는 매개변수 조합의 예
- $(w_1, w_2, \theta)$
- $(0.5, 0.5, 0.7)$
- $(0.5, 0.5, 0.8)$
- $(0.8, 0.9, 1.0)$
- $(w_1, w_2, \theta)$
2.2.2 NAND 게이트와 OR 게이트
- NAND = Not AND
- AND 게이트의 출력을 뒤집은 것
- 모두 0일 때 1을 출력
-
NAND 진리표
- 위를 만족하는 매개변수 조합의 예
- $(w_1, w_2, \theta)$
- $(-0.5, -0.5, -0.7)$
- AND게이트를 구현하는 매개변수의 부호를 모두 반대로 반전하면 NAND 게이트가 됨
- $(w_1, w_2, \theta)$
- OR 게이트
- 입력 신호 중 하나 이상이 1이면 출력이 1이 되는 논리 회로
-
OR 진리표
- 위를 만족하는 매개변수 조합의 예
- $(w_1, w_2, \theta)$
- (0.5, 0.4, 0.2)
- (0.7, 1.0, 0.6)
- $(w_1, w_2, \theta)$
퍼셉트론의 구조는 AND, NAND, OR 게이트에서 모두 똑같음. 바뀌는 것은 매개변수(가중치, 임계값)의 값 뿐임.
2.3 퍼셉트론 구현하기
def AND(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.7
tmp = x1*w1 + x2*w2
return (0 if tmp <= theta else 1)
2.3.2 가중치와 편향 도입
- 위의 AND 게이트는 직관적이지만, 다른 방식으로 수정해보자.
- 앞선 식에서 $\theta$를 $-b$로 치환하면 식이 아래처럼 된다.
- $y=\begin{cases} 0\,(b+w_1x_1 + w_2x_2\leq 0) \ 1\, (b+w_1x_1+w_2x_2>0) \end{cases}$
- $b$를 편향(bias)라고 한다. ($w$는 그대로 가중치(weight)
- 위 식에 의하면, 퍼셉트론은
- 1) 입력 신호에 가중치를 곱한 후,
- 2) 편향을 합한다.
- 3-1) 그 값이 0을 넘으면 1을 출력하고,
- 3-2) 그 값이 그렇지 않으면 0을 출력한다.
- 위 식에 의하면, 퍼셉트론은
- numpy로 가중치, 편향 구현하기
import numpy as np
x = np.array([0, 1]) # 입력값
w = np.array([0.5, 0.5]) # 가중치
b = -0.7 # 편향
np.sum(w*x)+b # -0.19999999999999996 (대략 -0.2, 부동소수점 수에 의한 연산 오차)
2.3.3 가중치와 편향 구현하기
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
return (0 if tmp <= 0 else 1)
- 가중치 $w_1, w_2$
- 각 입력 신호가 결과에 주는 영향력(중요도)를 조절하는 매개변수
- 편향 $b$
- 뉴런이 얼마나 쉽게 활성화하느냐를 조정하는 매개변수
- 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
return 0 if tmp <= 0 else 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
return 0 if tmp <= 0 else 1
2.4 퍼셉트론의 한계
- AND, NAND, OR은 구현 가능했다, 하지만 XOR 게이트도 구현이 가능할까?
2.4.1 XOR게이트
- 배타적 논리합
- $x_1$과 $x_2$중 한쪽이 1일 때만 1을 출력
-
XOR 진리표
- 지금까지의 퍼셉트론으로는 XOR 게이트를 구현할 수 없는데, 이를 시각적으로 살펴보자.
-
먼저 OR 게이트를 구현한 퍼셉트론을 시각적으로 나타내면,
- 위처럼 직선으로 나뉜 두 영역을 만들어낸다.
- AND일 떄에도 직선으로 영역을 구분해낼 수 있다.
-
그럼, XOR 게이트의 출력을 살펴보자.
- 위의 그래프에서 삼각형과 원을 나누는 직선은 존재하지 않는다.
2.4.2 선형과 비선형
- 위의 그래프에서 삼각형과 원을 어떻게 나눌 수 있을까?
-
나누는 영역이 꼭 직선일 필요는 없다. 곡선을 그어 영역을 나눠보자.
- 요렇게 나눌 수 있다!
- 곡선의 영역을 비선형 영역, 직선의 영역을 선형 영역 이라고도 한다.
- 퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계가 있다.
2.5 다층 퍼셉트론이 충돌한다면
- 하나의 퍼셉트론으로는 (그래프에서 하나의 직선으로는) XOR 게이트를 표현할 수 없지만,
- 사실 퍼셉트론은 ‘층을 쌓아’ 다층 퍼셉트론을 만들 수 있다는 것에 그 의의가 있다.
- 층을 하나 더 쌓아서 XOR게이트를 표현해보자.
2.5.1 기존 게이트 조합하기
-
[참고] AND, NAND, OR 게이트 기호
-
위의 세 게이트를 어떻게 조합해야 XOR게이트를 만들 수 있을까?
- 위와 같이 각 게이트를 대입하면, XOR 게이트가 만들어진다.
- 진리표를 살펴보면 이해가 쉽다.
-
XOR 게이트 진리표
2.5.2 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을 뉴런을 이용한 퍼셉트론으로 표현하면 아래와 같다.
- 맨 처음의 퍼셉트론과는 모양이 다르다.
- AND, OR가 단층 퍼셉트론이라면, XOR은 다층(2층) 퍼셉트론이다.
- 경우에 따라서는 위 퍼셉트론을 3층 퍼셉트론이라고도 불릴 수 있는데,
- 2층 퍼셉트론: 가중치를 갖는 층
- 3층 퍼셉트론: 구성된 층의 수
- 일단 이 책에선 가중치를 갖는 층을 기준으로 층 수를 부른다.
- 다층 퍼셉트론은, 단층 퍼셉트론으로는 표현하지 못하던 것을 층을 하나 늘려 구현할 수 있게 된다.
- 이처럼 층을 쌓는 것들 통해(깊게 하여) 더 다양한 것들을 표현해낼 수 있다.
요약
- 퍼셉트론은 입출력을 가진 알고리즘이며, 입력을 주면 정해진 규칙에 따라 값을 출력
- 퍼셉트론에서는 가중치($w$)와 편향($b$)을 매개변수로 설정
- 단층 퍼셉트론으로 AND, OR 게이트 등의 논리 회로를 구현 가능하며,
- (선형 영역 표현 가능)
- 다층 퍼셉트론으로는 XOR 게이트도 표현할 수 있다.
- (비선형 영역 표현 가능)
댓글남기기