1. 간단한 구현

x1 과 x2 를 인수로 받는 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
print(AND(0,0))
print(AND(1,0))
print(AND(0,1))
print(AND(1,1))
[실행 결과]
0
0
0
1

매개변수 w1, w2, theta 는 함수 안에서 초기화하고, 가중치를 곱한 입력의 총합이 임계값(theta)을 넘으면 1을 반환하고 그 외에는 0을 반환한다.

 

2. 가중치와 편향 도입

기존의 입력이 2개인 퍼셉트론의 수식에서 $\theta$ 를 $-b$ 로 치환하면 아래와 같은 수식이 나온다.

치환한 퍼셉트론 수식

위 수식에서 $b$ 를 편향(bias) 이라고 하고, $w_1$ 과 $w_2$ 는 그대로 가중치이다. 위 수식을 해석해보자면 퍼셉트론은 입력 신호에 가중치를 곱한 값과 편향을 합하여, 그 값이 0을 넘으면 1을 출력하고 그렇지 않으면 0을 출력한다.

import numpy as np
x = np.array([0,1]) #입력
w = np.array([0.5, 0.5]) #가중치
b = -0.7 #편향
print(w*x)
print(np.sum(w*x))
print(np.sum(w*x)+b)
[실행 결과]
[0.  0.5]
0.5
-0.19999999999999996 #대략 -0.2(부동소수점에 의한 연산 오차)

넘파이 배열끼리의 곱셈은 두 배열의 원소 수가 같다면 같은 인덱스의 원소끼리 곱한다. np.sum() 메소드는 곱한 값이 담긴 배열의 모든 원소의 총합을 계산한다. 그리고 이 값(가중치, 입력이 0, 1이기 때문에 가중치의 값이 얼마가 됐든 w*x 의 합은 w의 가중치 값과 같게 나온다)에 편향을 더하게 된다.

 

3. 가중치와 편향 구현하기

가중치와 편향을 도입한 AND 게이트의 구현

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
print(AND(0,0))
print(AND(1,0))
print(AND(0,1))
print(AND(1,1))    
[실행 결과]
0
0
0
1

앞서 구현한 x1 과 x2 를 인수로 받는 AND 함수에서의 theta 가 $-b$ 가 되었다. 편향은 가중치 $w_1$, $w_2$ 와 기능이 다르다. $w_1$, $w_2$ 는 각 입력 신호가 결과에 주는 영향력(중요도)을 조절하는 매개변수이고, 편향은 뉴련이 얼마나 쉽게 활성화(결과로 1을 출력)하느냐를 조정하는 매개변수이다.

예를 들어 $b$ 가 -0.1 이면 각 입력 신호에 가중치를 곱한 값들의 합이 0.1을 초과할 때만 뉴런이 활성화되고, 그렇지 않으면 활성화되지 않는다. 

이처럼 편향의 값은 뉴런이 얼마나 쉽게 활성화되는지를 결정한다.

편향의 의미는 '한쪽으로 치우쳐 균형을 깬다' 는 것이다. 실제로 위에서 $\theta$ 를 $-b$ 로 치환한 수식을 보면 두 입력이 모두 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
    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(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1
print(NAND(0,0))
print(NAND(1,0))
print(NAND(0,1))
print(NAND(1,1))
print(OR(0,0))
print(OR(1,0))
print(OR(0,1))
print(OR(1,1))
[실행 결과]
1
1
1
0
0
1
1
1

AND, NAND, OR 는 모두 같은 구조의 퍼셉트론이고, 차이는 가중치 매개변수의 값 뿐이다. 코드에서도 가중치와 편향 값을 설정하는 부분 뿐이다.

'Deep Learning 1 > 퍼셉트론' 카테고리의 다른 글

5. 다층 퍼셉트론  (0) 2020.02.11
4. 퍼셉트론의 한계  (0) 2020.02.06
2. 단순한 논리 회로  (0) 2020.02.04
1. 퍼셉트론이란?  (0) 2020.02.03

+ Recent posts