by 나다경
퍼셉트론이란?
퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력함.
$x1$과 $x2$는 입력 신호, $y$는 출력 신호, $w1$과 $w2$는 가중치를 뜻함.
$$ y = 0 (w1x1 + w2x2) <= theta $$ $$ y = 1 (w1x1 + w2x2) > theta $$
AND 게이트 입력이 모두 1일 때만 1을 출력하고, 그 외에는 0을 출력함.
NAND 게이트 Not AND를 뜻하며, AND 게이트의 출력을 뒤집은 것임. AND 게이트를 구현하는 매개변수의 부호를 모두 반전하기만 하면 NAND 게이트가 됨.
OR 게이트 입력 신호 중 하나 이상이 1이면 출력이 1이 되는 논리 회로임.
퍼셉트론의 구조는 AND, NAND, OR 게이트 모두에서 똑같음
세 가지 게이트에서 다른 것은 매개변수의 값 뿐임.
간단한 구현
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)) # 0
print(And(1,0)) # 0
print(And(0,1)) # 0
print(And(1,1)) # 0
가중치와 편향 도입
$b$를 편향이라고 함
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
가중치와 편향 구현하기
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
$-theta$가 편향 $b$로 치환됨.
$w1$과 $w2$는 각 입력 신호가 결과에 주는 영향력(중요도)을 조절하는 매개변수이고,
편향은 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력)하느냐를 조정하는 매개변수임.
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5]) # AND와는 가중치(w와 b)만 다름
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]) # AND와는 가중치(w와 b)만 다름
b = -0.2
tmp = np.sum(x*w) + b
if tmp <= 0:
return 0
else:
return 1
XOR 게이트 배타적 논리합임.
$x1$과 $x2$ 중 한쪽이 1일 때만 1을 출력함.
BUT 단일 퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계가 있음.
XOR 게이트는 AND, NAND, OR 게이트를 조합하는 방법으로 만들 수 있음.
plt.figure(figsize=(20,15))
plt.plot(x, (g1(x)-f)**2, lw=3, label='$B_1(x)$')
plt.plot(x, (g20(x)-f)**2, lw=3, label='$B_{20}(x)$');
plt.xlabel('$x$')
plt.ylabel('population error')
plt.yscale('log')
plt.legend(loc=4)
plt.title('Bias')
XOR 게이트 구현하기
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
print(XOR(0,0)) # 0
print(XOR(1,0)) # 1
print(XOR(0,1)) # 1
print(XOR(1,1)) # 0
단층 퍼셉트론으로는 표현하지 못한 것을 층을 늘려 구현할 수 있음.