x1, x2 : 입력 신호
y : 출력 신호
w1, w2 : 가중치
뉴런에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력
그 한계는 임계값이라고 하며, θ 기호(theta; 세타)로 나타낸다.
위 그림의 동작을 수식으로 나타내면 다음과 같다.
퍼셉트론은 복수의 입력 신호에 각각 고유한 가중치를 부여
이 가중치는 각 신호의 결과에 주는 영향력을 조절하는 요소로 작용한다.
→ 가중치가 클 수록 중요도 🆙
x1 | x2 | y |
---|---|---|
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
AND gate를 퍼셉트론으로 표현하기
-> w1, w2, θ 의 값 정해야 함.
위의 진리표를 만족하는 조합은 다양하다
ex) (0.5, 0.5, 0.7) (0.5, 0.5, 0.8) (1.0, 1.0, 1.0) etc.
x1 | x2 | y |
---|---|---|
0 | 0 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
NAND gate는 Not AND를 의미한다.
위의 진리표를 만족하는 조합은 (-0.5, -0.5, -0.7)과 같은 조합이 있다.
x1 | x2 | y |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 1 |
OR gate의 진리표는 위와 같다.
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
위에서 살펴본 진리표를 만족하는 가중치와 임계값 조합을 하나 선택하여 코드를 작성
θ를 -b로 치환하면 다음과 같이 식을 바꿀 수 있다.
식은 이전에 계산한 것과 동치!
여기서 b를 편향(bias)라고 한다.
import numpy as np
def AND(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.7
tmp = np.sum(x*w) + b
if tmp <= 0:
return 0
else:
return 1
w1, w2 → 각 입력 신호가 결과에 주는 영향력(중요도)
b(편향) → 뉴런이 얼마나 쉽게 활성화하느냐를 조정하는 매개변수
import numpy as np
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5])
b = 0.7
tmp = b + np.sum(x*w)
if (tmp > 0):
return 1
else:
return 0
AND gate의 구현과는 가중치(w와 b)만 다르다
import numpy as np
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.3
tmp = np.sum(x*w) + b
if (tmp <= 0):
return 0
else:
return 1
XOR gate를 살펴보자.
x1 | x2 | y |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
이제까지의 방식으로는 위 진리표를 만족시키는 가중치를 정할 수 없다.
그 이유는 다음의 그림을 통해 알 수 있다.
위의 그림은 XOR 게이트의 출력을 나타낸 것이다.
Perceptron은 기본적으로 수식의 형태가 직선이다.
위의 식을 살펴보면 상수 w1, w2, θ에 어떤 값을 대입했을 때,
x1과 x2를 축으로 하는 좌표에서 직선을 기준으로 영역이 나뉨을 알 수 있다.
따라서 XOR gate를 퍼셉트론으로 표현하기 위해서는 위의 좌표에서의 결과 값을 직선으로 나눌 수 있어야 한다.
위의 그림에서 알 수 있듯이 🔴과 🔺를 직선 하나로는 나누는 방법은 불가능하다.
하지만 '직선'이라는 제약을 없앤다면 가능하다.
위와 같은 곡선의 영역을 비선형 영역, 직선의 영역을 선형 영역이라고 한다.
XOR gate는 퍼셉트론에 '층을 쌓은' 다층 퍼셉트론으로 구현이 가능하다.
기본적으로 XOR gate는 AND, NAND, OR gate를 조합하여 만들 수 있다.
위의 로직이 실제로 일치하는지는 진리표를 통해 확인해볼 수 있다.
x1 | x2 | s1 | s2 | y |
---|---|---|---|---|
0 | 0 | 1 | 0 | 0 |
1 | 0 | 1 | 1 | 1 |
0 | 1 | 1 | 1 | 1 |
1 | 1 | 0 | 1 | 0 |
위의 진리표를 바탕으로 이전 gate들과 같이 XOR gate를 구현해보자
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
XOR은 다층 구조의 네트워크이다.
단층 퍼셉트론으로는 표현할 수 없던 것을 층을 늘려 구현할 수 있다.
퍼셉트론은 층을 쌓아(깊게 하여) 더 다양한 것들을 표현할 수도 있다.
다층 퍼셉트론은 심지어 이론상으로는 컴퓨터도 표현할 수 있다!