신경망을 이루는 가장 기본 단위인 퍼셉트론 (Perceptron)
다수의 신호를 입력으로 받아 하나의 신호를 출력한다.
입력 신호가 모두 1이어야 1을 출력, 그 외에는 0을 출력한다.
# w1, w2는 가중치(weight)를 의미하는 변수입니다.
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)) #1을 출력
NAND는 Not And를 의미하며, AND GATE의 출력을 뒤집은 것이다.
def NAND(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.7
tmp = x1*w1 + x2*w2
if tmp <= theta:
return 1 ## only change here
elif tmp > theta:
return 0 ## only change here
print(NAND(0, 0))
print(NAND(0, 1))
print(NAND(1, 0))
print(NAND(1, 1))
입력 신호가 하나만 1이어도 1을 출력한다.
def OR(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.3 ## only change here
tmp = x1*w1 + x2*w2
if tmp <= theta:
return 0
elif tmp > theta:
return 1
print(OR(0, 0))
print(OR(0, 1))
print(OR(1, 0))
print(OR(1, 1))
XOR GATE(배타적 논리합)을 표현할 수 없다.
A | B | OUTPUT |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
퍼셉트론은 직선으로 나뉜 두 영역을 만드는데, 직선 하나로는 XOR을 표현할 수 있는 방법이 없다.
즉, 퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있는 한계가 있다.
AND, NAND, OR 게이트를 적절히 조합하면 XOR을 완성할 수 있다.
위의 단층 퍼셉트론을 조합하여, 즉 층을 쌓아서 XOR GATE를 구현할 수 있다.
위 이미지를 코드로 구현해보면,
def XOR(x1, x2):
return AND(NAND(x1, x2), OR(x1, x2))
이렇게 층이 여러 개인 퍼셉트론을 다층 퍼셉트론(multi-layer perceptron) 이라고 한다.
Reference : 모두의 딥러닝, 밑바닥부터 시작하는 딥러닝