퍼셉트론은 1957년 프랑크 로젠블랏(Frank Rosenblatt)이 고안한 알고리즘으로 신경망(딥러닝)의 기원이 되는 알고리즘이다.
퍼셉트론은 '다수'의 신호를 입력으로 받아 하나의 신호를 출력한다.
예로 입력들은 퍼셉트론을 통과하여 신호를 1과 0으로 신호를 출력하게 된다. x1, x2의 입력들이 주어졌을 때, 각각의 입력들에 가중치 값인 w1, w2와 연산을 진행하고 연산이 된 값들의 합이 한계, 즉 임계점(세타)을 넘어서면 y값(출력=신호)으로 1을 넘어서지 못하면 0을 출력하게 된다.
수식으로 나타내면 다음과 같다.
퍼셉트론은 입력된 값들에 가중치를 부여하는데, 가중치는 결과에 주는 '영향력'을 조절하는 요소로 작동한다.
AND 게이트는 입력이 둘이고 출력이 하나이다.
아래와 같이 입력이 모두 1일 때만 1을 출력하고 그 외에는 0을 출력한다.
AND 게이트를 만족하는 매개변수의 조합은 매우 많다.
예로 가중치와 세타가 다음과 같이 주어졌을 때(0.5, 0.5, 0.8), 입력이 들어온다면 1x0.5 + 1x0.5 = 1 > 0.8이 되어 1을 출력하게 된다.
NAND 게이트는 Not AND를 의미하며 AND 게이트의 출력을 뒤집은 것이 된다.
입력이 모두 1일 때만 0을 출력하고 그 외에는 1을 출력한다.
NAND 게이트 조합의 예를 보자.
가중치와 세타가 다음과 같이 주어졌을 때(-0.5, -0.5, -0.8), 입력이 들어온다면 1x-0.5 + 1x-0.5 = -1 < -0.8이 되어 0을 출력하게 된다.
OR 게이트는 입력 신호 중 하나 이상이 1이면 출력이 1이 되는 논리 회로이다.
OR 게이트 조합의 예를 보자.
가중치와 세타가 다음과 같이 주어졌을 때(0.5, 0.5, 0.4), x(1, 0)의 입력이 들어온다면 1x0.5 + 0x0.5 = 0.5 > 0.4이 되어 1을 출력하게 된다.
퍼셉트론의 구조는 게이트 3개 모두 똑같다는 것이다. 사실 다른 것은 매개변수(가중치, 임계값)의 값뿐이다.
간단하게 AND 게이트를 구현해보자.
def AND(x1, x2): # 2개의 입력값
w1, w2, theta = 0.5, 0.5, 0.7
tmp = w1*x1 + w2*x2
if tmp <= theta:
return 0
else:
return 1
AND(0, 0) -> 0출력
AND(0, 1) -> 0출력
AND(1, 0) -> 0출력
AND(1, 1) -> 1출력
앞의 게이트들에서 theta의 크기에 따라서 1, 0이 출력이 되었는데, 이제 theta를 '-b'로 치환하자. 이제 -b를 '편향'(bias)이라고 부르기로 한다.
위의 수식이 아래와 같이 바뀐 것 뿐이다.
바뀐 수식을 가지고 다시 AND 게이트를 구현해보자.
def AND(x1, x2):
x = np.array([x1, x2]) # 입력값
w = np.array([0.5, 0.5]) # 가중치
b = -0.7 # 편향
tmp = np.sum(w*x) + b # 연산
if tmp <= 0:
return 0
else:
return 1
편향(bias)와 가중치 w1, w2는 기능이 다르다.
딥러닝 역사에서 '긴 겨울'이라는 침체기를 선사한 문제인 XOR(베타적 논리합) 게이트 문제.
x1, x2 중 한쪽이 1일 때만 1을 출력하는 논리 회로이다.('베타적'이란 자기 외에는 거부한다는 의미)
AND, NAND, OR 게이트는 하나의 직선으로 0과 1의 영역을 나눌 수 있었다.
하지만 XOR 문제는 직선 하나로 나눈 영역만으로 표현할 수 없다는 한계가 있다.
퍼셉트론의 선형 모델로는 풀 수 없는 문제가 XOR 게이트 문제다.
퍼셉트론으로는 XOR 게이트를 표현할 수 없었다. 하지만 퍼셉트론에 '층을 쌓아' 다층 퍼셉트론(multi-layer perceptron)을 만들 수 있다.
다시 말해 단층 퍼셉트론의 한계를 층을 쌓아서 다층 퍼셉트론으로 한계를 넘어서게 된다.
XOR 게이트는 AND, NAND, OR 게이트를 조합하여 만들 수 있다.
단층 퍼셉트론 게이트를 아래의 그림과 같이 조합을 하게 되면 XOR 게이트 문제를 해결할 수 있게 된다.
x1, x2 입력값이 각각 NAND 게이트와 OR 게이트를 지나 각각 s1, s2라는 값이 출력된다.
그리고 s1, s2를 다시 AND 게이트의 입력값으로 넣으면 출력값 y가 출력이 된다.
그 출력값 y는 XOR 게이트 출력값과 일치하게 된다.
XOR 게이트를 함수로 작성해보자.
# 1 AND 게이트
def AND(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.7
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
# 2 NAND 게이트
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5])
b = 0.7
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
# 3 OR 게이트
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.2
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
# XOR 게이트
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
결과:
XOR(0, 0) -> 0 출력
XOR(0, 1) -> 1 출력
XOR(1, 0) -> 1 출력
XOR(1, 1) -> 0 출력
아래의 그림과 같이 XOR 게이트는 다층 구조의 네트워크다.
이렇게 층이 여러 개인 퍼셉트론을 다층 퍼셉트론이라 부른다.
퍼셉트론의 조합으로 복잡한 함수도 표현할 수 있게 되었다.
하지만 원하는 결과를 출력하도록 적절한 가중치 값을 정하는 작업은 수동으로 해야 한다는 문제가 있다.
이것을 해결하는 방법은, 가중치 매개변수의 적절한 값을 자동으로 찾아주는 방법을 찾는 것이다.
신경망은 그에 대한 해답을 줄 것이다.