본문 바로가기
딥러닝관련/기초 이론

Perceptron (퍼셉트론)

by 머리올리자 2021. 5. 1.

퍼셉트론 정의

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

 

퍼셉트론의 신호는 흐른다/안 흐른다 (1이나 0)의 두 가지 값만 가질 수 있다.

 

출처 : https://www.pyimagedata.com/how-to-create-a-single-layer-perceptron/

위 이미지를 보면 입력으로 2개의 신호를 받은 퍼셉트론의 예이다.

 

x는 입력 신호, y는 출력 신호, w는 가중치를 뜻한다.

 

입력 신호가 뉴런에 보내질 때는 각각 고유한 가중치가 곱해진다.

(w1*x1, w2*x2)

 

뉴런에서 보내온 신호의 총합이 정해진 한계(임계값 θ)를 넘어설 때만 1을 출력한다 (뉴런의 활성화)

 

위 내용을 아래와 같은 수식으로 나타낼 수 있다.

출처에서 수정 : https://towardsdatascience.com/perceptron-learning-algorithm-d5db0deab975

퍼셉트론은 복수의 입력 신호 각각에 고유한 가중치를 부여

 

가중치는 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용 → 가중치가 클수록 해당 신호가 그만큼 더 중요함

 

 

단순한 논리 회로(퍼셉트론 활용)

1. AND 게이트

출처 : https://ko.wikipedia.org/wiki/AND_%EA%B2%8C%EC%9D%B4%ED%8A%B8

위 AND 게이트를 퍼셉트론으로 표현

 

진리표대로 작동하는 w1, w2, θ의 값을 정하는 것이다.

(초기에는 사람들이 이 매개변수의 값을 직접 정하였다.)

 

위 AND 게이트를 만족하는 매개변수 조합은 무수히 많음

 

(w1, w2, θ) 가 (0.5, 0.5, 0.7)일 때, 또 (0.5, 0.5, 0.8)이나 (1.0, 1.0, 1.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


print("AND(0,0)", AND(0, 0))
print("AND(1,0)", AND(1, 0))
print("AND(0,1)", AND(0, 1))
print("AND(1,1)", AND(1, 1))
결과

AND(0,0) 0
AND(1,0) 0
AND(0,1) 0
AND(1,1) 1

잘 작동함

 

2. NAND 게이트와 OR 게이트

 

1. NAND : Not AND → AND 게이트의 출력을 뒤집은 것

 

출처 : https://ko.wikipedia.org/wiki/NAND_%EA%B2%8C%EC%9D%B4%ED%8A%B8

(w1, w2, θ) 가 (-0.5, -0.5, -0.7)일 때, 또 (-0.5, -0.5, -0.8)일 때 등의 변수들이 NAND 게이트의 조건을 만족한다.

 

2. OR : 입력 신호 중 하나 이상이 1이면 출력이 1이 되는 논리 회로.

 

https://ko.wikipedia.org/wiki/OR_%EA%B2%8C%EC%9D%B4%ED%8A%B8

(w1, w2, θ) 가 (0.5, 0.5, 0.2) 일 때 등이 OR 게이트의 조건을 만족한다.

 

이를 구현하기 전에 위 수식을 아래와 같이 변경

 

여기서 b를 bias편향이라고 칭한다.

 

해석을 해보면,

 

퍼셉트론은 입력 신호에 가중치를 곱한 값과 편향을 합하여, 그 값이 넘으면 1을 출력, 그렇지 않으면 0을 출력한다.

 

위 내용을 반영하여 다시 수정한 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


print("AND(0,0)", AND(0, 0))
print("AND(1,0)", AND(1, 0))
print("AND(0,1)", AND(0, 1))
print("AND(1,1)", AND(1, 1))
결과

AND(0,0) 0
AND(1,0) 0
AND(0,1) 0
AND(1,1) 1

- θ가 b로 치환

 

편향은 가중치와 다른 기능을 한다.

 

가중치 : 입력 신호가 결과에  주는 영향력(중요도)를 조절하는 매개변수

편향    : 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력) 하느냐를 조정하는 매개변수

 

b가 -0.1이면 각 입력 신호에 가중치를 곱한 값들의 합이 0.1을 초과할 때만 뉴런이 활성화

 

NAND 게이트 구현

 

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


print("NAND(0,0)", NAND(0, 0))
print("NAND(1,0)", NAND(1, 0))
print("NAND(0,1)", NAND(0, 1))
print("NAND(1,1)", NAND(1, 1))
결과

NAND(0,0) 1
NAND(1,0) 1
NAND(0,1) 1
NAND(1,1) 0

 

OR 게이트 구현

import numpy as np

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


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

 

퍼셉트론의 한계

XOR 게이트(배타적 논리함)의 경우

 

x1과 x2 중 한쪽이 1일 때만 1을 출력

 

https://ko.wikipedia.org/wiki/XOR_%EA%B2%8C%EC%9D%B4%ED%8A%B8

지금까진 본 퍼셉트론으로는 이 XOR 게이트를 구현할 수 없다.

 

OR 게이트의 동작을 시각적으로 해석...

 

(b, w1, w2) = (-0.5, 1.0, 1.0)일 때 진리표를 만족

 

이때의 수식

 

위 식을 그래프로 그려본다면

 

OR 게이트는 (x1, x2) = (0, 0)일 때 0을 출력하고 (0, 1) (1, 0) (1, 1)일 때는 1을 출력한다.

 

그림에서는 0을 원(0), 1을 삼각형으로 표시

 

OR 게이트를 만들려면 0과 1을 직선으로 나눠야 한다.

 

실제로 위 그림의 직선은 네 점을 제대로 나눈다.

 

 

그렇다면 XOR 게이트의 경우??

 

XOR 게이트

동그라미와 세모를 직선 하나로 나누는 방법은 없다.

 

선형과 비선형

 

직선 하나로는 동그라미와 세모를 나눌 수 없다.

 

그러나 직선이 아닌 곡선이면 가능하다.

 

곡선으로 나누기

한개의 퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계가 있다. 곡선은 표현할 수 없다.

 

따라서 곡선의 영역비선형 영역, 직선의 영역선형 영역이라고 한다.

 

다층 퍼셉트론이라면?

 

퍼셉트론으로는 XOR 게이트를 표현할 수 없지만, '층을 쌓아' 다층 퍼셉트론(multi-layer perceptron)을 만들 수 있아 펴현할 수 있다.

 

NAND, OR, AND을 조합해서 XOR을 표현할 수 있다.

 

 

 

XOR을 구현

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

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 XOR(x1, x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y


print("OR(0,0)", XOR(0, 0))
print("OR(1,0)", XOR(1, 0))
print("OR(0,1)", XOR(0, 1))
print("OR(1,1)", XOR(1, 1))
결과

OR(0,0) 0
OR(1,0) 1
OR(0,1) 1
OR(1,1) 0

위와 같이 XOR 게이트를 완성할 수 있음

 

구현한 구조

이처럼 층이 여러 개인 퍼셉트론은 다층 퍼셉트론(multi layer perceptron)

 

단층 퍼셉트론으로는 표현하지 못한 것을 층을 하나 늘려 구현할 수 있음

 

 

내용 참고

book.naver.com/bookdb/book_detail.nhn?bid=11492334

 

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

직접 구현하고 움직여보며 익히는 가장 쉬운 딥러닝 입문서!『밑바닥부터 시작하는 딥러닝』은 라이브러리나 프레임워크에 의존하지 않고, 딥러닝의 핵심을 ‘밑바닥부터’ 직접 만들어보며

book.naver.com