Perceptron
perceptron은 다수의 신호를 입력으로 받아 하나의 신호를 출력한다.
아래는 2개의 입력을 받는 perceptron이다.
- $ x $ : 입력
- $ w $ : 가중치(weight)로 말 그대로 해당 입력이 얼마나 중요한지를 나타낸 값이다.
- 이 값이 크면 출력에 영향을 더 크게 미친다.
- $ b $ : 편향(bias)으로 해당 뉴런이 얼마나 쉽게 활성화될 수 있느냐를 조절하는 값이다.
- 이 값이 크면 입력이 작더라도 활성화될 수 있다.
- $ y $ : 출력
출력의 경우 노드에 전달된 값의 합이 0을 넘을 때 1을 출력하며, 0을 넘지 않으면 0을 출력한다.
그러면 이 임계값에 대해서는 아래와 같이 나타낼 수 있다.
$ y =
\begin{cases}
0 & \text{if } w_1x_1 + w_2x_2 + b \leq 0 \\
1 & \text{if } w_1x_1 + w_2x_2 + b > 0
\end{cases} $
Perceptron의 한계와 MLP(multi-layer perceptron)
논리 회로를 통해 perceptron의 한계에 대해 알아보고 다층 perceptron으로 이 한계를 극복하는 것에 대해 알아보자.
Logic gate
perceptron을 사용하여 논리 회로를 만들 수도 있다.
AND, NAND, OR gate를 perceptron으로 만들어보자.
AND gate
𝓧₁ | 𝓧₂ | 𝑦 |
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
def AND(x1: int, x2: int) -> int:
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.75
sum = np.sum(w*x) + b
return 1 if 0 < sum else 0
NAND gate
𝓧₁ | 𝓧₂ | 𝑦 |
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
def NAND(x1: int, x2: int) -> int:
x = np.array([x1, x2])
w = np.array([-0.5, -0.5])
b = 0.75
sum = np.sum(w*x) + b
return 1 if 0 < sum else 0
OR gate
𝓧₁ | 𝓧₂ | 𝑦 |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
def OR(x1: int, x2: int) -> int:
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.25
sum = np.sum(w*x) + b
return 1 if 0 < sum else 0
XOR gate
다른 논리회로는 perceptron으로 만들 수 있는데, XOR gate의 경우 perceptron으로 만들 수가 없다.
𝓧₁ | 𝓧₂ | 𝑦 |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
AND, NAND, OR gate 같은 경우 아래와 같이 $x_1, x_2$ 에 대해 직선(한 층의 perceptron)을 통해 출력을 구분할 수 있다.
하지만 XOR gate의 경우 직선을 통해 출력을 구분할 수가 없다.
즉, 한 층의 perceptron으로는 XOR gate를 구현할 수 없다.
-> 단층 퍼셉트론으로는 비선형 영역을 분리할 수 없다
하지만 직선이 아니라면 출력을 구분할 수가 있게 된다.
MLP로 XOR gate 구현
기존의 논리 회로를 조합하여 XOR gate를 만들 수 있다.
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
return AND(s1, s2)
이를 perceptron으로 표현하면 아래와 같고, 이렇게 여러 층으로 perceptron을 구성한 것을 MLP(multi-layer perceptron)이라고 한다.
이처럼 단층 perceptron으로는 표현하지 못했던 것을 층을 늘려서 표현할 수 있게된다.