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

kimkihoon·2021년 11월 26일
0

퍼셉트론

퍼셉트론이란?

퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력하는 것이다.

입력으로 2개의 신호를 받은 퍼셉트론의 예시이다. x는 입력신호를 w는 가중치를 나타낸다. 그림의 원을 뉴런 혹은 노드라고 부른다. 입력 신호가 뉴런에 보내질 때는 각각 고유한 가중치가 곱해진다. 이렇게 보내진 신호의 종합이 정해진 한계를 넘어서면 1을 출력을 하게 된다. 이를 식으로 나타내면 다음과 같다.

단순한 논리 회로

AND 게이트


이 AND 게이트를 퍼셉트론으로 표현하려면 위의 식의 w1,w2,세타 값을 (0.5,0.5,0.7) 일 때 만족을 하게된다.

NAND 게이트와 OR 게이트


NAND 게이트를 만족하는 w1,w2,세타 값을 조합해보면 (-0.5,-0.5,-0.7) 이라는 값들을 생각해 볼 수 있다. NAND 게이트는 AND를 만족하는 수들의 부호를 전부 뒤바꿔주면 간단하게 구현할 수 있다.

OR 게이트를 만족하는 w1,w2,세타 값은 (0.5,0.5,0) 을 생각해 볼 수 있다.

퍼셉트론 구현하기

AND 게이트 구현

def AND(x1,x2):
    w1,w2,theta = 0.5,0.5,0.7
    tmp = x1*w1 + x2*w2
    if tmp <= theta:
        return 0
    elif tmp > theta:
        return 1
dx = [0,1,0,1]
dy = [0,0,1,1]

for i in range(4):
    nx = dx[i]
    ny = dy[i]
    print(AND(nx,ny))

이제 여기에서 가중치와 편향을 도입해서 AND 게이트를 구현하면 다음과 같다.

import numpy as np

def AND(x1,x2):
    x = np.array([x1,x2])
    w = np.array([0.5,0.5])
    b = -0.7
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1
        
dx = [0,1,0,1]
dy = [0,0,1,1]

for i in range(4):
    nx = dx[i]
    ny = dy[i]
    print(AND(nx,ny))

여기서 w1과 w2는 각 입력 신호가 신호 결과에 주는 영향력을 조절하는 매개변수이고 편향은 뉴런이 얼마나 쉽게 결과값 1을 출력하느냐를 조정하는 매개변수이다. 만약 b가 -0.1이면 각 입력 신호에 가중치를 곱한 값들의 합이 0.1을 초과할 때만 뉴런이 활성화된다.
이와 비슷한 방식으로 NAND 게이트와 OR 게이트를 구현하면 다음과 같다.

import numpy as np

def NAND(x1,x2):
    x = np.array([x1,x2])
    w = np.array([-0.5,-0.5])
    b = 0.7
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1

def OR(x1,x2):
    x = np.array([x1,x2])
    w = np.array([0.5,0.5])
    b = -0.2
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1

dx = [0,1,0,1]
dy = [0,0,1,1]

for i in range(4):
    nx = dx[i]
    ny = dy[i]
    print('NAND:',NAND(nx,ny))
    print('OR:',OR(nx,ny))

퍼셉트론의 한계

XOR 게이트


xor 게이트는 베타적 게이트로 x1과 x2중 어느 하나가 1일 때만 1을 출력하고 나머지는 모두 0을 출력한다.

xor 게이트를 그래프로 나타내면 다음과 같은데 동그라미와 세모의 영역을 직선하나로 나눌 수 없기 때문에(if,else로 구현 불가능) 지금까지 생각한 퍼셉트론으로는 구현을 할 수가 없다. 그렇기 때문에 직선이라는 선형 영역이 아닌 비선형 영역으로 이것을 나누어야 한다.
따라서 우리는 퍼셉트론의 층을 하나 더 쌓아서 다층 퍼셉트론을 통해 XOR 게이트를 표현하고자 한다.

이렇게 x1과 x2의 입력신호를 NAND와 OR의 입력신호로 주고 그곳에서 나온 결과값을 AND의 입력신호로 주면 XOR 게이트를 구현할 수 있게 된다.
XOR 게이트의 진리표는 다음과 같다.

그러면 이 XOR 게이트를 파이썬으로 구현해보자.

import numpy as np

def AND(x1,x2):
    x = np.array([x1,x2])
    w = np.array([0.5,0.5])
    b = -0.7
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1

def NAND(x1,x2):
    x = np.array([x1,x2])
    w = np.array([-0.5,-0.5])
    b = 0.7
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1

def OR(x1,x2):
    x = np.array([x1,x2])
    w = np.array([0.5,0.5])
    b = -0.2
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1

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

dx = [0,1,0,1]
dy = [0,0,1,1]

for i in range(4):
    nx = dx[i]
    ny = dy[i]
    print('NAND:',NAND(nx,ny))
    print('OR:',OR(nx,ny))
    print('XOR:',XOR(nx,ny))

이 XOR을 퍼셉트론으로 나타내면 다음과 같다.

이 처럼 XOR는 2층 퍼셉트론이다. 0층에서 1층으로 신호가 전달되고, 이어서 1층에서 2층으로 신호가 전달된다. 그리고 2층의 뉴런은 y를 출력한다.

출처 : 밑바닥부터 시작하는 딥러닝: 파이썬으로 익히는 딥러닝 이론과 구현 - 사이토 고키(2017)

0개의 댓글