퍼셉트론이란?
퍼셉트론(Perceptron)은 다수의 신호를 입력으로 받고, 그 결과로 하나의 신호를 출력하는 것을 말한다.
퍼셉트론하면 대표적으로 보던 바로 그 그림이다.

x1과 x2는 이제 0과 1로 이루어진 입력신호이고, w1과 w2는 그 입력에 곱해지는 가중치이다.
이렇게 구해진 x1 * w1 + x2 * w2가 정해진 값 세타를 넘으면 1을 출력한다.
이를 식으로 나타내면

이렇게 나오게 되며, 가중치가 클수록 해당 신호가 중요하다는 의미가 된다.
논리회로
- AND 게이트
입력 신호와 출력 신호의 대응표를 진리표라고 하는데, AND 게이트의 진리표는 다음과 같다.
| x1 | x2 | y |
| 0 | 0 | 0 |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 1 | 1 |
AND는 입력이 모두 1일 때만, 1을 반환한다.
- NAND 게이트
NAND는 Not AND를 의미한다.
AND의 결과를 뒤집으면 된다.
| x1 | x2 | y |
| 0 | 0 | 1 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 1 | 0 |
- OR 게이트
OR 신호는 입력 신호 중 하나면 1이면, 1을 반환한다.
| x1 | x2 | y |
| 0 | 0 | 0 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 1 | 1 |
퍼셉트론 구현하기
간단한 코드로 한 번 구현해보자.
AND 게이트를 구현한다면, 다음과 같을 것이다.
def and_gate(
x1,
x2,
w1: float = 0.5,
w2: float = 0.5,
theta: float = 0.7,
):
y = x1 * w1 + x2 * w2
if y <= theta:
return 0
else:
return 1
여기서 theta를 넘겨서 수식을 편집해보면
b + w1x1 + w2x2 <= 0이 될 것이다.
여기서 b는 theta에 -1을 곱한 값이다.
그리고 여기서 b는 편향(bias)라고 한다.
퍼셉트론은 입력 신호에 가중치를 곱한 값과 bias를 합하여 0이 넘는지를 확인하고 값을 출력한다.
편향을 도입해서 and_gate를 수정해보자.
import numpy as np
def and_gate(
x1,
x2,
w1: float = 0.5,
w2: float = 0.5,
theta: float = 0.7,
) -> int:
x = np.array([x1, x2])
w = np.array([w1, w2])
b = theta * -1
y = np.sum(x * w) + b
if y <= 0: return 0
else: return 1
이거를 조금만 수정하면 nand_gate, or_gate도 바로 만들 수 있다.
import numpy as np
def nand_gate(
x1,
x2,
w1: float = 0.5,
w2: float = 0.5,
theta: float = 0.7,
) -> int:
x = np.array([x1, x2])
w = np.array([-w1, -w2])
b = theta
y = np.sum(x * w) + b
if y <= 0: return 0
else: return 1
import numpy as np
def or_gate(
x1,
x2,
w1: float = 0.5,
w2: float = 0.5,
theta: float = 0.7,
) -> int:
x = np.array([x1, x2])
w = np.array([-w1, -w2])
b = theta * -1
y = np.sum(x * w) + b
if y <= 0: return 0
else: return 1
퍼셉트론의 한계
하지만 지금까지의 식으로는 XOR을 만들 수 없다.

이런 선형으로는 XOR을 만들 수 없기 때문이다.
그렇기에 지금까지 만든 퍼셉트론을 쌓아서 XOR을 표현해야 한다.
다층 퍼셉트론

이렇게 XOR 게이트를 연결해서 만들 수 있다.
import numpy as np
def xor_gate(
x1,
x2,
w1: float = 0.5,
w2: float = 0.5,
theta: float = 0.7,
) -> int:
s1 = nand_gate(x1, x2, w1, w2, theta)
s2 = or_gate(x1, x2, w1, w2, theta)
y = and_gate(s1, s2, w1, w2, theta)
return y
x1, x2를 0층
s1, s2를 1층
y를 2층이라고 하며, 이렇게 퍼셉트론을 쌓아 올린 구조를 다층 퍼셉트론이라고 한다.
이렇게 다층 퍼셉트론은 단층 퍼셉트론에서는 해결하지 못했던 문제를 해결 가능하다.