Deep Learning from Scratch - Perceptron
Perceptron
perceptron은 다수의 신호를 입력받아 하나의 신호를 출력한다.
x1과 x2는 입력신호, y는 출력신호, w1과 w2는 가중치를 뜻한다. 그림의 원을 뉴런 혹은 노드라고 부르며, 입력 신호가 뉴런에 보내질 때는 각 고유한 가중치가 곱해진다. 뉴런에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력하며, 그 한계값을 임계값($\theta$)이라고 한다.
Perceptron 구현
def AND(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.7
temp = x1*w1 + x2*w2
if temp <= theta:
return 0
elif temp > theta:
return 1
print(AND(0, 0), AND(1, 0), AND(0, 1), AND(1, 1))
0 0 0 1
가중치와 편향 도입
여기에서 $b$를 bias, $w_{1}$과 $w_{2}$는 weight이다.
x = np.array([0, 1])
w = np.array([.5, .5])
b = -0.7
np.sum(w*x)
0.5
np.sum(w*x) + b
-0.19999999999999996
가중치와 편향 구현
def AND(x1, x2):
x = np.array([x1, x2])
w = np.array([.5, .5])
b = -0.7
temp = np.sum(w*x) + b
if temp <= 0:
return 0
else:
return 1
NAND, OR
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5])
b = 0.7
temp = np.sum(w*x) + b
if temp <= 0:
return 0
else:
return 1
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([.5, .5,])
b = -0.2
temp = np.sum(w*x) + b
if temp <= 0:
return 0
else:
return 1
print(NAND(0, 1), NAND(1, 1), OR(1, 0), OR(0, 0))
1 0 1 0
Perceptron 한계
XOR Gate
XOR의 경우 Perceptron으로 구현할 수 없다. 아래 그래프를 직선으로 나눌 수 없다.
Multi-layer Perceptron
기존 Gate 조합하기
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
print(XOR(0,0), XOR(1,0), XOR(0,1), XOR(1,1))
0 1 1 0
XOR를 뉴런을 이용한 Perceptron으로 표현하면
이처럼 층이 여러개인 Perceptron을 Multi-layer Perceptron이라고 한다.
참고 : 사이토 고키, 『DeepLearning from Scratch』, 한빛미디어(2020), p47-62