본문 바로가기

Python/DeepLearning

퍼셉트론(Perceptron) 알고리즘

- 다수의 신호를 입력으로 받아 하나의 신호를 출력

- '흐른다/흐르지않는다'(1/0)으로 구분

- 입력 신호가 뉴런에 보내질 때에 고유한 가중치가 곱해짐

- 뉴런에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력

- 한계를 임계값이라고 하며 θ 로 표현함

- 복수의 입력 신호 각각에 고유한 가중치를 부여. 가중치는 신호가 결과에 주는 영향력을 조절하는 요소로 작용

- 가중치가 클수록 신호가 더 중요하다!

- Python으로 간단하게 구현해보기

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'

def OR(x1, x2):
	w1, w2, theta = 0.5, 0.5, 0.4
	tmp = x1*w1 + x2*w2
	if tmp <= theta:
		return '0'
	elif tmp > theta:
		return '1'

def NAND(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'
		
print('INPUT (0,0) AND : '+AND(0,0)+', NAND : '+NAND(0,0)+', OR : '+OR(0,0))
print('INPUT (1,0) AND : '+AND(1,0)+', NAND : '+NAND(1,0)+', OR : '+OR(1,0))
print('INPUT (0,1) AND : '+AND(0,1)+', NAND : '+NAND(0,1)+', OR : '+OR(0,1))
print('INPUT (1,1) AND : '+AND(1,1)+', NAND : '+NAND(1,1)+', OR : '+OR(1,1))

- θ를 b로 표현한다. 여기서 b는 편향(bias)의 의미를 갖는다.

- numpy로 바꿔보자.

import numpy as np

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

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

가중치와 편향을 도입한 AND 게이트

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

 하지만 이 퍼셉트론도 XOR은 표현하지 못한다. 퍼센트론은 직선 하나로 나눈 영역밖에 표현할 수 없기 때문이다. 이러한 한계 때문에 다층 퍼셉트론이 등장한다. 다층 퍼셉트론(multi-layer perceptron)은 층을 쌓아 표현할 수 없는 게이트를 표현할 수 있게 해준다.

 기존의 게이트를 조합하여 XOR 게이트를 만든다고 생각해보자. 아래 그림과 같이 AND, NAND, OR 게이트를 하나씩 조합해 구현할 수 있다.

https://ko.wikipedia.org/wiki/XOR_%EA%B2%8C%EC%9D%B4%ED%8A%B8

이것을 파이썬으로 구현해보면 다층 퍼셉트론에 대해 이해할 수 있다.

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