2.3.1 간단한 구현부터
AND 게이트 구현
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
1행에서 매개변수 w1, w2, theta는 함수 안에서 초기화하고,
가중치를 곱한 입력의 총합(tmp)이 임계값을 넘으면 1, 그 외에는 0을 반환합니다.
아래 코드를 실행하면 주석과 같은 결과가 출력됩니다.
AND(0, 0) # 0을 출력
AND(1, 0) # 0을 출력
AND(0, 1) # 0을 출력
AND(1, 1) # 1을 출력
2.3.2 가중치와 편향 도입
위의 코드를 조금 더 직관적으로 수정해봅시다.
theta 를 -b로 치환하면 퍼셉트론의 동작이 아래의 식처럼 됩니다.
y = $\left\{\begin{matrix}
0 (b + w_{1}x_{1} + w_{2}x_{2} \leq 0)\\
1 (b + w_{1}x_{1} + w_{2}x_{2} > 0)
\end{matrix}\right.$
여기서 b를 편향(bias)이라하며 w_{1}과 w_{2}는 그대로 가중치입니다.
위 식의 관점에서 해석해보자면, 퍼셉트론은 입력 신호에 가중치를 곱한 값과 편향을 합하여, 그 값이 0을 넘으면 1을 출력하고, 그 외엔 0을 출력합니다.
2.3.3 가중치와 편향 구현하기
가중치와 편향을 도입 한 AND 게이트는 다음과 같이 구현할 수 있습니다.
(* 위에서 구현한 AND게이트에서의 theta를 아래 코드에선 -b로 바꾸었습니다)
from 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
w1, w2는 각 입력 신호가 결과에 주는 영향력(중요도)을 조절하는 매개변수이고,
편향은 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력)하느냐를 조정하는 매개변수입니다.
예를 들어 b가 -0.1이면 각 입력 신호에 가중치를 곱한 값들의 합이 0.1만 초과해도 뉴런이 활성화됩니다.
반면 b가 -20.0이면 각 입력 신호에 가중치를 곱한 값들의 합이 20.0을 넘어야 뉴런이 활성화됩니다.
* 편향이라는 용어는 '한쪽으로 치우쳐 균형을 깬다'라는 의미를 담고 있습니다. 실제로 위에서 두 입력(x1, x2)이 0이어도 결과로 (0이 아닌) 편향 값을 출력합니다.
NAND게이트와 OR게이트도 구현해봅시다.
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
it 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(w*x) + b
it tmp <= 0:
return 0
else:
return 1
결론
앞 절에서 AND, NAND, OR는 모두 같은 구조의 퍼셉트론이고, 차이는 가중치 매개변수의 값뿐이라 했습니다.
실제로 파이썬으로 작성한 NAND, OR게이트의 코드에서도 AND와 다른 부분은 가중치(w)와 편향 값(b)을 설정하는 부분뿐입니다.
'AI > 밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글
[밑바닥부터 시작하는 딥러닝1] 3장 신경망 - 퍼셉트론에서 신경망으로 (0) | 2021.08.19 |
---|---|
[밑바닥부터 시작하는 딥러닝1] 2장 퍼셉트론 - NAND에서 컴퓨터까지 (0) | 2021.08.17 |
[밑바닥부터 시작하는 딥러닝1] 2장 퍼셉트론 - 퍼셉트론의 한계 (0) | 2021.08.17 |
[밑바닥부터 시작하는 딥러닝1] 2장 퍼셉트론 - 단순한 논리 회로 (0) | 2021.08.06 |
[밑바닥부터 시작하는 딥러닝1] 2장 퍼셉트론 - 퍼셉트론이란? (0) | 2021.08.06 |