본문 바로가기

Deep Learning

Perceptron (퍼셉트론)

1. Perceptron 이란?

퍼셉트론은 신경망의 기원이 되는 알고리즘으로 다수의 신호를 입력받아 하나의 신호를 출력한다.

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

 

 

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

 

$x_1$ 과 $x_2$ 는 입력신호,

$y$ 는 출력 신호

$w_1$ 과 $w_2$ 는 가중치를 뜻한다.

 

그림의 원은 뉴런 혹은 노드 를 뜻한다.

입력 신호가 뉴런에 보내질 때는 각각 고유한 가중치 가 곱해진다. ($w_1x_1, w_2,x_2$)

뉴런에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력한다. ( 이를 뉴런이 활성화 한다고 표현하기도 하며 $\theta$ 기호로 나타낸다.)

위의 내용을 수식으로 나타내면 다음과 같다.

 

 

위의 가중치가 클수록 해당 신호의 영향력이 더 커지므로 그만큼 더 중요함을 뜻한다.

2. 단순한 논리 회로

2-1. AND 게이트

 

 

위의 AND 게이트를 퍼셉트론으로 표현하고 싶다고 하자. 이를 위해 할 일은 위의 진리표대로 작동하도록 하는 $w_1,w_2,\theta$ 를 정의하는 것이다.

 

사실 위를 만족하는 매개변수의 조합은 무수히 많다. 가령 $(w_1, w_2, \theta)$ 가 (0.5, 0.5, 0.7) 일때나 (0.5, 0.5, 0.8) 일 때, 모두 AND 게이트의 조건을 만족하게 된다.

 

2-2. NAND 게이트와 OR 게이트

NAND 게이트는 Not AND 를 의미하며, 그 동작은 AND 게이트의 출력을 뒤집은 것과 같다.

  • NAND 게이트 의 진리표

 

NAND 게이트를 표현하려면 예를 들어 $(w_1,w_2,\theta) = (-0.5,-0.5,-0.7)$ 조합이 있다. (다른 조합도 무한히 있다.) 그리고 사실, AND 게이트를 구현하는 매개변수들의 부호를 모두 반전하기만 하면 NAND 게이트가 된다.

  • OR 게이트의 진리표

 

같은 흐름에서 위의 OR 게이트도 생각해보자. OR 게이트는 입력 신호 중 하나 이상이 1이면 출력이 1이 되는 논리 회로이다. 이 OR 게이트의 매개변수는 어떻게 설정하면 될까?

 

잘 생각해보면 OR 게이트는 하나의 변수와 가중치를 곱한 $x_1w_1$ 의 값이 $\theta$ 보다 커야 하므로, $(w_1,w_2,\theta) = (1.0, 1.0, 0.7)$ 와 같은 조합이 있을 수 있다.

 

2-3. 퍼셉트론 구현하기

  • 간단한 AND 게이트의 구현
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

 

 

  • 가중치와 편향 도입

앞의 식에서 $\theta$ 를 $-b$ 로 치환하면 퍼셉트론의 동작이 아래 식처럼 된다.

 

 

앞의 퍼셉트론의 정의에서 보았던 식과 위의 식은 기호 표기만 바꿨을 뿐 그 의미는 같다. 여기서 b 를 편향(bias) 이라고 하며 $w_1,w_2$ 는 그대로 가중치 이다.

 

편향은 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력) 하느냐를 조정하는 매개변수이다.

 

예를 들어, $b$ 가 $-0.1$ 이면 각 입력 신호에 가중치를 곱한 값들의 합이 $0.1$ 을 초과할 때만 뉴런이 활성화한다. 반면 $b$ 가 $-20.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.7
    tmp = np.sum(w * x) + b
    if tmp <= 0:
        return 0
    else:
        return 1

 

 

  • NAND 게이트
import numpy as np

def NAND(x1, x2):
    x = np.array([x1, x2])
    w = np.array([-0.5, -0.5])  # AND 와 가중치(w와 b)만 다르다. - 부호가 반대
    b = 0.7
    tmp = np.sum(x*w) + b
    if tmp <= 0:
        return 0
    else:
        return 1

 

 

  • OR 게이트
import numpy as np

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

 

 

2-4. 퍼셉트론의 한계

  • XOR 게이트

위 진리표는 XOR 게이트의 진리표이다. 이 XOR 게이트를 퍼셉트론으로 표현하고자 한다면 어떻게 표현해야 할까? 사실 지금까지 본 퍼셉트론으로는 XOR 게이트를 구현할 수 없다.

퍼셉트론은 아래 그림과 같이 직선으로 나뉜 두 영역을 만든다 (OR 게이트의 예시이다.)

 

 

OR 게이트에서 퍼셉트론이 두 영역을 나눈 모습

하지만 다음과 같은 XOR 게이트를 직선 하나로 나눌 수 있을까?

 

 

직선이라면 불가능하다. 하지만 곡선이라면 아래와 같이 가능하다.

 

2-5. 다층 퍼셉트론이 출동한다면

안타깝게도 퍼셉트론으로는 XOR 게이트를 표현할 수 없었지만, 다층 퍼셉트론(multi-layer perceptron) 이라면 XOR 을 표현할 수 있다.

  • 기존 게이트 조합하기

다음과 같이 AND, OR, NAND 게이트를 조합해서 XOR 게이트를 만들수가 있다.

 

 

import numpy as np
from Perceptron.nand_gate import NAND
from Perceptron.or_gate import OR
from Perceptron.and_gate import AND

# XOR 게이트 파이썬 구현버전
def XOR(x1, x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    return AND(s1, s2)

print(XOR(0, 0))  # 0
print(XOR(0, 1))  # 1
print(XOR(1, 0))  # 1
print(XOR(1, 1))  # 0

 

위의 게이트를 퍼셉트론의 개념으로 표현해보면 아래와 같이 여러개의 층으로 되어 있음을 알 수 있다.

0층에는 입력부분, 1층에는 NAND 와 OR 게이트의 출력값이 있고 2층에는 AND 게이트를 거친 최종 결과값이 나타나있음을 알 수 있다.

 

 

정리

  • 퍼셉트론은 입출력을 갖춘 알고리즘이다. 입력을 주면 정해진 규칙에 따른 값을 출력한다.
  • 퍼셉트론에서는 "가중치"와 "편향"을 매개변수로 설정한다.
  • 퍼셉트론으로 AND, OR 게이트 등의 논리 회로를 표현할 수 있다.
  • XOR 게이트는 단층 퍼셉트론으로는 표현할 수 없다.
  • 2층 퍼셉트론을 이용하면 XOR 게이트를 표현할 수 있다.
  • 단층 퍼셉트론은 직선형 영역만 표현할 수 있고, 다층 퍼셉트론은 비선형 영역도 표현할 수 있다.
  • 다층 퍼셉트론은 (이론상) 컴퓨터를 표현할 수 있다.

 

참조

밑바닥부터 시작하는 딥러닝

'Deep Learning' 카테고리의 다른 글

신경망 학습 - 1  (0) 2021.02.11
신경망-2 (Neural Network)  (0) 2021.01.31
신경망-1 (Neural Network)  (0) 2021.01.28