728x90

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)을 설정하는 부분뿐입니다.

728x90