퍼셉트론(perceptron)이란 딥러닝의 근간이 되는 알고리즘이다.
퍼셉트론은 다수의 신호를 받아 하나의 신호를 출력한다.
x1
과 x2
는 입력 신호, y
는 출력 신호, w1
과 w2
는 가중치(weight)를 의미한다. 뉴런
또는 노드
라고 부른다.가중치
가 곱해진다.임계값(θ)
을 넘을 때만 1
을 출력한다.이를 수식으로 나타내면, 아래와 같다.
위의 식에서 θ
를 -b
로 치환하면 다음과 같다.
위의 식에서 b를 편향(bias)이라 한다.
위의 식에서 두 입력 (x1, x2)이 모두 0이어도 결과로 편향 값을 출력한다.
AND 게이트는 두 개의 입력이 모두 1이어야 1을 반환하는 게이트다.
위와 같은 진리표의 AND 게이트를 퍼셉트론으로 표현해보자.
이를 위해서는 w1, w2, θ의 값을 적절하게 정해야 한다.
예를 들어,
일 때 AND 게이트의 조건을 만족한다.
NAND 게이트는 AND 게이트의 출력을 반대로 한 것과 같다.
NAND 게이트에서는 w1, w2, θ의 값을 위와 같이 정해주면 된다.
OR 게이트는 둘 중 하나의 값만 1이어도 1을 반환하는 게이트다.
OR 게이트에서는 w1, w2, θ의 값을 위와 같이 정해주면 된다.
import numpy as np
def AND_basic(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
inputs = [(0, 0), (1, 0), (0, 1), (1, 1)]
for x1, x2 in inputs:
y = AND_basic(x1, x2)
print('({x1}, {x2}) -> {y}'.format(x1=x1, x2=x2, y=y))
🔮 출력
>> (0, 0) -> 0
>> (1, 0) -> 0
>> (0, 1) -> 0
>> (1, 1) -> 1
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(w*x) + b
if tmp <= 0:
return 0
else:
return 1
inputs = [(0, 0), (1, 0), (0, 1), (1, 1)]
for x1, x2 in inputs:
y = AND(x1, x2)
print('({x1}, {x2}) -> {y}'.format(x1=x1, x2=x2, y=y))
🔮 출력
>> (0, 0) -> 0
>> (1, 0) -> 0
>> (0, 1) -> 0
>> (1, 1) -> 1
import numpy as np
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
for x1, x2 in inputs:
y = NAND(x1, x2)
print('({x1}, {x2}) -> {y}'.format(x1=x1, x2=x2, y=y))
🔮 출력
>> (0, 0) -> 1
>> (1, 0) -> 1
>> (0, 1) -> 1
>> (1, 1) -> 0
import numpy as np
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
for x1, x2 in inputs:
y = OR(x1, x2)
print('({x1}, {x2}) -> {y}'.format(x1=x1, x2=x2, y=y))
출력
>> (0, 0) -> 0
>> (1, 0) -> 1
>> (0, 1) -> 1
>> (1, 1) -> 1
XOR 게이트는 배타적 논리합이라는 논리 회로다.
두 입력 중 하나의 값만 1일 때 1을 반환한다.
단층 퍼셉트론은 아래와 같이 직선으로 나뉜 두 영역을 만든다.
하지만 XOR은 직선으로 두 영역을 나눌 수 없기 때문에,
단층 퍼셉트론으로는 XOR 게이트를 구현할 수 없다.
만약 직선, 즉 선형이라는 제약을 없앤 비선형이라면 아래와 같이 영역을 나눌 수 있다.
단층 퍼셉트론으로는 XOR을 구현할 수 없지만, 다층 퍼셉트론 (MLP, Multi-Layer Perceptron)으로 XOR을 구현할 수 있다.
먼저, 아래의 그림처럼 x1, x2를 각각 NAND
와 OR
게이트에 보낸 다음, 그 결과 값들을 AND
게이트에 보내면 XOR
게이트를 구현할 수 있다.
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
for x1, x2 in inputs:
y = XOR(x1, x2)
print('({x1}, {x2}) -> {y}'.format(x1=x1, x2=x2, y=y))
🔮 출력
>> (0, 0) -> 0
>> (1, 0) -> 1
>> (0, 1) -> 1
>> (1, 1) -> 0
XOR을 해결한 MLP의 중간 층처럼,
입력층과 출력층 사이의 층을 은닉 층 (hidden layer)이라고 한다.
은닉 층이 깊을수록 더욱 복잡한 연산도 수행할 수 있다.
하지만 은닉층이 깊어짐에 따라 학습시켜야 할 파라미터 또한 증가했고, 수많은 파라미터들을 모두 적절히 학습시키는 것은 매우 어려운 일이었다.
이를 위해 역전파(Backpropagation)라는 기술이 등장했다.
퍼셉트론은 데이터를 선형적으로 분류할 때 적합한 알고리즘이다.
아래와 같이 학습이 진행됨에 따라 매개변수(가중치, 편향)를 조정해가며 적절한 값을 찾아낸다.
📑 참조