밑바닥부터 시작하는 딥러닝을 읽고 딥러닝의 기원이 되는 알고리즘인 퍼셉트론에 대해 정리해봤습니다.
퍼셉트론은 다수의 신호를 입력(input)으로 받아 하나의 신호를 출력(output)하는 알고리즘입니다.
2개의 입력을 받아 하나의 신호를 출력하는 퍼셉트론을 수식으로 나타내면,
\[y = \begin{cases}0,(w_{1}x_{1} + w_{2}x_{2}\leq\theta)\\1,(w_{1}x_{1} + w_{2}x_{2}>\theta)\\\end{cases}\] 또는 \(\theta\)를 \(-b\)로 치환하여,
\[y = \begin{cases}0,(b+w_{1}x_{1} + w_{2}x_{2}\leq0)\\1,(b+w_{1}x_{1} + w_{2}x_{2}>0)\\\end{cases}\]
\(w\) : weight, \(b\): bias
퍼셉트론이 풀 수 있는 (예측할 수 있는) 문제는 AND, NAND, OR입니다.
x1 | x2 | y |
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
x1 | x2 | y |
0 | 0 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
x1 | x2 | y |
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 1 |
위 세가지 문제는 \((w_1, w_2, theta)\)에 각각 \((0.5, 0.5, 0.7), (-0.5, -0.5, -0.7), (1.5, 1.5, 0.7)\) 등을 대입하면 풀 수 있습니다.
이를 파이썬 함수로 구현하면,
def AND(x1, x2):
= 0.5, 0.5, 0.5
w1, w2, theta = x1*w1+x2*w2
tmp if tmp <= theta:
return 0
else:
return 1
def NAND(x1, x2):
= -0.5, -0.5, -0.7
w1, w2, theta = x1*w1+x2*w2
tmp if tmp <= theta:
return 0
else:
return 1
def OR(x1, x2):
= 1.5, 1.5, 0.7
w1, w2, theta = x1*w1+x2*w2
tmp if tmp <= theta:
return 0
else:
return 1
print('x1=0, x2=0 : ', AND(0,0))
x1=0, x2=0 : 0
print('x1=0, x2=1 : ', AND(0,1))
x1=0, x2=1 : 0
print('x1=1, x2=0 : ', AND(1,0))
x1=1, x2=0 : 0
print('x1=1, x2=1 : ', AND(1,1))
x1=1, x2=1 : 1
print('x1=0, x2=0 : ', NAND(0,0))
x1=0, x2=0 : 1
print('x1=0, x2=1 : ', NAND(0,1))
x1=0, x2=1 : 1
print('x1=1, x2=0 : ', NAND(1,0))
x1=1, x2=0 : 1
print('x1=1, x2=1 : ', NAND(1,1))
x1=1, x2=1 : 0
print('x1=0, x2=0 : ', OR(0,0))
x1=0, x2=0 : 0
print('x1=0, x2=1 : ', OR(0,1))
x1=0, x2=1 : 1
print('x1=1, x2=0 : ', OR(1,0))
x1=1, x2=0 : 1
print('x1=1, x2=1 : ', OR(1,1))
x1=1, x2=1 : 1
하지만, 퍼셉트론으로 XOR은 해결할 수 없습니다.
x1 | x2 | y |
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
위 문제를 그림으로 나타내면 다음과 같이 빨간점과 검은점을 구분할 수 있는 선을 그을 수 있어야 합니다.
곡선으로 선을 그린다면 구분할 수 있겠지만 퍼셉트론으로는 직선밖에 그릴 수 없으므로 해결할 수 없습니다. 즉, 퍼셉트론은 비선형의 영역을 표현할 수 없습니다.
이를 해결하기 위해 나온 것이 다층 퍼셉트론입니다. 말 그대로 퍼셉트론 층을 여러 개 갖는 알고리즘이며 앞에서 언급했던 퍼셉트론은 정확히 말하면 단층 퍼셉트론입니다.
XOR문제를 해결하려면 위에서 AND, NAND, OR 문제를 해결하기 위해 만들었던 퍼셉트론을 적절히 쌓아 만들면 됩니다.
def XOR(x1, x2):
= NAND(x1, x2)
s1 = OR(x1, x2)
s2 = AND(s1, s2)
y return y
print('x1=0, x2=0 : ', XOR(0,0))
x1=0, x2=0 : 0
print('x1=0, x2=1 : ', XOR(0,1))
x1=0, x2=1 : 1
print('x1=1, x2=0 : ', XOR(1,0))
x1=1, x2=0 : 1
print('x1=1, x2=1 : ', XOR(1,1))
x1=1, x2=1 : 0
첫번째 층에 NAND, OR를 풀기 위해 만들었던 퍼셉트론을 쌓고 두번째 층에 AND를 풀기 위해 만들었던 퍼셉트론을 쌓아 XOR문제를 해결했습니다.
이처럼 다층 퍼셉트론은 비선형의 영역까지도 표현할 수 있음을 알 수 있습니다.
퍼셉트론은 입출력을 갖춘 알고리즘
단층 퍼셉트론은 선형 영역만 표현할 수 있고, 다층 퍼셉트론은 비선형 영역도 표현 가능
For attribution, please cite this work as
nackta (2022, May 18). nackta blog: 퍼셉트론이란. Retrieved from https://nackta.github.io/til/2022-05-18-dlfromscratchch2/
BibTeX citation
@misc{nackta2022퍼셉트론이란, author = {nackta, }, title = {nackta blog: 퍼셉트론이란}, url = {https://nackta.github.io/til/2022-05-18-dlfromscratchch2/}, year = {2022} }