퍼셉트론(Perceptron)이란?
퍼셉트론은 프랑크 로젠블라트(Frank Rosenblatt)가 1957년에 고안한 알고리즘으로 신경망(딥러닝)의 기원이 되는 알고리즘이다.

퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력한다.
그림에서 원은 노드 또는 뉴런이라 하며, x1과 x2는 입력신호, w1과 w2는 각각의 가중치, y는 출력신호이다.
각 입력신호와 가중치의 곱의 합이 임계값을 넘을 때, 1을 출력하고 뉴런이 활성화한다.
즉, 퍼셉트론은 입력신호(x1, x2), 출력신호(y), 가중치(w:weight), 임계값(theta)으로 구성되며,
각 입력신호와 가중치의 곱과 편향의 합이 임계값을 넘을 때, 뉴런을 활성화한다. 이 때, 가중치는 입력신호가 활성화에 얼마나 큰 영향을 주는가를 나타내는 값이된다.
수식으로 나타내면 아래와 같다.

편향의 도입

위의 식에서 theta는 -b로 치환되며, b를 편향(bias)라고 한다. 편향은 뉴런이 얼마나 잘 활성화되는 지를 나타내는 값이 된다.
퍼셉트론 구현
import numpy as np
def AND(x1, x2):
x = np.array([x1, x2]) #입력신호
w = np.array([0.5, 0.5]) #가중치
b = 0.7
tmp = np.sum(x * w)
if tmp <= b:
return 0
else:
return 1
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5])
b = -0.7
tmp = np.sum(w*x)
if tmp <= b:
return 0
else:
return 1
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = 0.4
tmp = np.sum(w*x)
if tmp <= b:
return 0
else:
return 1
퍼셉트론의 한계
여기서 말하는 퍼셉트론은 단층 퍼센트론을 말하며 가중치를 가지는 노드가 1층으로 구성되었다. 단층 퍼셉트론으로 AND, OR, NAND와 같은 논리게이트를 구현할 수 있지만, XOR(배타적 논리합)은 구현할 수 없다. 단층 퍼셉트론은 직선으로 나뉜 두 영역만을 표현할 수 있기 때때문이다. 단층 퍼셉트론으로 표현할 수 있는 영역을 선형 영역이라 한다.

그렇다면 위의 그림에서 어떻게 영역을 나눌 수 있을까? 선형이 아닌 비선형으로 영역을 나눈다면 가능하다.

다층 퍼셉트론
잠시 논리회로를 따져보았을 때, 배타적 논리합은 NAND, AND, OR게이트의 조합으로 표현할 수 있다. NAND, AND, OR 게이트로 표현할 수 있다는 말은 단층 퍼셉트론을 다층으로 만든다면 XOR 게이트 또한 표현할 수 있다는 말이된다. 즉, 다층 퍼셉트론(multi-layer perceptron)을 통해 비선형으로 영역을 나눌 수 있게 된다.
import numpy as np
def AND(x1, x2):
x = np.array([x1, x2]) #입력신호
w = np.array([0.5, 0.5]) #가중치
b = 0.7
tmp = np.sum(x * w)
if tmp <= b:
return 0
else:
return 1
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5])
b = -0.7
tmp = np.sum(w*x)
if tmp <= b:
return 0
else:
return 1
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = 0.4
tmp = np.sum(w*x)
if tmp <= b:
return 0
else:
return 1
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y

XOR은 위의 그림처럼 다층 구조의 네트워크이다. 이처럼 층이 여러개인 퍼셉트론을 다층 퍼셉트론이라고 한다.
'Artificial Intelligence' 카테고리의 다른 글
[Python] Regression analysis - Boston (0) | 2020.01.29 |
---|---|
[Python] Iris 데이터 분석 (0) | 2020.01.28 |
[머신러닝] 알고리즘 분류 (0) | 2020.01.26 |
[머신러닝] 파이썬 라이브러리 (0) | 2020.01.25 |
[머신러닝] 미니콘다 가상환경 설치 (0) | 2020.01.25 |
댓글