Perceptron - 다층 퍼셉트론 XOR 게이트(python 구현)

Yves (Taeyeon Kim)·2021년 11월 16일
0

Deep Learning

목록 보기
3/3
post-thumbnail

1. 퍼셉트론의 한계

1.1. XOR GATE

x1x_1x2x_2yy
000
101
011
110

XOR게이트는 배타적 논리합이라고 하는 논리 회로로, 입력값 x1x_1, x2x_2 중 하나만 1일 때 출력값으로 1을 보입니다.
하지만, 단순 퍼셉트론으로 XOR 게이트를 구현하는 것은 불가능하다.
이유는 XOR 논리회로의 경우, 각 입력값의 조합 (x1x_1, x2x_2)을 한 직선으로 구분지을 수 없기 때문이다.

[퍼셉트론 논리식]

y = {0(w1x1+w2x2+b0)1(w1x1+w2x2+b>0)\begin{cases} 0 &(w_1x_1 + w_2x_2 + b \le 0)\\ 1 &(w_1x_1 + w_2x_2 +b > 0) \end{cases}

예를 들어, OR 게이트를 먼저 살펴보면 가중치와 편향이 (w1w_1, w2w_2, b) = (0.4, 0.4, -0.2) 일때, OR 게이트의 진리표를 만족한다.

OR 게이트 진리표
x1x_1x2x_2yy
000
101
011
111

위와 같은 가중치와 편향을 가진 퍼셉트론을 식으로 표현하면 다음과 같고,
y = {0(0.4x1+0.4x20.20)1(0.4x1+0.4x20.2>0)\begin{cases} 0 &(0.4x_1 + 0.4x_2 -0.2 \le 0)\\ 1 &(0.4x_1 + 0.4x_2 -0.2 > 0) \end{cases}

이 퍼셉트론은 하나의 직선으로 각 출력 값(0과 1)을 구분하는 두 영역을 만들 수 있다.

(x1x_1, x2x_2) = (0, 0)일 때 출력값은 0(동그라미로 표시)
(x1x_1, x2x_2) = (1, 0), (0, 1), (1, 1)일 때 출력값은 1(세모로 표시)
(이미지출처)


하지만, XOR 게이트의 경우에는 각 조합에 따른 출력값들을 하나의 직선으로 나누는 게 불가능하다.
다음 그림을 보면 이해가 쉽다.
(이미지출처)


1.2. 선형 및 비선형

직선이라는 조건을 없앤다면 퍼셉트론의 XOR 게이트는 가능하다.
예를 들어, 다음 그림과 같이 곡선을 이용하는 방법이 있다.
참고로 곡선의 영역을 비선형 영역, 직선의 영역은 선형 영역이라고 하며 아래 그림은 비선형 역역이라고 할 수 있다.
(이미지출처)

2. 다층 퍼셉트론

2.1. 퍼셉트론의 층 쌓기

퍼셉트론 하나로(하나의 직선) XOR 논리를 만족할 수 없었지만, 비선형 영역 개념을 이용하여 XOR 진리표에 따른 출력값들을 정확히 나눌 수 있었다.
퍼셉트론은 층을 쌓아 다층 퍼셉트론(multi-layer perceptron)을 만들 수 있는데, 이 방법으로 XOR을 표현할 수 있다.

XOR 게이트를 만드는 방법은 다양하지만, AND, NAND, OR 게이트를 서로 조합하는 방식을 알아보고자 한다.

위 그림과 같이 각 게이트를 한번씩 사용하면서 총 2개의 layer를 사용했다.
x1x_1, x2x_2가 NAND와 OR 게이트의 입력이 되고, NAND와 OR 게이트의 출력이 AND 게이트의 입력으로 들어간다.
다음은 NAND으로부터의 출력을 S1S_1, OR의 출력을 S2S_2로 하여 XOR 게이트의 진리표다.

XOR 게이트 진리표
(x1x_1, x2x_2)(S1S_1, S2S_2)yy
(0, 0)(1, 0)0
(1, 0)(1, 1)1
(0, 1)(1, 1)1
(1, 1)(0, 1)0

(참고)

NAND 게이트 진리표
x1x_1x2x_2yy
001
101
011
110
OR 게이트 진리표
x1x_1x2x_2yy
000
101
011
111

첫번째 레이어의 출력인 (S1S_1, S2S_2)을 두번째 레이어(AND 게이트)에 입력하여 출력하면 XOR 게이트를 만족하는 값을 확인할 수 있다.

2.2. XOR 게이트 python 구현

#AND GATE
def AND(x1, x2):
    x = np.array([x1, x2]) #입력값
    w = np.array([0.4, 0.4]) #가중치
    b = -0.7 #편향
    tmp = np.sum(w*x) + b
    if tmp > 0:
        return 1
    else:
        return 0

#NAND GATE
def NAND(x1, x2):
    x = np.array([x1, x2]) #입력값
    w = np.array([-0.4, -0.4]) #가중치
    b = 0.7 #편향
    tmp = np.sum(w*x) + b
    if tmp > 0:
        return 1
    else:
        return 0

#OR GATE
def OR(x1, x2):
    x = np.array([x1, x2]) #입력값
    w = np.array([0.4, 0.4]) #가중치
    b = -0.2 #편향
    tmp = np.sum(w*x) + b
    if tmp > 0:
        return 1
    else:
        return 0

#XOR GATE
def XOR(x1, x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, x2)
    return y

===============   
XOR(0, 0) #0출력
XOR(1, 0) #1출력
XOR(0, 1) #1출력
XOR(1, 1) #0출력

구현된 XOR을 뉴런을 활용한 퍼셉트론으로 표시한 그림은 다음과 같다.
(이미지출처)
AND, OR, NAND의 경우 모두 단층 퍼셉트론이지만, XOR은 이제 2층으로 구성된 퍼셉트론인 것을 확인할 수 있으며 이를 다층 퍼셉트론이라 한다. (0~2까지 총 3개의 층이지만, 가중치를 갖는 층을 기준으로 2층이라 한다)

정리
1) 0층의 두개 뉴런: x1x_1, x2x_2(입력 신호)를 받아 1층 뉴런으로 신호를 보냄
2) 1층의 두개 뉴런: 2층 뉴런으로 신호를 보냄
3) 2층 뉴런: 최종값 y 출력



(DeepLearingfromScratch밑바닥부터시작하는딥러닝(사이토고키))\Bigg(Deep Learing from Scratch - 밑바닥부터 시작하는 딥러닝 (사이토 고키) \Bigg)
도서를 참고하여 공부한 내용을 정리한 것입니다.

last modified : 16-11-2021

0개의 댓글