본문 바로가기

Deep Learning(강의 및 책)/밑바닥부터 시작하는 딥러닝

2. 퍼셉트론(perceptron)

728x90

밑바닥부터 시작하는 딥러닝을 바탕으로 제작하였습니다.

 

2-1. 퍼셉트론이란?

 ■ 퍼셉트론이란?

이 책에서 퍼셉트론은 '인공 뉴런'을 의미하며 이는 다수의 입력 신호를 입력으로 받아 하나의 출력 신호(1 또는 0)를 출력하는 알고리즘을 의미합니다.

 

입력이 2개인 퍼셉트론

이 그림은 입력으로 2개의 신호를 받은 퍼셉트론의 예를 보여줍니다.

 

위 그림은 위와 같은 식으로 표현할 수 있습니다. x1와 x2에 각각 고유한 가중치 값을 곱해 더하면 신호의 합을 의미합니다. 그 값이 어떠한 한계, 즉 임계값보다 크다면 1, 작거나 같으면 0이라는 값을 y에 전달됩니다.

 

2-2. 단순한 논리 회로

 ■ AND 게이트

 

AND 게이트는 두 입력이 모두 1일 때만 1을 출력하고, 그 외에는 0을 출력합니다. 

이 AND 게이트를 퍼셉트론으로 표현하기 위해서 가중치와 임계값을 잘 설정해야 합니다.

예를 들어 가중치를 (1.0, 1.0)으로 설정하고 임계값을 1.0으로 설정한다면 올바르게 AND 게이트를 퍼셉트론으로 표현할 수 있습니다. 즉 x1,x2 모두 1일 때 가중 신호의 총합이 임계값보다 크면 성립합니다.

 

 

 

 

 

 

 ■ NAND 게이트와 OR 게이트

NAND 게이트란 Not AND 게이트를 의미합니다. 즉 AND 게이트의 반대로 출력됩니다.

NAND 게이트 진리표를 보면 AND와는 반대로 x1과 x2의 값이 전부 1이라면 0을 출력하는 것을 볼 수 있습니다.

NAND 게이트를 퍼셉트론으로 표현하는 방법의 예를 보면

가중치를 (-0.5, -0.5)로 설정을 하고 임계값을 -0.7로 설정하면 올바르게 NAND 게이트를 퍼셉트론으로 표현할 수 있습니다. 즉 AND 게이트를 구현하는 모든 매개변수의 부호를 모두 반전하기만 하면 NAND 게이트가 성립합니다.

 

 

 

OR 게이트는 입력 신호 중 하나 이상이 1이면 출력이 1이 되는 논리 회로입니다.

OR 게이트 진리표를 보면 입력이 모두 0인 경우를 제외하면 출력이 전부 1인 것을 볼 수 있습니다.

OR 게이트를 퍼셉트론으로 표현하는 방법의 예를 보면 

가중치를 (1.0, 1.0)으로 설정하고 임계값을 0.5로 설정하면 올바르게 OR 게이트를 퍼셉트론으로 표현할 수 있습니다. 

 

 

 

 

 

2.3. 퍼셉트론 구현하기

■ 가중치와 편향 도입

위에 식은 원래 존재하던 식에서 임계값을 -b로 치환한 결과입니다. 여기서 b를 편향이라 합니다. 이제 이를 토대로 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

if __name__ == '__main__':
    for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
        y = AND(xs[0], xs[1])
        print(str(xs) + " -> " + str(y))

실행결과

이와 같이 올바르게 AND 게이트가 구현된 것을 볼 수 있습니다.

 

 

 

 

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

if __name__ == '__main__':
    for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
        y = OR(xs[0], xs[1])
        print(str(xs) + " -> " + str(y))

실행결과

이와 같이 올바르게 OR 게이트가 구현된 것을 볼 수 있습니다.

 

 

 

이번에는 마지막으로 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

if __name__ == '__main__':
    for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
        y = NAND(xs[0], xs[1])
        print(str(xs) + " -> " + str(y))

실행결과

이와 같이 올바르게 NAND 게이트가 구현된 것을 볼 수 있습니다.

 

 

 

즉 올바른 가중치와 편향을 설정해준다면 올바르게 논리 회로를 구현할 수 있습니다.

 

2.4. 퍼셉트론의 한계

■ XOR 게이트

XOR 게이트는 배타적 논리합이라는 논리 회로입니다. 진리표를 보면 x1, x2 중 한쪽이 1일 때만 1을 출력하는 것을 볼 수 있습니다. 이는 지금까지 본 퍼셉트론으로는 구현할

수 없습니다.  그 이유는 아래에 그림을 보면 알 수 있습니다.

XOR 게이트는 직선 하나로 영역을 나눌 수 없습니다. 즉, XOR 게이트는 입출력 관계가 선형이 아닌 비선형 관계이기 때문에 지금까지 본 퍼셉트론(단층 퍼셉트론)으로는 구현이 불가능합니다.

 

2.5. 다층 퍼셉트론

■ 다층 퍼셉트론이란?

말 그대로 층이 여러 개의 퍼셉트론을 의미합니다. 다층 퍼셉트론을 이용한다면 XOR 게이트를 구현할 수 있습니다.

일단 기존에 우리가 사용한 NAND, OR, AND 게이트를 이용해 XOR 게이트를 만들어보면

이와 같이 만들 수 있습니다. 이를 토대로 다층 퍼셉트론을 이용한 XOR 게이트를 구현해보겠습니다.

 

 

 

 

 

 

 

 

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

if __name__ == '__main__':
    for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
        y = XOR(xs[0], xs[1])
        print(str(xs) + " -> " + str(y))

실행결과

이와 같이 XOR 게이트를 기존에 존재하던 게이트들을 이용해 다층 퍼셉트론으로 구현할 수 있습니다.

 

 

 

 

우리는 단층 퍼셉트론을 이용해 직선형 영역만 표현할 수 있고, 다층 퍼셉트론을 사용하면 비선형 영역도 표현할 수 있습니다. 이러한 다층 퍼셉트론을 이용하면 이론상 컴퓨터가 수행하는 처리도 모두 표현할 수 있습니다.

'Deep Learning(강의 및 책) > 밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글

6. 학습 관련 기술들  (0) 2022.02.15
5. 오차역전파법  (0) 2022.02.14
4. 신경망 학습  (0) 2022.02.07
3. 신경망  (0) 2022.02.07
1. 파이썬(Python) 기초  (0) 2022.02.06