
퍼셉트론(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)라는 기술이 등장했다.
퍼셉트론은 데이터를 선형적으로 분류할 때 적합한 알고리즘이다.
아래와 같이 학습이 진행됨에 따라 매개변수(가중치, 편향)를 조정해가며 적절한 값을 찾아낸다.

📑 참조