본 글은 "바닥부터 시작하는 딥러닝" 책을 바탕으로 작성되었습니다.
2.1 퍼셉트론이란?
- 다수의 신호를 입력받아, 하나의 신호로 출력한다.
- 퍼셉트론은 1과 0으로 출력값이 갖고 있다.
- 그림 1 에서 x1과 x2는 입력 신호, y는 출력 신호, w1과 w2는 가중치이고, 그림의 원을 뉴런 or 노드라고 부른다.
(실제 뇌의 뉴런들이 연결되어 강도가 각각 다르다.)
- 입력 신호가 뉴런에 보내질 때, 가중치가 곱해져서 보내진다.
- 보내진 신호의 임계값( θ , theta)을 넘어설 때는 1을 출력하고, 아닐 경우는 0을 출력한다.
- 가중치는 각 신호의 결과에 영향력을 주는 요소로, 가중치가 클수록 해당 신호가 중요하다.
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)
2.2.2 NAND 게이트와 OR 게이트
- NAND 게이트는 (w1, w2, θ) = (-0.5, -0.5, -0.7) 조합을 예를 들 수 있으며, 다른 조합도 무수히 많다.
- OR 게이트는 (w1, w2, θ) = (0.5, 0.5, 0.4) 조합을 예를 들 수 있으며, 다른 조합도 무수히 많다.
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)
2.3.2 가중치와 편향 도입
- 그림2의 퍼셉트 동작 수식에서 θ를 -b로 치환하면 그림7과 같은 수식이 된다.
(여기서, b를 편향이라고 하며, w1과 w2는 가중치라고 한다.)
>>> 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)
(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)
2.4 퍼셉트론의 한계
- 퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계가 존재한다.
- XOR 연산의 경우 그래프를 그려보면, 직선 하나로 나눌 수 없고 곡선으로 나눠야 한다.
(직선의 영역을 '선형 영역'이라고 하며, 곡선 영역을 '비선형 영역'이라고 한다.)
- 따라서, 곡선으로 나눠지는 XOR 연산은 퍼셉트론으로 표현할 수 없다.
2.5 다층 퍼셉트론이 출동한다면
2.5.1 기존 게이트 조합하기
- 기존 게이트인 AND, NAND, OR 게이트를 조합하여, XOR 구현이 가능하다.
- 단층 퍼셉트론으로는 XOR 게이트 표현이 불가능하지만, 퍼셉트론을 조합하여 XOR 게이트 표현은 가능하다.
- 그림 13을 보면 X1과 X2는 NAND와 OR의 입력이고, 이의 출력 값이 AND 게이트의 입력으로 이어져 XOR게이트 구현이 가능하다. 구현이 가능하다.
- 그림 13에서 S1은 NAN 출력 값, S2는 OR 출력값이다.
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)
- 단층 퍼셉트론으로 표현하지 못하는 것을 층을 늘려 구현할 수 있다.
- 여러 층이 쌓여 구현된 퍼셉트론을 '다층 퍼셉트론'이라고 한다.
'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 |