AI

Chapter2. 퍼셉트론

d0bbyG 2024. 6. 17. 22:59

본 글은 "바닥부터 시작하는 딥러닝" 책을 바탕으로 작성되었습니다.


2.1 퍼셉트론이란?

- 다수의 신호를 입력받아, 하나의 신호로 출력한다.

- 퍼셉트론은 1과 0으로 출력값이 갖고 있다.

그림 1. 입력이 2개인 퍼셉트론

 

- 그림 1 에서 x1과 x2는 입력 신호, y는 출력 신호, w1과 w2는 가중치이고, 그림의 원을 뉴런 or 노드라고 부른다.
   (실제 뇌의 뉴런들이 연결되어 강도가 각각 다르다.)

- 입력 신호가 뉴런에 보내질 때, 가중치가 곱해져서 보내진다.

- 보내진 신호의 임계값( θ , theta)을 넘어설 때는 1을 출력하고, 아닐 경우는 0을 출력한다.

그림2. 퍼셉트론 동작 수식

- 가중치는 각 신호의 결과에 영향력을 주는 요소로, 가중치가 클수록 해당 신호가 중요하다.

 

2.2 단순한 논리 회로

2.2.1 AND 게이트

- 그림3의 진리표인 AND게이트를 퍼셉트론으로 표현하기 위해 w1, w2, θ 값을 정해야한다.
  (가중치와 임계값을 매개변수라고 한다.)
- 예시는 무수히 많지만, 아래와 같은 예시가 존재한다.
   (그림2의 퍼셉트론 동작 수식에 적용하면, 아래 예시가 맞게 설정된 것을 확인할 수 있다.)
   ① (w1, w2, θ) = (0.5, 0.5, 0.7)
   ② (w1, w2, θ) = (0.5, 0.5, 0.8)
   ③ (w1, w2, θ) = (1.0, 1.0, 1.0)

그림3. AND 게이트의 진리표

2.2.2 NAND 게이트와 OR 게이트

- NAND 게이트는 (w1, w2, θ) = (-0.5, -0.5, -0.7) 조합을 예를 들 수 있으며, 다른 조합도 무수히 많다.

그림4. NAND 게이트의 진리표

- OR 게이트는 (w1, w2, θ) = (0.5, 0.5, 0.4) 조합을 예를 들 수 있으며, 다른 조합도 무수히 많다.

그림5. OR 게이트의 진리표

 

2.3 퍼셉트론 구현하기

2.3.1 간단한 구현부터 - AND 게이트

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

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

그림6. AND 게이트 출력값

2.3.2 가중치와 편향 도입

- 그림2의 퍼셉트 동작 수식에서 θ를 -b로 치환하면 그림7과 같은 수식이 된다.

   (여기서, b를 편향이라고 하며, w1과 w2는 가중치라고 한다.)

그림7. 퍼셉트 동작 수식_편향

>>> import numpy as np
>>> x = np.array([0,1])  #입력
>>> w = np.array([0.5, 0.5])  #가중치
>>> b = -0.7  #편향
>>> w*x
array([0. , 0.5])
>>> np.sum(w*x)
0.5
>>> np.sum(w*x) + b
-0.19999999999999996

2.3.3 가중치와 편향 구현하기

(1) AND 게이트

- w1과 w2는 '가중치'로, 각 입력 신호가 결과에 주는 영향력을 조절하는 매개변수이다.

- b는 '편향'으로, 뉴런이 얼마나 쉽게 활성화(결과 1 출력) 하느냐를 조정하는 매개변수이다.

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(x*w) + b
    if tmp <= 0:
        print(0)
        return 0
    else:
        print(1)
        return 1

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

 

그림8. and게이트_편향 출력값

(2)  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(x*w) + b
    if tmp <= 0:
        print(0)
        return 0
    else:
        print(1)
        return 1

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

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

그림 9. NAND & OR 게이트 출력값

 

2.4 퍼셉트론의 한계

- 퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계가 존재한다.

- XOR 연산의 경우 그래프를 그려보면, 직선 하나로 나눌 수 없고 곡선으로 나눠야 한다.

  (직선의 영역을 '선형 영역'이라고 하며, 곡선 영역을 '비선형 영역'이라고 한다.)

그림 10. 왼쪽은 OR연산, 오른쪽은 XOR연산 (출처: https://velog.io/@jw5150)

 

- 따라서, 곡선으로 나눠지는 XOR 연산은 퍼셉트론으로 표현할 수 없다.

그림 11. XOR 게이트의 진리표

 

2.5 다층 퍼셉트론이 출동한다면

2.5.1 기존 게이트 조합하기

그림 12. AND, NAND, OR 게이트 기호 (출처 : https://velog.io/@jw5150)

- 기존 게이트인 AND, NAND, OR 게이트를 조합하여, XOR 구현이 가능하다.

- 단층 퍼셉트론으로는 XOR 게이트 표현이 불가능하지만, 퍼셉트론을 조합하여 XOR 게이트 표현은 가능하다.

-  그림 13을 보면 X1과 X2는 NAND와 OR의 입력이고, 이의 출력 값이 AND 게이트의 입력으로 이어져 XOR게이트 구현이 가능하다. 구현이 가능하다.

그림 13. AND, OR, NAND 게이트를 조합해 구현한 XOR 게이트 (출처 : https://velog.io/@jw5150)

- 그림 13에서 S1은 NAN 출력 값, S2는 OR 출력값이다.

그림 14. XOR 게이트의 진리표

 

2.5.2 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(x*w) + 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(x*w) + 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(x*w) + 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)
    print(y)
    return y

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

그림 15. XOR 게이트 출력값

- 단층 퍼셉트론으로 표현하지 못하는 것을 층을 늘려 구현할 수 있다.

- 여러 층이 쌓여 구현된 퍼셉트론을 '다층 퍼셉트론'이라고 한다.

그림 15. XOR의 퍼셉트론 (출처 : https://velog.io/@jw5150)