프로그래밍/책

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

HanaTaba 2024. 8. 1. 21:00

퍼셉트론

 

입력이 2개인 퍼셉트론
입력이 2개인 퍼셉트론

 

퍼셉트론(인공 뉴런, 단순 퍼셉트론)은 다수의 신호를 입력으로 받아 하나의 신호를 출력하는 것이다.

 

흐른다 / 안 흐른다 (1, 0)의 두 가지 값을 가질 수 있다.

 

x는 입력 신호, y는 출력 신호, w는 가중치를 뜻함, 그림의 원을 뉴런이나 노드라고 부른다.

 

입력 신호가 뉴런에 보내질 때 각각 고유한 가중치가 곱해짐(w*x). 뉴런에서 보낸 신호의 총합이 정해진 한계를 넘어서면 1을 출력함('뉴런이 활성화한다'라고도 함). 한계를 임계값이라 하며, Θ 기호로 나타낸다.

 

이를 수식으로 나타내면 다음과 같다.

y = 0 (w1x1 + w2x2 <= Θ)
y = 1 (w1x1 + w2x2 > Θ)

논리 회로

퍼셉트론을 활용하여 논리 회로를 표현할 수 있다.

 

AND 게이트

x1 x2 y
0 0 0
1 0 0
0 1 0
1 1 1

 

두 입력이 모두 1일 때만 1을 출력, 그 이외에는 0을 출력한다.

 

이를 퍼셉트론으로 표현하면, (w1, w2, Θ)를 (0.5, 0.5, 0.7), (0.5, 0.5, 0.8), (1.0, 1.0, 1.0) 등으로 AND 게이트를 만족하는 무한이 많은 조합을 만들 수 있다.

 

NAND 게이트와 OR 게이트

x1 x2 y
0 0 1
1 0 1
0 1 1
1 1 0

 

이를 퍼셉트론으로 표현하면 (-0.5, -0.5, -0.7) 등의 조합이 있다. 간단한 방법으로는 AND 게이트 매개변수의 부호를 모두 반전하면 NAND 게이트가 된다.

 

x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 1

퍼셉트론 구현하기

def Default_AND(x1, x2):    #일반 AND 게이트
    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(Default_AND(0, 0))
print(Default_AND(1, 0))
print(Default_AND(0, 1))
print(Default_AND(1, 1))

 

0
0
0
1

기본적인 AND 게이트

 

기본적인 AND 게이트이다. 가중치를 곱한 입력의 총합이 입계값을 넘으면 1을 반환하고 그 외에는 0을 반환한다.


가중치와 편향 도입

먼저 Θ를 -b로 치환하면 다음과 같은 식이 된다.

 

y = 0 (b + w1x1 + w2x2 <= 0)
y = 1 (b + w1x1 + w2x2 > 0)

 

이 b를 편향이라고 하며 가중치의 역할은 입력 신호가 주는 영향력(중요도)를 조절하는 매개변수이고 편향뉴런이 얼마나 쉽게 활성화(결과롤 1을 출력)하느냐를 조정하는 매개변수이다.

 

def AND(x1, x2):    #가중치와 편향을 도입한 AND 게이트
    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

가중치와 편향을 도입한 AND 게이트

 

 

def NAND(x1, x2):   #가중치와 편향을 도입한 NAND 게이트
    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

가중치와 편향을 도입한 NAND 게이트

 

def OR(x1, x2):     #가중치와 편향을 도입한 OR 게이트
    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

가중치와 편향을 도입한 OR 게이트


퍼셉트론의 한계

예를 들어, OR 게이트가 (b, w1, w2) = (-0.5, 1.0, 1.0) 일 때 퍼셉트론 식을 다음과 같이 표현할 수 있다.

y = 0 (-0.5 + x1 + x2 <= 0)
y = 1 (-0.5 + x1 + x2 > 0)

 

이를 시각화할 경우 다음과 같이 표현된다.

OR 게이트 퍼셉트론 식
OR 게이트 퍼셉트론 식

 

그림에서는 0을 원(o), 1을 삼각형()으로 표시하였는데, OR 게이트를 제작하기 위해서는 o와 △을 직선으로 나눠도 제작할 수 있다. 하지만 XOR의 경우는 그렇지 않다.

 

XOR 게이트 퍼센트론 식

 

XOR의 경우, o와 △을 직선으로 나눌 수 없다. 그렇기에 직선이 아닌, 곡선을 사용하여 나누어야 한다.

 

이와 같은 곡선의 영역을 비선형 영역, 직선의 영역을 선형 영역이라고 한다.


다층 퍼셉트론

 

퍼셉트론만으로는 XOR 게이트를 표현할 수 없지만, 층을 쌓아 다층 퍼셉트론으로 표현하는 것은 가능하다. 기존 AND, NAND, OR 게이트를 사용하여 XOR 게이트를 구현하는 것이 가능하기 때문이다.

 

게이트 기호
게이트 기호

 

게이트 조합을 통해 XOR 구현
게이트 조합을 통해 XOR 구현

 

이를 통해 제작한 XOR 게이트의 진리표는 다음과 같다.

x1 x2 s1 s2 y
0 0 1 0 0
1 0 1 1 1
0 1 1 1 1
1 1 0 1 0

 

이어서 XOR 게이트는 이전 제작한 AND, NAND, OR를 사용하여 쉽게 구현하는 것이 가능하다.

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

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

 

0
1
1
0

AND, NAND, OR을 사용한 XOR 게이트

 

XOR의 퍼셉트론
XOR의 퍼셉트론

 

XOR은 그림과 같은 다층 구조의 네트워크이다. 왼쪽부터 차례대로 0층, 1층 2층이라고 부른다.  

 

이 퍼셉트론은 이전에 제작한 AND, OR과 같은 단층 퍼셉트론과는 형태가 다른 2층 퍼셉트론이다. 이러한 층이 여러 개인 퍼셉트론을 다층 퍼셉트론이라 한다.

 

이러한 다층 퍼셉트론처럼 층을 쌓아 다양한 것을 표현할 수 있으며, 단층 퍼셉트론으로는 표현하지 못한 것을 표현할 수 있다.

'프로그래밍 > ' 카테고리의 다른 글

밑바닥부터 시작하는 딥러닝 1장  (0) 2024.07.31