티스토리 뷰

머신러닝

[ML] 1. Perceptron

hezma 2020. 7. 22. 06:20
  • perceptron은 신경망의 기원이 되는 알고리즘으로, 신경망과 딥러닝으로 나아가는데 배경이 되는 알고리즘이다. 오래된 알고리즘이지만 제대로 이해해보자.

1.1 Perceptron의 정의

perceptron은 다음 요소들에 의해 정의되는 알고리즘 모델이다.

  • 입력(x)
  • 가중치(w)
  • 출력(y)
  • 임계값(t)

이 때 입력은 n차원의 벡터일 수 있고, 가중치 w는 이 입력과 동일한 차원을 가져야 한다. 이 때 출력은 입력과 가중치의 내적인 x*w가 설정한 임계값 t를 넘을 경우 1, 임계값 t를 넘지 않을 경우 0이 된다. 다음 <그림1>은 이런 perceptron을 그림으로 나타낸 것이다. x의 weighted sum이라는 용어는 x와w의 내적을 말한다.

<그림1: perceptron>

1.2 Perceptron으로 논리 회로 만들기

이렇게 기본적으로 동작하는 Perceptron unit이 어떻게 복잡한 논리적 판단을 구성할 수 있는지 알아보기 위해 Perceptron 하나가 NOT, AND, OR등의 동작을 수행할 수 있음을 보이겠다. NOT,AND,OR만 있으면 모든 논리적 판단을 구성할 수 있으므로, 밑의 증명은 여러개의 Perceptron을 모아 복잡한 논리 판단을 구성할 수 있다는 명제에 대한 직관적인 증명이 될 것이다.

NOT gate의 동작은 1을 받았을 때 0, 0을 받았을 때 1을 출력하는 것이고 2-input인 AND gate와 OR gate의 동작은 다음 <그림2>와 같다.

<그림2: AND, OR gate의 동작>

이 때 이 gate 3개를 perceptron 하나로 설계해보자.

1.2.1 NOT gate

not gate를 설계하는 것은 매우 간단한 일이다. input이 하나이므로 weight도 숫자 하나다. 따라서 weight를 1로 잡은 다음 threshold를 -0.5로 잡으면 x가 1일 때 weighted sum은 -1, x가 0일 때 weighted sum은 0이므로 x가 1일 때는 threshold보다 작아서 0, x가 0일 때는 threshold보다 커서 1로 출력이 결정된다. 이를 python 상에서 간단한 함수로 구현해보면 다음과 같다.

def NOT(x1):
    w1, threshold = -1, -0.5
    wsum = w1*x1
    if wsum <= threshold:
        return 0
    else:
        return 1

1.2.2 AND gate

2-input AND gate도 위의 논리처럼 구현해보면 다음과 같이 하면 될 것이다. 복습 겸 CH1에서 다룬 numpy를 조금 활용해보자.

import numpy as np
def AND(x1, x2):
  x = np.array([x1, x2])
  w = np.array([1, 1])
  threshold = 1.5 # wsum이 2일 때만 넘어갈 수 있게 설정
  wsum = np.sum(x*w)
  if wsum <= threshold:
    return 0
  else:
    return 1

1.2.3 OR gate

위의 code에서 threshold를 0.5로 바꾸어 주면 된다. 그럼 하나만 1이어도 threshold를 넘는다.

1.2.4 XOR gate?

이렇게 NOT, AND, OR을 하나의 perceptron으로 구현할 수 있음을 살펴보았는데, 복잡한 논리 회로의 경우에는 하나의 perceptron으로 구현할 수 없는 경우가 있다. 예를들어 논리적 베타합인 XOR의 경우 하나의 perceptron으로 구현할 수 없다. [1]

이런 경우 아까 말했듯이 perceptron을 층층이 쌓은 multi-layer perceptron을 사용하면 XOR같은 복잡한 논리도 구현할 수 있다. 논리회로에서도 동일한 방법으로 이를 구현하는데, 실제로 밑의 <그림3>의 '가' 항목은 필자의 논리회로 수업 때 예비보고서에 적어야 할 사항이었는데, NAND만을 이용해 XOR을 구현하는 문제였다. (논리회로에서는 NAND가 AND보다 만들기 쉽다.)

<그림3: NAND로 XOR만들기>

<그림3>의 회로도를 우리의 다중 perceptron으로 구현해보면 된다. NAND는 이미 구현되어있는 AND에서 if/else에서의 결과만 반전하면 되고, 이를 이용해 XOR을 구현해보면 다음과 같다.

import numpy as np

def NAND(x1, x2):
  x = np.array([x1, x2])
  w = np.array([1, 1])
  threshold = 1.5 # wsum이 2일 때만 넘어갈 수 있게 설정
  wsum = np.sum(x*w)
  if wsum <= threshold:
    return 1
  else:
    return 0

def XOR(x1, x2):
  NANDA = NAND(x1,x2)
  NANDC = NAND(x1, NANDA)
  NANDD = NAND(x2, NANDA)
  return NAND(NANDC, NANDD)

출력 확인 코드는 다음과 같다.

i1 = NAND(1,1)
i2 = NAND(1,0)
i3 = NAND(0,0)
print(i1,i2,i3)
x1 = XOR(0,0)
x2 = XOR(0,1)
x3 = XOR(1,0)
x4 = XOR(1,1)
print(x1,x2,x3,x4)

참고 사항

Reference: 밑바닥부터 시작하는 딥러닝(2019). 사이토 고키

[1] : Reference의 54.p 2.4 항목 참고

댓글