[밑바닥부터 시작하는 딥러닝] 2. 퍼셉트론(Perceptron)

Yejin Kim·2022년 2월 14일
0
post-thumbnail

💡 퍼셉트론(Perceptron)이란?

  • 신경망(딥러닝)의 기원이 되는 알고리즘
  • 다수의 신호를 입력으로 받아 하나의 신호를 출력

    위 그림은 입력으로 2개의 신호를 받은 퍼셉트론의 예시이다.

    x1, x2 : 입력 신호
    y : 출력 신호
    w1, w2 : 가중치

뉴런에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력
그 한계는 임계값이라고 하며, θ 기호(theta; 세타)로 나타낸다.

위 그림의 동작을 수식으로 나타내면 다음과 같다.

퍼셉트론은 복수의 입력 신호에 각각 고유한 가중치를 부여
이 가중치는 각 신호의 결과에 주는 영향력을 조절하는 요소로 작용한다.
→ 가중치가 클 수록 중요도 🆙


🔗 단순한 논리 회로

📍 AND GATE

x1x2y
000
100
010
111

AND gate를 퍼셉트론으로 표현하기
-> w1, w2, θ 의 값 정해야 함.

위의 진리표를 만족하는 조합은 다양하다
ex) (0.5, 0.5, 0.7) (0.5, 0.5, 0.8) (1.0, 1.0, 1.0) etc.

📍 NAND GATE

x1x2y
001
101
011
110

NAND gate는 Not AND를 의미한다.

위의 진리표를 만족하는 조합은 (-0.5, -0.5, -0.7)과 같은 조합이 있다.

📍 OR GATE

x1x2y
000
101
011
111

OR gate의 진리표는 위와 같다.

🔨 퍼셉트론 구현

📍 AND GATE

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

위에서 살펴본 진리표를 만족하는 가중치와 임계값 조합을 하나 선택하여 코드를 작성

✅ 가중치와 편향 도입하여 AND gate 수정하기

θ를 -b로 치환하면 다음과 같이 식을 바꿀 수 있다.

식은 이전에 계산한 것과 동치!
여기서 b를 편향(bias)라고 한다.

import numpy as np

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

w1, w2 → 각 입력 신호가 결과에 주는 영향력(중요도)
b(편향) → 뉴런이 얼마나 쉽게 활성화하느냐를 조정하는 매개변수

📍 NAND GATE

import numpy as np

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

AND gate의 구현과는 가중치(w와 b)만 다르다

📍 OR GATE

import numpy as np

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

🌊 퍼셉트론의 한계

XOR gate를 살펴보자.

x1x2y
000
101
011
110

이제까지의 방식으로는 위 진리표를 만족시키는 가중치를 정할 수 없다.
그 이유는 다음의 그림을 통해 알 수 있다.

위의 그림은 XOR 게이트의 출력을 나타낸 것이다.
Perceptron은 기본적으로 수식의 형태가 직선이다.

위의 식을 살펴보면 상수 w1, w2, θ에 어떤 값을 대입했을 때,
x1과 x2를 축으로 하는 좌표에서 직선을 기준으로 영역이 나뉨을 알 수 있다.

따라서 XOR gate를 퍼셉트론으로 표현하기 위해서는 위의 좌표에서의 결과 값을 직선으로 나눌 수 있어야 한다.


위의 그림에서 알 수 있듯이 🔴과 🔺를 직선 하나로는 나누는 방법은 불가능하다.

하지만 '직선'이라는 제약을 없앤다면 가능하다.

위와 같은 곡선의 영역을 비선형 영역, 직선의 영역을 선형 영역이라고 한다.

💥 다층 퍼셉트론이 충돌한다면?

XOR gate는 퍼셉트론에 '층을 쌓은' 다층 퍼셉트론으로 구현이 가능하다.

기본적으로 XOR gate는 AND, NAND, OR gate를 조합하여 만들 수 있다.

위의 로직이 실제로 일치하는지는 진리표를 통해 확인해볼 수 있다.

x1x2s1s2y
00100
10111
01111
11010

위의 진리표를 바탕으로 이전 gate들과 같이 XOR gate를 구현해보자

def XOR(x1, x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y

XOR은 다층 구조의 네트워크이다.
단층 퍼셉트론으로는 표현할 수 없던 것을 층을 늘려 구현할 수 있다.

퍼셉트론은 층을 쌓아(깊게 하여) 더 다양한 것들을 표현할 수도 있다.
다층 퍼셉트론은 심지어 이론상으로는 컴퓨터도 표현할 수 있다!


[참고 자료]
http://sullystationtechnologies.com/npnxorgate.html

profile
The World Is My Oyster 🌏

0개의 댓글