2_퍼셉트론

서론

퍼셉트론 프랑크 로젠블라트가 1957년에 고안한 알고리즘

퍼셉트론이 중요한 이유

고대 화석 같은 이 알고리즘을 지금 시점에 배우는가 하면, 퍼셉트론이 신경망(딥러닝)의 기원이 되는 알고리즘이기 때문이다.
그래서 퍼셉트론의 구조를 배우는 것은 신경망과 딥러닝으로 나아가는 데 중요한 아이디어를 배우는 일이다.

퍼셉트론이란?

퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력한다.

여기서 '신호'란 전류나 강물처럼 흐름이 있는 것을 상상하면 좋다.
전류가 전선을 타고 흐르는 전자를 내보내듯, 퍼셉트론 신호도 흐름을 만들고 정보를 앞으로 전달한다.

다만, 실제 전류와 달리 퍼셉트론 신호는 '흐른다(1) / 안 흐른다(0)'의 두 가지 값을 가질 수 있다.

퍼셉트론의 동작 원리

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

x1와 x2는 입력 신호, y는 출력 신호, w1와 w2는 가중치다.
(그림에서의 원을 뉴런 혹은 노드라고 부른다.)

입력 신호가 뉴런에 보내질 때 각각 고유한 가중치가 곱해진다.
뉴런에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력한다. ('뉴런이 활성화한다'라고 표현하기도 함)

그 한계를 임계값(theta)이라 한다.

퍼셉트론은 복수의 입력 신호 각각에 고유한 가중치를 부여한다.

가중치는 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용한다.
즉, 가중치가 클수록 해당 신호가 더 중요하다를 뜻한다.

단순한 논리 회로

퍼셉트론을 활용한 간단한 문제인 논리 회로를 보자.

AND 게이트

두 입력이 모두 1일 때만 1을 출력하고, 그 외에는 0을 출력

위 AND 게이트를 퍼셉트론으로 표현하고 싶다면?

-> w1, w2, θ 값을 정해야한다.

위 매개변수를 만족하는 조합은 무수히 많다.

ex) (0.5, 0.5, 0.7), (0.5, 0.5, 0.8), (1.0, 1.0, 1.0) 등

NAND 게이트


Not AND를 의미
AND 게이트의 출력을 뒤집은 것이다.

(w1, w2, θ) = (-0.5, -0.5, -0.7)

사실 AND 게이트를 구현하는 매개변수의 부호만 뒤집으면 NAND 게이트가 된다.

OR 게이트


입력 신호 중 하나 이상이 1이면 출력이 1이 된다.

(w1, w2, θ) = (0.5, 0.5, 0.4)

중요한 점

여기서 중요한 점은 퍼셉트론의 구조는 AND, NAND, OR 게이트 모두에서 똑같다는 점이다.
각각의 게이트에서 다른 점은 매개변수(w1, w2, θ)의 값뿐이다.

즉, 똑같은 구조의 퍼셉트론이 매개변수의 값만 적절히 조정하여 AND, NAND, OR로 변신하는 것이다.

퍼셉트론 구현

가중치와 편향 도입

θ를 -b로 치환하면 퍼셉트론의 동작은


로 변한다.

( 아까의 식과 기호 표기만 바꿨을 뿐,그 의미는 완벽히 똑같다. )

b : 편향 (bias)
w1, w2 : 가중치 (weight)

편향과 가중치를 넣어 퍼셉트론의 동작 원리를 다시 해석해보자면,
퍼셉트론은 입력 신호에 가중치를 곱한 값과 편향을 합하여, 그 값이 0을 넘으면 1, 그렇지 않으면 0을 출력한다.

여기서 주의할 점은 편향과 가중치 각각의 기능 차이다.

편향은 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력)하느냐를 조정하는 매개변수이다.
가중치는 각 입력 신호가 결과에 주는 영향력(중요도)를 조절하는 매개변수이다.

여기서 퍼셉트론은 매개변수 값을 정하는 것은 인간이다.
기계학습 문제는 이 매개변수의 값을 정하는 작업을 컴퓨터가 자동으로 하도록 한다.
'학습'이란 적절한 매개변수 값을 정하는 작업이며, 사람은 퍼셉트론의 구조(모델)을 고민하고 컴퓨터에 학습할 데이터를 주는 일을 한다.

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

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

AND, NAND, OR 게이트는 모두 같은 구조의 퍼셉트론이고, 차이는 가중치 매개변수의 값뿐이라 했다.
실제로 코드에서도 다른 부분은 가중치와 편향 값을 설정하는 부분뿐이다.

퍼셉트론의 한계

XOR 게이트

XOR 게이트 : 배타적 논리합 (자기 자신 외에는 거부한다.)
x1, x2 중 한쪽이 1일 때에만 1을 출력한다.

사실 지금까지 본 퍼셉트론으로는 XOR 게이트를 구현할 수 없다.

이유는 ?

예를 들어 OR 게이트는 (b, w1, w2) = (-0.5, 1.0, 1.0)일 때 진리표를 만족한다.


이 식의 퍼셉트론은 직선으로 나뉜 두 영역을 만든다.


직선을 기준으로 아래는 0을 출력하고, 직선의 윗부분은 1을 출력한다.

즉, 직선 하나로 o와 △를 구분할 수 있다는 것이다.

그럼 XOR 게이트는 직선 하나로 구분할 수 있을까?

없다.
불가능하다.

그럼 방법은 뭘까?

'직선'이라는 제약을 없앤다면 가능하다.

퍼셉트론은 직선 하나로 나눈 영역'만' 표현할 수 있다는 한계가 있다.
즉, 곡선인 비선형 영역을 나눌 수 없다.

다층 퍼셉트론

multi-layer perceptron

층을 쌓아 다층 퍼셉트론을 만들어 XOR 게이트를 표현해보자.

AND, NAND, OR 게이트를 조합하여 층을 쌓는 방법이다.

XOR는 다층 구조의 네트워크다.
XOR는 2층 퍼셉트론이다.


위 사진의 동작을 더 자세히 서술하자면 다음과 같다.
1. 0층의 두 뉴런이 입력 신호를 받아 1층의 뉴런으로 신호를 보낸다.
2. 1층의 뉴런이 2층의 뉴런으로 신호를 보내고, 2층의 뉴런은 y를 출력한다.

이런 층이 여러 개인 퍼셉트론을 다층 퍼셉트론이라 한다.

단층 퍼셉트론으로는 표현하지 못한 것을 층을 늘려 표현할 수 있다.

XOR 게이트 구현

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

정리

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

좋은 웹페이지 즐겨찾기