꿈이 너무 많은 한 대학생의 공간

밑바닥부터 시작하는 딥러닝 - 2. 퍼셉트론 본문

인공지능/밑바닥부터 시작하는 딥러닝

밑바닥부터 시작하는 딥러닝 - 2. 퍼셉트론

청울울청 2020. 6. 21. 21:22

1. 퍼셉트론이란?

 

퍼셉트론(Perceptron)은 프랑크 로젠블라트가 고안한 알고리즘으로, 다수의 신호를 입력으로 받아 하나의 신호를 출력하는 것을 말한다. 전류가 전선을 타고 흐르듯이 퍼셉트론도 신호가 흘러 하나의 신호로 앞으로 전달되게 된다.

퍼셉트론은 0과 1, 흐르지 않거나 흐르는 단 두가지의 값을 가지게 된다.

 

x1 과 x2의 신호를 받아 x3에서 y 하나를 내보내는 하나의 퍼셉트론을 생각해보자.

이때 x1, x2, x3는 각각 뉴런, 혹은 노드 라고 불린다. 입력 신호가 뉴런에 보내질 때에는 각각의 신호에 가중치가 곱해진다. 노드는 가중치가 곱해진 신호들이 일정한 한계를 뛰어넘게 되면 1을 출력해 신호를 내보낸다. 이때 일정한 한계를 임계값 이라고 하며, 기호 세타(θ) 를 통해 나타낸다. x1, x2에 곱해지는 가중치를 각각 w1, w2라고 가정할때,

y가 1이 될 조건은 x1 * w1 + x2 * w2 > θ(세타) 이다.

반대로 0 이 될 조건은 x1 * w1 + x2 * w2 <= θ 이어야 한다.

 

2. 논리 회로 AND

AND 게이트는 두 개를 입력받고 한 개를 출력한다. 이때, 입력받는 두 개의 값이 모두 1 일때만 1을 출력하며, 그 외의 경우에는 모두 0을 출력한다.

3. 논리 회로 NAND

NAND 게이트는 동일하게 두 개를 입력받고 한 개를 출력하지만, 입력받는 두 개의 값이 1 일때는 0을 출력하며, 그 외의 경우에는 모두 1을 출력한다.

4. 논리 회로 OR

OR 게이트는 동일하게 두 개를 입력받고 한 개를 출력한다. 이 때, 입력받는 두 가지의 값 중 단 하나라도 1일 경우 1을 출력한다.

 

5. 가중치와 편향 도입

이때 세타(θ) 를 -b 로 치환했을 때, 퍼셉트론은 다음과 같은 조건으로 동작한다.

y가 1이 될 조건은 b + x1 * w1 + x2 * x2 > 0

y가 0이 될 조건은 b + x1 * w1 + x2 * w2 <= 0 이다.

여기서 b 를 편향이라 한다. 즉, 편향(b) 는 -θ (세타)이다.

편향을 도입한 AND 게이트를 python 으로 구현한다면 다음과 같다.

import numpy as np

def AND(x1, x2):
    x = np.array([x1, x2]) # 입력값 x1, x2를 numpy 배열로 변환
    w = np.array([0.5, 0.5]) # 가중치 w1, w2 선언
    b = -0.7 # 세타값 0.7을 b로 치환하여 편향 -0.7로 선언

    tmp = np.sum(w * x) + b # x1*w1 + x2*w2 - theta 와 동일함

    if tmp > 0:
        return 1
    else:
        return 0

이어서 NAND 게이트와 OR 게이트를 구현한다면 다음과 같다.

def NAND(x1, x2):
    x = np.array([x1, x2])
    w = np.array([-0.8, -0.8]) # 가중치 변환
    b = 1 # 편향 변환

    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])
    b = -0.2
    tmp = np.sum(x*w) + b

    if tmp <= 0:
        return 0
    else:
        return 1

하지만 XOR 게이트를 구현하기에는 한 개의 퍼셉트론으로는 무리가 있다.

입력받는 두 가지의 신호를 NAND 게이트를 통해 1 1 인 경우를 제외하고 OR 연산을 통해 0 0 인 경우를 걸러내야 하기 때문이다. 그러므로 우리는 퍼셉트론의 중첩 이라는 것을 이용해 XOR을 구현할 것이다.

def XOR(x1, x2):
    a = NAND(x1, x2)
    b = OR(x1, x2)

    return AND(a, b)

NAND 게이트를 통해 1 1 이 아니라면 a에 1을 저장한다. 또한 OR 연산을 통해 0 0 인 값을 걸러내고 b에 저장한다. 만약 NAND 게이트와 OR 게이트를 모두 통과한다면(리턴값이 모두 1이라면) AND 게이트를 통해 XOR이 1을 리턴하는 것이다.

 

Comments