본문 바로가기

AI

Chapter2. 퍼셉트론

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


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)

 

 

'AI' 카테고리의 다른 글

Building Systems with the ChatGPT API  (0) 2024.08.03
Chapter 6. 학습 관련 기술들  (0) 2024.07.13
Chapter 5. 오차역전파법  (0) 2024.06.30
Chapter 4. 신경망 학습  (0) 2024.06.23
Chapter 3. 신경망  (0) 2024.06.18