[밑바닥부터 시작하는 딥러닝] Ch2. 퍼셉트론
1. 퍼셉트론이란
신경망(딥러닝)의 기원이 되는 알고리즘.
다수의 신호를 입력받아 하나의 신호를 출력한다.
퍼셉트론의 신호는 1/0을 가진다.
퍼셉트론의 동작 원리를 수식으로 나타내면 다음과 같다.
퍼세트론은 복수의 입력 신호 각각에 고유한 가중치를 부여한다. 가중치는 각 신호가 결과에 주는 영향력을 좆ㄹ하는 요소로 작용한다. 즉, 가중치가 클수록 해당 신호가 그만큼 더 중요함을 뜻한다.
2. 단순한 논리회로
입력이 x1, x2 이고 출력은 y이다.
입력신호와 출력신호의 대응 표를 진리표라 한다.
3가지의 진리표를 살펴보자.
2_1 AND 게이트
x1 | x2 | y |
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
2_2 NAND 게이트와 OR 게이트
x1 | x2 | y |
0 | 0 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
NAND 게이트의 진리표다.
x1 | x2 | y |
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 1 |
OR 게이트의 진리표다.
사실 중요한 것은 진리표가 아니라 진리표를 만족하는 매개변수의 조합이다.
(w1,w2,θ)의 조합은 무한히 많다.
또한 AND 게이트를 구현하는 매개변수의 부호를 모두 반전하면 NAND게이트가 된다.
어쨋튼 퍼셉트론으로 AND, NAND, OR 논리 회로를 표현할 수 있다.
여기서 중요한 점은 퍼셉트론의 구조가 AND, NAND, OR 게이트 모두에서 똑같다. 세가지 게이트에서 다른 것은 매개변수의 값이다.
3. 퍼셉트론 구현하기
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
print(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))
import numpy as np
x = np.array([0,1])
w = np.array([0.5,0.5])
b = -0.7
print(w*x)
print(np.sum(w*x))
print(np.sum(w*x)+b)
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(w*x) + b
if tmp<=0:
return 0
else:
return 1
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
4. 퍼셉트론의 한계
앞에서는 3개의 게이트를 살펴보았다.
마지막으로 살펴볼 게이트는 바로 XOR게이트다.
x1 | x2 | y |
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
마지막으로 살펴볼 게이트는 바로 XOR게이트다.
XOR게이트는 배타적 논리합이다. 즉, x1과 x2중 한쪽이 1일 때만 1을 출력한다.
퍼셉트론을 시각화했을때 다른 게이트들과 달리 XOR게이트는 선형영역으로 나누어지지 않는다는 특징이 있다.
5. 다층 퍼셉트론이 출동한다면
안타깝게도 퍼셉트론으로는 XOR 게이트를 표현할 수 없었다.
하지만 층을 하나 더 쌓는다면 XOR을 표현할 수 있다고 한다.
기존 게이트를 조합하여 XOR게이트를 만들 수도 있다.
x1 | x2 | s1 | s2 | y |
0 | 0 | 1 | 0 | 0 |
0 | 1 | 1 | 1 | 1 |
1 | 0 | 1 | 1 | 1 |
1 | 1 | 0 | 1 | 0 |
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(w*x) + b
if tmp<=0:
return 0
else:
return 1
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
def XOR(x1,x2):
s1 = NAND(x1,x2)
s2 = OR(x1,x2)
y = AND(s1,s2)
return y
print(XOR(0,0))
print(XOR(0,1))
print(XOR(1,0))
print(XOR(1,1))
6. NAND에서 컴퓨터까지
2층퍼셉트론, 정확히는 비선형인 시그모이드 함수를 활성화 함수로 이용하면 임의의 함수를 표현할 수 있다는 사실이 증명되었다.
퍼셉트론은 층을 거듭 쌓으면 비선형적인 표현도 가능하고 이론상 컴퓨터가 수행하는 처리도 모두 표현할 수 있다.