KoreanFoodie's Study

딥러닝 튜토리얼 2강, 퍼셉트론(Perceptron) 개념 익히기 - 밑바닥부터 시작하는 딥러닝 본문

Deep Learning/밑바닥부터 시작하는 딥러닝 1

딥러닝 튜토리얼 2강, 퍼셉트론(Perceptron) 개념 익히기 - 밑바닥부터 시작하는 딥러닝

GoldGiver 2019. 11. 4. 01:24

해당 포스팅은 한빛 미디어에서 출판한 '밑바닥부터 시작하는 딥러닝'이라는 교재의 내용을 따라가며 딥러닝 튜토리얼을 진행하고 있습니다. 관련 자료는 여기에서 찾거나 다운로드 받으실 수 있습니다.


퍼셉트론(perceptron) 알고리즘

퍼셉트론은 프랑크 로젠블라트(Frank Rosenblatt)가 1957년에 고안한, 매우 오래된 알고리즘이다. 하지만 퍼셉트론의 구조를 배우는 것은 신경망과 딥러닝으로 나아가는 데 중요한 아이디어를 배우는 일도 된다.


퍼셉트론이란?

퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력한다. 여기서 말하는 신호란 전류나 강물처럼 흐름이 있는 것을 상상하면 좋다.

퍼셉트론 신호는 '흐른다/안 흐른다(1이나 0)'의 두 가지 값을 가질 수 있다.

위 사진은 입력이 2개인 퍼셉트론이다.

x1과 x2는 입력 신호, y는 출력 신호, w1과 w2는 가중치 뜻한다.(w는 weight의 머리글자)

그림의 원을 뉴런 혹은 노드라고 부른다. 입력 신호가 뉴런에 보내질 때는 각각 고유한 가중치가 곱해진다(w1x1, w2x2). 뉴런에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력한다(이를 뉴런이 활성화한다'라 표현하기도 한다). 여기서는 그 한계를 임계값이라고 하며, θ기호(theta)로 나타내겠다.

이상을 수식으로 나타내면, y 값은 다음과 같이 표현된다.

y = 0 (w1x1 + w2x2 <= θ)
    또는
y = 1 (w1x1 + w2x2 >= θ)

퍼셉트론은 복수의 입력 신호 각각에 고유한 가중치를 부여한다. 즉, 가중치가 클수록 해당 신호가 더 중요함을 의미한다!


단순한 논리 회로

  • AND 게이트

이제 간단한 게이트를 퍼셉트론을 표현함으로써 실습을 진행해 보자.

AND게이트는, x1, x2가 각각 1, 1이 들어왔을 때만 y값을 1로 내뱉는 논리 게이트이다.

x1 x2 y
0 0 0
1 0 0
0 1 0
1 1 1

AND gate의 진리표

그렇다면 w1, w2, θ값을 어떻게 설정해야 위의 진리표를 만족하는 퍼셉트론이 만들어질까?

  • NAND 게이트

NAND게이트는 (1, 1)이 들어올 경우는 0을, 나머지 경우는 전부 1을 출력하는 게이트이다.

x1 x2 y
0 0 1
1 0 1
0 1 1
1 1 0

NAND gate의 진리표

  • OR 게이트
x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 1

OR gate의 진리표


퍼셉트론 구현하기

이제 논리 회로를 파이썬 코드로 구현해 보자.

def AND(x1, x2):
    w1, w2, theta = 0.5, 0.5, 0.7
    tmp = x1*w1 + x2*w2
    if tmp <= theta:
        return 0
    else:
        return 1

print(AND(0, 0))    # 0
print(AND(0, 1))    # 0
print(AND(1, 0))    # 0
print(AND(1, 1))    # 1

결과값이 잘 나온다는 것을 확인해 볼 수 있다.

  • 가중치와 편향 도입

앞에서 구현한 AND게이트는 직관적이지만, 편향(bias)값을 도입하여 이를 수정해 볼 수도 있다.

이전에 작성했던 퍼셉트론 식을 조금 수정해 보자.

이전 식 :

y = 0 (w1x1 + w2x2 <= θ)
    또는
y = 1 (w1x1 + w2x2 >= θ)

바뀐 식(편향 도입)

y = 0 (b + w1x1 + w2x2 <= 0)
    또는
y = 1 (b + w1x1 + w2x2 >= 0)

바뀐 식과 이전 식의 차이는, θ를 (-b)로 바꾸었다는 것 뿐이다. 이때, b의 값을 편향이라고 하고, 바뀐 식은 편향과 입력신호 * 가중치 값의 합이 0보다 작거나 같으면 0을, 0보다 크면 1의 결과를 출력한다.

  • 가중치와 편향 구현하기

가중치와 편향을 도입한 AND게이트는 다음과 같이 구현할 수 있다.

import numpy as np

def AND(x1, x2):
    x = np.array([x1, x2])
    w = np.array([0.5, 0.5])
    b = -0.8
    tmp = np.sum(w*x) + b    # np.sum은 각 원소의 합을 리턴한다
    if tmp <= 0:
        return 0
    else:
        return 1

print(AND(0, 0))
print(AND(0, 1))
print(AND(1, 0))
print(AND(1, 1))

이어서 NAND 게이트와 OR 게이트를 구현해 보자.

NAND 게이트 :

def NAND(x1, x2):
    x = np.array([x1, x2])
    w = np.array([-0.5, -0.5])
    b = 0.8
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1

OR 게이트 :

def OR(x1, x2):
    x = np.array([x1, x2])
    w = np.array([0.5, 0.5])
    b = -0.3
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1

퍼셉트론의 한계

  • 도전! XOR 게이트

XOR 게이트는 배타적 논리합이라는 논리 회로이다. 아래 진리표를 참고해 보자.

x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 0

XOR 게이트의 경우, 단순히 가중치 매개변수 값을 조절하는 것으로 XOR게이트를 표현할 수 없다!

위 그림을 보면, XOR게이트의 경우 (1, 0), (0, 1)인 지점을 1로 마킹한다는 것을 알 수 있다.

하지만, 퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계가 있다. 위와 같은 비선형 영역을 표현할 수 없다는 뜻이다!


다층 퍼셉트론이 출동한다면

XOR 게이트의 예시를 해결하기 위해, 우리는 퍼셉트론의 '층을 쌓아' 다층 퍼셉트론(multi-layer perceptron)을 만들 수 있다.

  • 기존 게이트 조합하기

위의 그림처럼, NAND 게이트와 OR 게이트, AND 게이트를 조합하면 XOR 게이트의 결과값을 산출해 낼 수 있다.

이제 이전에 구현한 게이트를 이용해 XOR 게이트를 구현해 보자.

def XOR(x1, x2):
    y1 = NAND(x1, x2)
    y2 = OR(x1, x2)
    return AND(y1, y2)

XOR은 위와 같은 다층 구조의 네트워크이다. 해당 책은 왼쪽 줄부터 차례로 0층, 1층, 2층이라고 이름을 붙이고 있다.

위 그림과 같은 2층 퍼셉트론에서는 0층에서 1층으로 신호가 전달되고, 이어서 1층에서 2층으로 신호가 전달된다.

이는 각 층이 다음 층으로 부품을 전달하는 것과 같으며, 단층 퍼셉트론으로는 표현하지 못한 것을 층을 하나 늘려 구현할 수 있다는 것을 알 수 있다.

위의 사실에서 알아야 할 것은, 퍼셉트론이 층을 거듭 쌓으면 비선형적인 표현도 가능하고, 이론상 컴퓨터가 수행하는 처리도 모두 표현할 수 있다는 가능성이다.

Comments