퍼셉트론 정의
퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력
퍼셉트론의 신호는 흐른다/안 흐른다 (1이나 0)의 두 가지 값만 가질 수 있다.
위 이미지를 보면 입력으로 2개의 신호를 받은 퍼셉트론의 예이다.
x는 입력 신호, y는 출력 신호, w는 가중치를 뜻한다.
입력 신호가 뉴런에 보내질 때는 각각 고유한 가중치가 곱해진다.
(w1*x1, w2*x2)
뉴런에서 보내온 신호의 총합이 정해진 한계(임계값 θ)를 넘어설 때만 1을 출력한다 (뉴런의 활성화)
위 내용을 아래와 같은 수식으로 나타낼 수 있다.
퍼셉트론은 복수의 입력 신호 각각에 고유한 가중치를 부여
가중치는 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용 → 가중치가 클수록 해당 신호가 그만큼 더 중요함
단순한 논리 회로(퍼셉트론 활용)
1. AND 게이트
위 AND 게이트를 퍼셉트론으로 표현
진리표대로 작동하는 w1, w2, θ의 값을 정하는 것이다.
(초기에는 사람들이 이 매개변수의 값을 직접 정하였다.)
위 AND 게이트를 만족하는 매개변수 조합은 무수히 많음
(w1, w2, θ) 가 (0.5, 0.5, 0.7)일 때, 또 (0.5, 0.5, 0.8)이나 (1.0, 1.0, 1.0)일 때 모두 AND 게이트의 조건을 만족
코드로 구현
def AND(x1, x2):
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("AND(0,0)", AND(0, 0))
print("AND(1,0)", AND(1, 0))
print("AND(0,1)", AND(0, 1))
print("AND(1,1)", AND(1, 1))
결과
AND(0,0) 0
AND(1,0) 0
AND(0,1) 0
AND(1,1) 1
잘 작동함
2. NAND 게이트와 OR 게이트
1. NAND : Not AND → AND 게이트의 출력을 뒤집은 것
(w1, w2, θ) 가 (-0.5, -0.5, -0.7)일 때, 또 (-0.5, -0.5, -0.8)일 때 등의 변수들이 NAND 게이트의 조건을 만족한다.
2. OR : 입력 신호 중 하나 이상이 1이면 출력이 1이 되는 논리 회로.
(w1, w2, θ) 가 (0.5, 0.5, 0.2) 일 때 등이 OR 게이트의 조건을 만족한다.
이를 구현하기 전에 위 수식을 아래와 같이 변경
여기서 b를 bias 즉 편향이라고 칭한다.
해석을 해보면,
퍼셉트론은 입력 신호에 가중치를 곱한 값과 편향을 합하여, 그 값이 넘으면 1을 출력, 그렇지 않으면 0을 출력한다.
위 내용을 반영하여 다시 수정한 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
print("AND(0,0)", AND(0, 0))
print("AND(1,0)", AND(1, 0))
print("AND(0,1)", AND(0, 1))
print("AND(1,1)", AND(1, 1))
결과
AND(0,0) 0
AND(1,0) 0
AND(0,1) 0
AND(1,1) 1
- θ가 b로 치환
편향은 가중치와 다른 기능을 한다.
가중치 : 입력 신호가 결과에 주는 영향력(중요도)를 조절하는 매개변수
편향 : 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력) 하느냐를 조정하는 매개변수
b가 -0.1이면 각 입력 신호에 가중치를 곱한 값들의 합이 0.1을 초과할 때만 뉴런이 활성화
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
print("NAND(0,0)", NAND(0, 0))
print("NAND(1,0)", NAND(1, 0))
print("NAND(0,1)", NAND(0, 1))
print("NAND(1,1)", NAND(1, 1))
결과
NAND(0,0) 1
NAND(1,0) 1
NAND(0,1) 1
NAND(1,1) 0
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
print("OR(0,0)", OR(0, 0))
print("OR(1,0)", OR(1, 0))
print("OR(0,1)", OR(0, 1))
print("OR(1,1)", OR(1, 1))
OR(0,0) 0
OR(1,0) 1
OR(0,1) 1
OR(1,1) 1
퍼셉트론의 한계
XOR 게이트(배타적 논리함)의 경우
x1과 x2 중 한쪽이 1일 때만 1을 출력
지금까진 본 퍼셉트론으로는 이 XOR 게이트를 구현할 수 없다.
OR 게이트의 동작을 시각적으로 해석...
(b, w1, w2) = (-0.5, 1.0, 1.0)일 때 진리표를 만족
이때의 수식
위 식을 그래프로 그려본다면
OR 게이트는 (x1, x2) = (0, 0)일 때 0을 출력하고 (0, 1) (1, 0) (1, 1)일 때는 1을 출력한다.
그림에서는 0을 원(0), 1을 삼각형으로 표시
OR 게이트를 만들려면 0과 1을 직선으로 나눠야 한다.
실제로 위 그림의 직선은 네 점을 제대로 나눈다.
그렇다면 XOR 게이트의 경우??
동그라미와 세모를 직선 하나로 나누는 방법은 없다.
선형과 비선형
직선 하나로는 동그라미와 세모를 나눌 수 없다.
그러나 직선이 아닌 곡선이면 가능하다.
한개의 퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계가 있다. 곡선은 표현할 수 없다.
따라서 곡선의 영역을 비선형 영역, 직선의 영역을 선형 영역이라고 한다.
다층 퍼셉트론이라면?
퍼셉트론으로는 XOR 게이트를 표현할 수 없지만, '층을 쌓아' 다층 퍼셉트론(multi-layer perceptron)을 만들 수 있아 펴현할 수 있다.
NAND, OR, AND을 조합해서 XOR을 표현할 수 있다.
XOR을 구현
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
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
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
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
print("OR(0,0)", XOR(0, 0))
print("OR(1,0)", XOR(1, 0))
print("OR(0,1)", XOR(0, 1))
print("OR(1,1)", XOR(1, 1))
결과
OR(0,0) 0
OR(1,0) 1
OR(0,1) 1
OR(1,1) 0
위와 같이 XOR 게이트를 완성할 수 있음
이처럼 층이 여러 개인 퍼셉트론은 다층 퍼셉트론(multi layer perceptron)
단층 퍼셉트론으로는 표현하지 못한 것을 층을 하나 늘려 구현할 수 있음
내용 참고
book.naver.com/bookdb/book_detail.nhn?bid=11492334
'딥러닝관련 > 기초 이론' 카테고리의 다른 글
MNIST 인식(밑바닥부터 시작하는 딥러닝) (0) | 2021.05.04 |
---|---|
신경망 정리 1 (퍼셉트론, 활성화 함수, 시그모이드, 계단함수...) (0) | 2021.05.01 |
Atrous Convolution (0) | 2021.04.20 |
확률변수 (0) | 2021.04.14 |
기계 학습에서 확률의 필요성 (0) | 2021.04.14 |