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
출력결과
AND(0, 0) # 0이 출력
AND(1, 0) # 0이 출력
AND(0, 1) # 0이 출력
AND(1, 1) # 1이 출력
퍼셉트론은 입력 신호에 가중치를 곱한 값과 편향을 합하여, 그 값이 0을 넘으면 1을 출력하고 그렇지 않으면 0을 출력한다.
import numpy as np
x = np.array([0, 1]) # 입력
w = np.array([0.5, 0.5]) # 가중치
b = -0.7 # 편향
w*x
결과: array([0. , 0.5])
np.sum(w*x)
결과: 0.5
np.sum(w*x)+b
결과: -1.9999999999999996 # 약 -0.2
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
여기에서 가 편향 b로 치환됨.(2.3.1에서 구현한 theta가 -b가 됨.)
편향은 가중치 w1, w2와 기능이 다르다는 사실에 주의.
가중치 w1, w2는 각 입력 신호가 결과에 주는 영행력(중요도)를 조절하는 매개변수이지만,
편향은 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력)하느냐를 조정하는 매개변수인 셈.
편향의 값은 뉴런이 얼마나 쉽게 활성화되는지를 결정.
b = -0.1이면 각 입력 신호에 가중치를 곱한 값들의 합이 0.1을 초과할 때만 뉴런 활성화 O
b = -20.0이면 각 입력 신호에 가중치를 곱한 값들의 합이 20.0을 넘지않으면 뉴런 활성화 X
책에서 문맥에 따라 w1, w2, b를 가중치라고 할때도 있음.
노트
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5]) # AND와는 가중치(w, b)만 다르다.
b = 0.7
tmp = 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 = sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
해당 페셉트론은 직선으로 나뉜 두 영역을 생성. 직선으로 나뉜 한쪽 영역은 1을 출력하고 다른 한쪽은 0을 출력함.
퍼셉트론의 시각화: 회색영역은 0을 출력하는 영역, 전체 영역은 OR 게이트의 성질을 만족
OR 게이트는 (x1, x2) = (0, 0)일 때, 0을 출력, (0,1), (1,0), (1,1)일 때, 1을 출력
위 그래프에서 0은 원, 1은 삼각형으로 표시. OR 게이트를 만들려면 원과 삼각형을 직선으로 나눠야 하는데 그래프의 직선은 네 점을 잘 나누고 있음.
XOR 게이트. 원과 삼각형은 XOR 게이트의 출력을 나타냄.
하나의 직선으로 나누기란 불가능.
노트
단층 퍼셉트론으로는 비선형 영역을 분리할 수 없기에 퍼셉트론 게이트를 조합하여, 즉 층을 쌓아서 XOR 게이트를 구현하게 될 것임.
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
출력결과
XOR(0, 0) # 0을 출력
XOR(1, 0) # 1을 출력
XOR(0, 1) # 1을 출력
XOR(1, 1) # 0을 출력
노트
위 그림의 퍼셉트론은 모두 3층으로 구성됨. 가중치를 갖는 층은 사실 2개(0층과 1층 사이, 1층과 2층 사이)뿐이라서 우리는 '2층 퍼셉트론'이라고 부르기로 함. 문헌에 따라 3층 퍼셉트론이라고 하기도 함.
위 2층 퍼셉트론의 동작은 다음과 같음.
- 0층의 두 뉴런이 입력 신호를 받아 1층의 뉴런으로 신호를 보낸다.
- 1층의 뉴런이 2층의 뉴런으로 신호를 보내고, 2층의 뉴런은 y를 출력한다.
2층 구조를 사용해 퍼셉트론으로 XOR 게이트를 구현. = 단층 퍼셉트론으로 표현하지 못한 것을 층을 하나 늘려 구현.
노트
"NAND 게이트 조합만으로 컴퓨터를 만든다"라는 말이 궁금한 분은 'the elements of computer systems building a modern computer from first principles'를 참고.