Perceptron

1 minute read

퍼셉트론

퍼셉트론은 현재 쓰이고 있는 신경망의 기원이다.

퍼셉트론은 다수의 입력을 받아서 하나의 출력을 한다.

출력을 하는 데에도 기준이 있다.

입력이 들어오는 것을 노드라고 할 때
그 노드는 출력까지 가면서 가중치가 곱해진다.

n개의 입력이 있다고 가정할 때
이 중 하나의 입력 x1 은 결과 y 까지 가면서 w1 라는 x1에 해당하는 가중치가 곱해진다.
그리고 이들의 합, 즉 x1*w1 + x2*w2 + ... 이 임계값을 넘어야 이 퍼셉트론은 1 을 출력한다.

AND 게이트

논리회로 중 기초인 AND 게이트를 퍼셉트론 알고리즘으로 구현하자.

가중치는 임의로 정하였다.

AND 연산의 진리표는 다음과 같다.

x1 x2 y
0 0 0
0 1 0
1 0 0
1 1 1

가중치를 편하게 0.5 이라고 하고, 임계값을 0.7 로 설정하기로 하였다.

AND 값을 얻는 함수는 이러하다.

def AND(x1, x2):
  x = np.array([x1, x2])
  w = np.array([0.5, 0.5])
  if np.sum(w * x) > 0.7:
    return True
  else
    return False

AND(0, 0)이나 AND(1, 1) 같은 값을 넣어보면 AND 의 역할을 하는 것을 볼 수 있다.

이때 편향이라는 것이 하나 더 등장한다.

편향은 위에서 언급한 임계값에 -를 붙인 수이다.

편향의 의미는 해당 출력이 얼마나 잘 1을 출력하는가에 해당한다.
편향이 작아질 수록 1을 출력하기가 어렵다.
편향이 -20.0 이 된다면 도합이 20을 넘겨야 1을 출력할 수 있다는 뜻이 된다.

이 편향이라는 개념을 도입한 AND, OR, NAND 게이트는 다음과 같다.

def AND(x1, x2):
  x = np.array([x1, x2])
  w = np.array([0.5, 0.5])
  b = -0.7
  a = np.sum(x * w) + b
  if a > 0:
    return True
  else:
    return False
def OR(x1, x2):
  x = np.array([x1, x2])
  w = np.array([0.5, 0.5])
  b = -0.3
  a = np.sum(x * w) + b
  if a > 0:
    return True
  else:
    return False
def NAND(x1, x2):
  x = np.array([x1, x2])
  w = np.array([-0.5, -0.5])
  b = 0.7
  a = np.sum(x * w) + b
  if a > 0:
    return True
  else:
    return False

위 셋의 공통점은 각 게이트를 x1, x2 입력에 대해 시각적으로 그렸을 때
출력이 0, 1이 되는 부분이 직선으로(선형적으로) 나뉘어진다는 점이다.

그러나 XOR 은 그렇지 않다.

XOR 은 퍼셉트론 하나로는 구현할 수가 없다.
XOR 은 AND, OR, NAND 로 구현한다.

퍼셉트론이 한 층 더 있으므로 이를 다층 퍼셉트론이라고 한다.

파이썬으로 구현한 XOR 게이트는 다음과 같다.

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

이렇게 구현된 다층 퍼셉트론은
이후 배울 신경망의 큰 토대가 된다.