2장. Perceptron 퍼셉트론

괴도소녀·2021년 7월 13일
0

TFMaster

목록 보기
1/9

퍼셉트론프랑크 로젠블라트(Frank Rosenblatt)가 1957년에 고안한 알고리즘이며, 지금까지도 신경망(딥러닝)의 기원이 되는 알고리즘이다.
앞으로의 아이디어들을 배우기 위해 퍼셉트론의 구조를 배우는 것이 중요하다.

퍼셉트론은 입력으로 다수의 신호를 받으며, 하나의 신호를 출력한다.
퍼셉트론의 신호는 0과 1 두가지 값만 가질 수 있다.

위 그림은 입력이 2개인 퍼셉트론의 예이다.

  • x1, x2는 입력 신호이며
  • y는 출력 신호
  • w1, w2는 가중치이다.(weight)
  • 원은 노드 혹은 뉴런 이라 부른다.

입력 신호가 뉴런에 보내질 때 각각의 가중치가 곱해진다.
eg. x1w1, x2w2

뉴런에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력하며, 그 한계를 받으며, 임계값이라 한다. 기호로는 θ 로 표시한다.

퍼셉트론의 동작원리를 수식으로 표시하면 다음과 같다.

가중치는 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용하며,
가중치가 클수록 해당 신호의 중요도가 높다는 것을 뜻한다!


논리회로에 퍼셉트론을 이용한 문제들을 살펴보자

단순 논리 회로

AND

참고로, 밑에와 같이 입력 신호와 출력 신호의 대응 표를 '진리표' 라고 한다.

x1x2y
000
100
010
111

위의 AND게이트를 퍼셉트론으로 표현하려고 할때, 해야 할일은 진리표와 같이 작동하도록 가중치(w1, w2)와 임계값(θ)값을 정해주는 것이다.

NAND

Not AND를 의미하며, AND의 출력값을 뒤집은 것이라고 생각하면 된다.
진리표는 다음과 같다.

x1x2y
001
101
011
110

OR

입력신호 중 하나 이상이 1이면 출력이 1이 되는 논리회로이다.

x1x2y
000
101
011
111

위 논리회로에서 퍼셉트론의 구조는 모두 똑같다.
다른 것은 매개변수(가중치, 임계값)의 값들 뿐이다.

퍼셉트론 구현하기

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
    
--------------------------------
AND(0, 0) # 0 
AND(1, 0) # 0 
AND(0, 1) # 0 
AND(1, 1) # 1

가중치와 편향을 도입하자

θ를 -b로 치환하면 식이 밑에와 같이 변한다.

기호표기만 바뀌고 의미는 같으며, b편향(bias)라고 한다.
그림에서의 퍼셉트론은 입력신호에 가중치를 곱한 값과 편향을 합하여,

  • 0이 넘으면 1
  • 0보다 작거나 같으면 0

을 출력한다.

이번에는 numpy를 이용해서 식을 구현해보면 아래와 같다.

import numpy as np

x = np.array([0, 1])
w = np.array([0.5, 0.5])
b = -0.7

print(np.sum(x * w) + b)

위의 식을 AND함수 안에 붙이면 완성이다.

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

-θ가 편향b로 치환 되었다. 그리고 편향은 가중치와 기능이 다르다는 것에 주의해야한다.
가중치각 입력신호 결과에 영향력(중요도)를 조절하는 매개변수이고,
편향뉴런이 얼마나 쉽게 활성화(결과를 1로 출력)하느냐를 조정하는 매개변수이다.
편향에 대한 것이 이해되지 않으면 링크에 들어가서 설명을 읽어보자.

같은 방법으로 NAND와 OR게이트로 함수로 구현 해보자.
[NAND]

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

[OR]

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

같은 구조의 퍼셉트론이고, 차이는 가중치의 값뿐이다.

퍼셉트론의 한계

물론 퍼셉트론의 한계도 분명 존재한다.
이번엔 XOR 논리 게이트를 살펴보자.
XOR은 배타적(자기 외에는 거부한다) 논리합 이라고 하며, x1와 x2 중 한쪽이 1일 때만 1을 출력한다.

x1x2y
000
101
011
110

위의 진리표를 보면 여태까지의 퍼셉트론으로는 XOR을 구현할 수 없다는 점을 알 수 있다.

이 말의 뜻을 밑에 그래프들을 보면서 다시 차근차근 이해해보자.

직선으로 나뉜 두 영역을 만든다. 한쪽 영역은 1을 출력하며 다른 한쪽은 0을 출력한다.
전체영역은 OR게이트의 성질을 만족하며, 회색영역은 0을 출력하는 영역이다.

XOR의 경우 OR 게이트와 같이 직선하나로 원과 세모를 나누는 영역을 만들 수가 없다.

하지만 만약 직선이라는 제약을 없앤다면 곡선으로는 나타낼 수 있다.

[그림2-8]과 같은 곡선의 영역을 비선형 영역, 직선의 영역을 선형 영역이라고 한다.
기계학습에서 자주 쓰이는 용어이며 그래프와 함께 첨부해서 이해하면 쉬울 것이다.

다층(Multi-layer) 퍼셉트론

퍼셉트론으로는 XOR을 표현할 수 없다. 하지만 퍼셉트론은 층을 쌓아서 다층 퍼셉트론(Multi-layer perceptron)을 만들 수 있다.

기존 게이트에 조합하기

XOR 게이트를 만드는 방법은 다양하며, 앞서 만든 AND, NAND, OR게이트 들을 조합해서 만드는 방법이 있다.

[논리 게이트 기호 AND, NAND, OR]

이 3개의 조합으로 XOR의 논리 게이트 만들 수 있다.
[AND, NAND, OR 조합의 XOR 게이트 기호]

위 그림의 진리표는 아래와 같다.

x1x2s1s2y
00100
10111
01111
11010

그럼 이제 XOR게이트를 함수로 구현해보자.

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


[그림2-13]에서와 같이 퍼셉트론을 여러개 쌓아서 XOR게이트를 만들 수 있다.
다층 구조의 네트워크이며, [그림 2-13]에서는 왼쪽부터 차례로 0층 ,1층, 2층으로 칭하겠다.
이 과정을 공장과 비유하자면,

  • 0층(1단계)에선 '부품'을 만들어 다듬고 나서 1층(2단계)으로 전달한 후
  • 1층에서 조립이 완성되면
  • 2층(3단계)에 보내서 출력하는 구조

라고 생각하면 된다.

🙋🙋🙋🙋🙋🙋🙋🙋🙋🙋🙋🙋🙋🍓🍓🍓🍓🍓
여기서 알 수 있는 것은 단일 퍼셉트론으로 표현하지 못하면
층을 쌓아 다층 퍼셉트론으로 구현할 수 있다는 점이다.


정리

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

"다층 퍼셉트론으로 알고리즘을 다양하게 설계할 수 있다"가 이내용의 keypoint같습니다.


퍼셉트론 이미지 참고

scikit-learn multi layer perceptron
analyticsvidhya multilayer

0개의 댓글