먼저 간단히 AND게이트를 구현해보겠다.

def AND(x1, x2):
    w1, w2, theta = 0.4, 0.4, 0.7
    tmp = x1*w1 + x2*w2
    if tmp > theta:
        return 1
    else:
        return 0
print(AND(0, 0)) #0 출력
print(AND(1, 0)) #0 출력
print(AND(0, 1)) #0 출력
print(AND(1, 1)) #1 출력

y = {0(w1x1+w2x2θ)1(w1x1+w2x2>θ)\begin{cases} 0 &(w_1x_1 + w_2x_2 \le \theta)\\ 1 &(w_1x_1 + w_2x_2 > \theta) \end{cases}

퍼셉트론 구조에서 가중합이 임계값(θ\theta, theta)을 넘기는지의 여부에 따라 출력값이 결정된다.
그럼 이제 위의 식에 편향이라는 개념을 도입하여 살짝 변형해보자.

1. 편향 도입한 AND 게이트

y = {0(w1x1+w2x2+b0)1(w1x1+w2x2+b>0)\begin{cases} 0 &(w_1x_1 + w_2x_2 + b \le 0)\\ 1 &(w_1x_1 + w_2x_2 +b > 0) \end{cases}

우변에 있던 θ\theta를 좌변으로 이항하고, -θ\theta를 편향 기호 b로 치환한 것이다.
단순히 이항하여 기호만 바꾼 것이기 때문에 식의 의미는 당연히 변함이 없고, w1w_1, w2w_2는 여전히 가중치를 의미한다.
이제 퍼셉트론은 입력 신호에 가중치를 곱한 값과 편향을 더한 값을 0을 기준으로 판단하게 되었고, 이에 따라 출력값이 결정된다.
즉, (가중합 + 편향) > 0이면 1을 출력하고, 아니면 0을 출력한다.

import numpy as np
x = np.array([0, 1]) #입력값
w = np.array([0.4, 0.4]) #가중치
b = -0.7 #편향

w * x    #array([0. , 0.4])

# 가중합
np.sum(w * x) #0.4

# 가중합 + 편향
np.sum(w * x) + b 
-0.29999999999999993

이렇게 변경된 식으로 AND게이트를 다시 구현해보면 다음과 같이 함수를 정의할 수 있다.

def AND(x1, x2):
    x = np.array([x1, x2]) #입력값
    w = np.array([0.4, 0.4]) #가중치
    b = -0.7 #편향
    tmp = np.sum(w*x) + b
    if tmp > 0:
        return 1
    else:
        return 0

중요한 점은, 편향과 가중치의 기능은 완전히 다르다.

w1w_1, w2w_2: 각 입력 신호가 결과에 주는 영향력(중요도)을 조절하는 가중치 매개변수
편향: 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력)하느냐를 조정하는 매개변수

예를 들어, b = -0.5이면 가중합(입력값에 가중치를 곱한 값들의 합)이 0.5를 초과할 때 뉴런이 활성화된다.
한편, b = -15이면 가중합이 15가 넘지 않으면 뉴런이 활성화되지 않는다.

2. 편향 도입한 NAND 게이트

def NAND(x1, x2):
    x = np.array([x1, x2]) #입력값
    w = np.array([-0.4, -0.4]) #가중치
    b = 0.7 #편향
    tmp = np.sum(w*x) + b
    if tmp > 0:
        return 1
    else:
        return 0
print(NAND(0, 0)) #1
print(NAND(1, 0)) #1
print(NAND(0, 1)) #1
print(NAND(1, 1)) #0

AND게이트와는 가중치(w)와 편향(b)의 부호만 달라진다.

3. 편향 도입한 OR 게이트

def OR(x1, x2):
    x = np.array([x1, x2]) #입력값
    w = np.array([0.4, 0.4]) #가중치
    b = -0.2 #편향
    tmp = np.sum(w*x) + b
    if tmp > 0:
        return 1
    else:
        return 0
print(OR(0, 0)) #0
print(OR(1, 0)) #1
print(OR(0, 1)) #1
print(OR(1, 1)) #1

AND, NAND, OR는 모두 퍼셉트론 구조는 동일하다.
단지 가중치 매개변수만 다르다고 할 수 있다.

(이미치출처)



(DeepLearingfromScratch밑바닥부터시작하는딥러닝(사이토고키))\Bigg(Deep Learing from Scratch - 밑바닥부터 시작하는 딥러닝 (사이토 고키) \Bigg)
도서를 참고하여 공부한 내용을 정리한 것입니다.

last modified : 16-11-2021

0개의 댓글