검색을 했을 때 상당히 중복된 내용이 많으므로, 본인이 이해하고 중요하다고 생각하는 내용만 정리를 해보도록 한다.

 

퍼셉트론이란?

  • 인공 신경망을 구성하기 위한 하나의 알고리즘
  • 1958년에 등장한 오래된 알고리즘
  • 인공신경망과 딥러닝의 개념에 근간이 된다.

 

Biological Neuron (신경 세포)

 

퍼셉트론의 구조

Input == 수상돌기
Weights == 가중치 부여
Output == 축삭을 통해 받은 전기적인 신호를 축삭 말단을 통해 출력

 

다수의 신호를 입력받아 하나의 신호를 출력한다.

  • 흐른다 - 1
  • 안흐른다 - 0

 

입력 신호가 뉴런에 보내질 때 각각 고유한 가중치가 곱해지고, 뉴런에서 보내온 신호의 총합이 정해진 threshold (한계점) 를 넘을 때, 1을 출력하고 활성화 된다.

 

이 때 이걸 표현해보면

  • y = 0 (x1w1 + x2w2 <= 0)
  • y = 1 (x1w1 + x2w2 > 0)

 

이렇게 표현이 된다.

 

컴퓨터의 연산 기능은 모두 AND, OR gate 로 되어있기 때문에

이것을 퍼셉트론으로 AND gate, OR gate 를 구현할 수 있다면, 상당히 복잡한 연산도 가능하다는 이론에 도달한다고 한다.

 

로젠블랫(Rosenblatt's) 알고리즘

  • 퍼셉트론을 학습하기 위한 알고리즘
  • 가중치(weight)는 랜덤하게 초기화 한다
  • 하나의 샘플에 대해 예상 값(y_hat)을 출력 한다.
    • y_hat = 0, y = 1 이면 가중치 값을 올린다.
    • y_hat = 1, y = 0 이면 가중치 값을 내린다.
  • 정답이 나올때 까지 계속 반복한다.

 

Bias 도입

  • 편향이라는 의미를 가진다.
    • 편향이란 한 쪽으로 치우친 성질
  • threshold 대신에 사용한다.
  • 어떤 수치를 가지느냐에 activation (즉, y = 1 이 되는 것) 이 되는지에 대한 기준이 된다.
    • y = 0 (b + x1w1 + x2w2 <= 0)
    • y = 1 (b + x1w1 + x2w2 > 0)

 

퍼셉트론의 한계

 

  • 위 그림에서 직선 하나로 OR 게이트를 표현할 수 있는 것에 반해, XOR 게이트는 직선 하나로 구현할 수 없다.
    • OR 게이트는 둘 중 하나만 1 이면 1이 나오는 단순한 녀석이지만, XOR는 x, y 값이 서로 다를 때만 1 이다.
  • 퍼셉트론은 단층 구조(1-layer)로는 XOR 게이트를 구현할 수 없었다.
  • 직선이라는 제약을 없앨 수 있을까 에 대한 회의론이 나왔고, 이후 다층 구조(Multi-layer)에 대한 알고리즘이 등장했다.

 

다층 퍼셉트론 (Multi-layer Perceptron)

  • 퍼셉트론을 여러 층으로 쌓은 모델을 말한다.
  • XOR 게이트를 예로 들 수 있다.
    • 2-layer Perceptron
  • Input Layer / Hidden Layer / Output Layer 로 나눠진다.
  • Output Layer 의 값은 예측할 수 있다.
  • 하지만 여기서 Hidden Layer 에서 어떤 값이 출력되어야하는지 정의가 되어있지 않았기 때문에, 로젠블랫 알고리즘을 적용할 수 없었다.

 

파이썬 코드로의 구현

  • 논리게이트를 구현해본다.
  • AND(), OR(), NAND() 를 먼저 구현해본다.
    • 논리게이트에 대한 설명은 생략
  • AND(NAND(), OR())=> XOR() 이다.
  • 아무튼 논리게이트를 사용해서 복잡한 연산을 하는 시스템을 만들 수가 있다.

 

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

def NAND(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

def OR(x1, x2):
  x = np.array([x1, x2])
  w = np.array([0.5, 0.5])
  b = -0.2
  tmp = np.sum(w*x) + b
  if tmp <= 0:
      return 0
  else:
      return 1
    
def XOR(x1, x2):
  s1 = NAND(x1, x2)
  s2 = OR(x1, x2)
  y = AND(s1, s2)
  return y

for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
    y = XOR(xs[0], xs[1])
    print(str(xs) + " -> " + str(y))

 

정리

  • 퍼셉트론은 입출력을 갖춘 알고리즘
  • 입력을 주면 정해진 규칙에 따른 값을 출력
  • 퍼셉트론으로 AND, OR 게이트 등의 논리회로를 표현할 수 있다.
  • XOR 게이트는 2층 퍼셉트론으로 표현할 수 있다.
  • 단층 퍼셉트론은 직선형 영역만 표현하는 반면, 다층 퍼셉트론은 비선형 영역도 표현할 수 있다.
  • 다층 퍼셉트론은 이론상 컴퓨터를 표현할 수 있다.