Perceptron


Perceptron

  • 퍼셉트론 : 다수의 신호를 입력받아 하나의 신호를 출력한다. 퍼셉트론은 뉴런(노드)로 부터 가중치를 곱한 신호의 총합이 정해진 한계를 넘어설 때 1을 출력한다. 그 한계를 임계값$(\theta)$이라고 한다.
\[y= \begin{cases} 0(w_1x_1+w_2x_2\le\theta)\\ 1(w_1x_1+w_2x_2>\theta) \end{cases}\]

퍼셉트론은 복수의 입력 신호 각각에 고유한 가중치를 부여한다. 가중치는 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용한다. 즉, 가중치가 클수록 해당 신호의 중요도가 높아짐을 알 수 있다.

논리회로

AND 게이트

And 게이트는 입력이 모두 1일 때만 1을 출력하고, 그 외에는 0을 출력한다.

$x_1$ $x_2$ $y$
0 0 0
1 0 0
0 1 0
1 1 1

[AND 게이트의 진리표]

AND 게이트를 퍼셉트론으로 표현하고자 한다면, 진리표대로 작동하는 $w_1,w_2,\theta$의 값을 정하면 되며, 그 매개변수의 조합은 무수히 많다. 이때 $\theta$를 $-b$로 치환하여 식을 전개하면 다음과 같으며, b를 편향이라고 한다.

\[y= \begin{cases} 0(b+w_1x_1+w_2x_2\le0)\\ 1(b+w_1x_1+w_2x_2>0) \end{cases}\]

위 식을 넘파이를 활용해 구현해보자

import numpy as np
	x = np.array([x1, x2])
	w = np.array([w1, w2])
	b = -0.7 #적당한 값(매개변수)
	tmp = np.sum(wx) + b
	if tmp <= 0:
		return 0
	else
		return 1

NAND, OR 게이트

NAND는 Not AND를 의미하며 그 출력은 AND게이트를 뒤집은 것이 된다.

$x_1$ $x_2$ $y$
0 0 1
1 0 1
0 1 1
1 1 0

[NAND 게이트의 진리표]

단순히 AND게이트를 구현하는 매개변수의 부호를 모두 반전하기만 하면 NAND게이트가 된다. OR게이트는 입력 신호 중 하나 이상이 1이면 출력이 1이 되는 논리 회로이다.

$x_1$ $x_2$ $y$
0 0 0
1 0 1
0 1 1
1 1 1

[OR 게이트의 진리표]

퍼셉트론

가중치와 편향

최상단의 식에서 $\theta$를 $-b$로 치환하여 식을 전개하면 다음과 같으며, b를 편향이라고 한다.

\[y= \begin{cases} 0(b+w_1x_1+w_2x_2\le0)\\ 1(b+w_1x_1+w_2x_2>0) \end{cases}\]

위 식과 넘파이를 활용해 AND 게이트를 구현해보자.

def AND(x1, x2):
	x = np.array([x1, x2])
	w = np.array([0.5, 0.5])
	b = -0.7 #적당한 값(매개변수)
	tmp = np.sum(wx) + b
	if tmp <= 0:
		return 0
	else
		return 1

정리하자면 가중치(w1, w2)는 각 입력 신호가 결과에 주는 영향력을 조절하는 매개변수고, 편향(b)은 뉴런이 얼마나 쉽게 활성화 하느냐를 조정하는 매개변수이다. 이어서 NAND와 OR게이트를 구현해보자.

def NAND(x1, x2):
	x = np.array([x1, x2])
	w = np.array([-0.5, -0.5])
	b = 0.7
	tmp = np.sum(wx) + b
	if tmp <= 0:
		return 0
	else
		return 1

def OR(x1, x2):
	x = np.array([x1, x2])
	w = np.array([1, 1])
	b = -0.2
	tmp = np.sum(wx) + b
	if tmp <= 0:
		return 0
	else
		return 1

XOR 게이트

XOR 게이트는 배타적 논리합이라는 논리 회로입니다. $x1, x2$ 중 한쪽이 1일 때만 1을 출력한다.

$x_1$ $x_2$ $y$
0 0 0
1 0 1
0 1 1
1 1 0

[XOR 게이트의 진리표]

좌표평면 위에서 $(b,\ w1, \ w2)=(-0.5,1.0,1.0)$일 때, AND, NAND, OR 게이트는 직선 하나로 나눌 수 있으며 그것을 선형 영역이라고 부르며, 직선이 아닌 곡선으로 나누어야 할 때에는 비선형 영역이라고 부른다. 퍼셉트론 하나로는 XOR 게이트를 표현할 수 없다. 다만, 퍼셉트론을 층을 쌓아 다층 퍼셉트론을 만들어 XOR 게이트의 표현이 가능하다. 먼저 처음 제공되는 $x_1, x_2$를 각각 NAND, OR게이트에 입력한 후 출력된 각각의 결과를 AND게이트에 입력해주면 된다. 그 진리표는 다음과 같다.

$x_1$ $x_2$ $s_1$ $s_2$ Y
0 0 1 0 0
1 0 1 1 1
0 1 1 1 1
1 1 0 1 0

[XOR 게이트의 진리표]

원리를 알았으므로 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

이처럼 다층 퍼셉트론이 동작하는 방법을 더 자세히 서술하면 다음과 같다.

  1. 0층의 두 뉴런이 입력 신호를 받아 1층의 뉴런으로 신호를 보낸다.
  2. 1층의 뉴런이 2층의 뉴런으로 신호를 보내고, 2층의 뉴런은 y를 출력한다.



Enjoy Reading This Article?

Here are some more articles you might like to read next:

  • [CS231n]Exercise1.5 - Features
  • [CS231n]Exercise1.4 - Two Layer Net
  • [CS231n]Exercise1.3 - Softmax
  • [CS231n]Exercise1.2 - Support Vector Machine