티스토리 뷰

퍼셉트론

다수의 신호를 입력으로 받아 하나의 신호를 출력하는 모델을 퍼셉트론이라고 하며 딥러닝의 기원이 되는 알고리즘이기 때문에 매우 중요하다.

 

퍼셉트론의 동작 원리를 보자!

 y = 0 { w1x1+ w2x2 <=  theata) or 1 { w1x1 + w2x2 > theta}

* 변수의 의미

이때 x1과 x2는 입력신호이며 w1와 w2는 가중치로 각각의 입력신호가 얼마나 중요한지를 결정해준다. theata는 얼마나 
"쉽게" 1이 될 수 있냐를 결정지어준다.

 

단순한 논리 회로와 매개변수를 살펴보자!

두 신호가 입력신호로 주어지고 하나의 출력을 내는 퍼셉트론 모델을 살펴보자.

 

*AND게이트

=> 두 입력신호가 모두 1일때만 결과로 1이 출력되어야하고 이를 만족하는 w1, w2, theata는 무수히 많다.

=> (0.5,0.5,0.9)의 경우에 그 예가 될 수 있으며 두 입력신호가 모두 1일때만 1을 0.9를 넘어 출력결과가 1이 나오기 때문이다.

*NAND 게이트

=> 두 입력신호가 모두 1일때만 결과로 0이 출력되어야하고 이를 만족하는 w1,w2,theata에는 (-0.5, -0.5, -0.7)등이 있다.

*OR게이트

=> 두 입력신호가 모두 0일때만 결과로 0이 출력되어야하고 이를 만족하는 w1,w2,teatha에는 (0.3,0.5,0.2)등이 있다.

 

[핵심 포인트]

세가지 논리 게이트를 살펴보며 적절한 W1, W2, THEATA를 생각해보았나요? 퍼셉트론은 인간의 도움으로 매개변수 W1, W2, THEATA를 정합니다. 딥러닝이 퍼셉트론과 다른점은 매개변수를 직접 기계가 학습하며 최적의 매개변수를 만든다는 점에 있습니다.

=> 학습 : 기계가 스스로 최적의 매개변수를 찾아나가는 과정

 

퍼셉트론을 코드로 구현해보자!

 

우리는 THEATA를 이항해 편향 B를 만들 수 있으며 THEATA를 기준으로 1또는 0을 출력하게 되던 조건문이 0을 기준으로 1또는 0을 결정해 출력결과를 알아내도록 해봅시다.

* y = 0 { w1x1+ w2x2  + B <=  0) or 1 { w1x1 + w2x2 +B > 0}

 

*AND게이트

# 가중치와 편향의 개념을 도입한 AND게이트의 구현
#기본구현
import numpy as np

x = np.array([0,1])
w = np.array([0.5,0.5])
b = -0.7
print(w*x)
print(np.sum(w*x)+b)

AND게이트

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

RESULT : [0. 0.5] -0.19999999999999996 0 0 0 1 ( 여러줄에 걸쳐서나옴)

 

*NANA와 OR

#NAND와 OR게이트의 구현
def NAND(x1,x2):
    x = np.array([x1,x2])
    w = np.array([-0.5,-0.5])
    b = 0.7
    temp = np.sum(w*x)+b
    if temp<=0:
        return print("0")
    else:
        return print("1")
    
def OR(x1,x2):
    x = np.array([x1,x2])
    w = np.array([0.3,0.4])
    b = -0.2
    temp = np.sum(w*x) + b
    if temp<=0:
        return print("0")
    else:
        return print("1")

print("NAND")
NAND(0,0)
NAND(0,1)
NAND(1,0)
NAND(1,1)
print("OR")
OR(0,0)
OR(0,1)
OR(1,0)
OR(1,1)

RESULT : NAND 1 1 1 0 OR 0 1 1 1 ( 여러줄에 걸쳐서나옴)

 

*위에서 봐오던 단층퍼셉트론(하나의 직선식)의 한계

 

*XOR게이트를 살펴보자

같은 입력값이 들어오면 0을 출력하고 다른 입력값이 들어오면 1을 출력해야하는 게이트이며 이를 만족하는 w1, w2, B가 있을까 생각해봅시다!

 

좌표평면을 통해 쉽게 생각해볼 수 있다.

 

위의 그림을 통해 (0,0), (1,1)일때 출력의 결과가 0이 나와야하는 좌표를 동그라미로 찍었고, (1,0)과 (0,1)처럼 출력의 결과가 1이 나와야하는 좌표를 세모로 찍었다.

하나의 직선을 통해 영역을 동그라미 영역과 세모 영역으로 나눌 수 있을까?

=>불가능하다.

 

그렇다면 단 하나의 직선을 가지고 XOR을 표현할 수 없다면 퍼셉트론을 가지고 XOR을 표현할 수 없는 것일까?

=> 그건 아니다. 퍼셉트론을 가지고 XOR을 표현할 수는 있다. 다만 단층 퍼셉트론으로는 불가능하며 비선형을 표현하기 위해 여러 직선을 덧붙이며 다층 퍼셉트론을 활용해야한다.

 

다층 퍼셉트론을 통한 XOR게이트 구현!

=> x1과 x2가 NAND와 OR게이트를 지나 나온 결과 2개 s1, s2가 AND게이트에 들어가 y를 출력하면 다층 퍼셉트론을 이용해 XOR을 표현할 수 있다.

def NAND(x1,x2):
    x = np.array([x1,x2])
    w = np.array([-0.5,-0.5])
    b = 0.7
    temp = np.sum(w*x)+b
    if temp<=0:
        return 0
    else:
        return 1
    
def OR(x1,x2):
    x = np.array([x1,x2])
    w = np.array([0.3,0.4])
    b = -0.2
    temp = np.sum(w*x) + b
    if temp<=0:
        return 0
    else:
        return 1
    
def XOR(x1,x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1,x2)
    y = AND(s1,s2)
    return y

print(XOR(0,0),XOR(0,1),XOR(1,0),XOR(1,1))

RESULT : 0 1 1 0

 

[핵심포인트]

퍼셉트론의 층을 쌓으면 비선형적인 표현이 모두 가능하며 이론상 컴퓨터가 수행하는 처리를 모두 표현할 수 있다.