Bite Bits/Data Science

밑바닥부터 시작하는 딥러닝(Deep Learning from Scratch) - 퍼셉트론

상영 2017. 8. 16. 17:20

퍼셉트론(perceptron)은 다수의 신호를 입력으로 받아 하나의 신호를 출력한다.


전자회로에서 배우는 AND, OR, NAND(Not AND), XOR(eXclusive OR) 회로 구현을 생각하면 된다.


(단순 퍼셉트론)

두 개의 신호(0, 1)가 입력되어 하나의 출력(y)으로 이어지는 구조

두 개의 신호, x1, x2 에 각각 가중치 w1, w2 가 부여되어 합해지고 (x1*w1 + x2+w2)

이 값이 임계값(θ:theta)보다 높으면 '1'로 출력되고, 같거나 작으면 '0' 으로 출력되는 구조

x1*w1 + x2*w2 ≤ θ ==> y=0

x1*w1 + x2*w2 > θ ==> y=1


임계값(θ)을 편향값(bias)으로 치환하면, ( bias = θ * -1)

bias + x1*w1 + x2*w2  ≤ 0 ==> y=0

bias + x1*w1 + x2*w2  0 ==> y=1


가중치와 bias (혹은 임계치)를 설정하는 것만으로 동일한 로직에서 and, or, nand 회로를 구성할 수 있다.

퍼셉트론의 매개변수 값을 정하는 것은 컴퓨터가 아니라 인간. 인간이 직접 진리표라는 학습 데이터를 보면서 매개변수의 값을 생각함. 기계학습 문제는 이 매개변수의 값을 정하는 작업을 컴퓨터가 자동으로 하도록 함. 학습이란 적절한 매개변수 값을 정하는 작업이며, 사람은 퍼셉트론의 구조(모델)을 고민하고 컴퓨터에 학습할 데이터를 주는 일을 함


하지만 XOR 는 하나의 회로로 구현이 불가능하다. (그래프로 표현하면 쉽게 이해가 된다.)







AND, OR, NAND 는 직선으로 영역의 구분이 가능했지만, XOR 는 직선으로 영역 구분이 불가능.

곡선형태의 구분처리가 필요함.

다층의 퍼셉트론이 필요.

다층 퍼셉트론으로 비선형 영역도 표현가능, (이론상) 컴퓨터를 표현할 수 있다.


구현 예)== python ==

def AND(x1, x2):  # 아래는 임계치를 이용한 방식, 편향(bias)를 이용한 방식으로 변경도 가능

    w1, w2, theta = 0.5, 0.5, 0.7

    tmp = x1*w1 + x2*w2

    if tmp<= theta:

        return 0

    elif tmp > theta:

        return 1


def XOR(x1, x2):

    s1 = NAND(x1, x2)

    s2 = OR(x1, x2)

    y = AND(s1, s2)

    return y


== 그래프작성용 python code ==

import numpy as np

import matplotlib.pyplot as plt


plt.plot([0,1,0],[0,0,1], 'bv')

plt.plot([1],[1], 'ro')

plt.axis([-0.2,1.2,-0.2,1.2])

x = np.arange(-0.2, 1.5, 0.1)

y = np.arange(-0.2, 1.5, 0.1)

plt.plot(x, x*0, linestyle='--', color="gray", linewidth=1)

plt.plot(0*y, y, linestyle='--', color="gray", linewidth=1)

plt.plot(x, x*-1 + 1.1)

plt.title("AND")

plt.show()


import numpy as np

import matplotlib.pyplot as plt


plt.plot([1,0],[0,1], 'ro')

plt.plot([0,1],[0,1], 'bv')

plt.axis([-0.2,1.2,-0.2,1.2])

x = np.arange(-0.2, 1.5, 0.1)

y = np.arange(-0.2, 1.5, 0.1)

plt.plot(x, x*0, linestyle='--', color="gray", linewidth=1)

plt.plot(0*y, y, linestyle='--', color="gray", linewidth=1)

plt.title("XOR")

plt.show()