퍼셉트론이란

밑바닥부터 시작하는 딥러닝

밑바닥부터 시작하는 딥러닝을 읽고 딥러닝의 기원이 되는 알고리즘인 퍼셉트론에 대해 정리해봤습니다.

nackta true
2022-05-18

1️⃣ 퍼셉트론이란

퍼셉트론은 다수의 신호를 입력(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

2️⃣ 퍼셉트론의 한계

퍼셉트론이 풀 수 있는 (예측할 수 있는) 문제는 AND, NAND, OR입니다.

위 세가지 문제는 \((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):
    w1, w2, theta = 0.5, 0.5, 0.5
    tmp = x1*w1+x2*w2
    if tmp <= theta:
        return 0
    else:
        return 1

def NAND(x1, x2):
    w1, w2, theta = -0.5, -0.5, -0.7
    tmp = x1*w1+x2*w2
    if tmp <= theta:
        return 0
    else:
        return 1
    
def OR(x1, x2):
    w1, w2, theta = 1.5, 1.5, 0.7
    tmp = x1*w1+x2*w2
    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은 해결할 수 없습니다.

위 문제를 그림으로 나타내면 다음과 같이 빨간점과 검은점을 구분할 수 있는 선을 그을 수 있어야 합니다.

곡선으로 선을 그린다면 구분할 수 있겠지만 퍼셉트론으로는 직선밖에 그릴 수 없으므로 해결할 수 없습니다. 즉, 퍼셉트론은 비선형의 영역을 표현할 수 없습니다.

3️⃣ 다층 퍼셉트론

이를 해결하기 위해 나온 것이 다층 퍼셉트론입니다. 말 그대로 퍼셉트론 층을 여러 개 갖는 알고리즘이며 앞에서 언급했던 퍼셉트론은 정확히 말하면 단층 퍼셉트론입니다.

XOR문제를 해결하려면 위에서 AND, NAND, OR 문제를 해결하기 위해 만들었던 퍼셉트론을 적절히 쌓아 만들면 됩니다.

def XOR(x1, x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    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문제를 해결했습니다.

이처럼 다층 퍼셉트론은 비선형의 영역까지도 표현할 수 있음을 알 수 있습니다.

✅ 요약

Citation

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}
}