퍼셉트론이란?
다수의 신호를 입력으로 받아 하나의 신호를 출력한다.
- 신호 : 흐름이 있는 것이라고 정의 (1 : 신호가 흐른다. 0: 신호가 흐르지 않는다.)
x1과 x2 : input (입력 신호), (w1,w2) : 각각의 가중치, y : 출력 신호
여기서 theta는 임계값(한계점이라고 이해)
퍼셉트론은 각각의 고유한 가중치를 부여. 각 가중치가 신호의 결과에 주는 영향력을 조절. 즉, 가중치가 클수록 해당 신호가 그만큼 더 중요
논리회로
- AND 게이트
x1 |
x2 |
y |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
모두 1일 때만 1
예시) (w_1,w_2,theta)가 (0.5,0.5,0.7) or (0.5,0.5,0.8) or (1.0,1.0,1.0)
- NAND(Not AND) 게이트
x1 |
x2 |
y |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
모두 AND의 반대. 서로 같은 조합이면 1을 출력하지 않는다.
예시) (w_1,w_2,theta) 가 (-0.5,-0.5,-0.7) etc...
- OR 게이트
x1 |
x2 |
y |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
둘 중 하나만 1이어도 1
예시) (w_1,w_2,theta) 가 (0.5,0.5,0.2) etc...
퍼셉트론 구현
def AND(x1,x2):
w1,w2,theta = 0.5,0.5,0.7
tmp = x1*w1+x2*w2
if tmp <= theta: return 0
else: return 1
if __name__ == "__main__":
print(AND(0,0)) # 0
print(AND(1,0)) # 0
print(AND(0,1)) # 0
print(AND(1,1)) # 1
theta 값을 이항
이 때 b는 편향(bias)이 된다.
퍼셉트론은 입력 신호에 가중치를 곱한 값과 편향을 합하여 그 값이 0을 넘으면 1을 출력하고 그렇지 않으면 0을 출력한다.
w1,w2(가중치)는 각 입력 신호가 결과에 주는 영향력(중요도)를 조절하는 매개변수
b(편향)는 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력) 하느냐를 조절하는 매개변수
import numpy as np
x = np.array([0,1]) # inpu
w = np.array([0.5,0.5]) # weight
b = -0.7 # bias
print(w*x) # [0. 0.5]
print(np.sum(w*x)) # 0.5
print(np.sum(w*x)+b) # -0.2
# 가중치와 편향을 도입한 AND
def AND(x1,x2):
x = np.array([x1,x2])
w = np.array([0.5,0.5])
b = -0.7 # -theta = b
tmp = np.sum(w*x) +b
if tmp <=0: return 0
else: return 1
if __name__ == "__main__":
print(AND(0,0)) # 0
print(AND(1,0)) # 0
print(AND(0,1)) # 0
print(AND(1,1)) # 1
가중치와 편향을 도입한 NAND
def NAND(x1,x2):
x = np.array([x1,x2])
w = np.array([-0.5,-0.5]) # AND 와 가중치와 편향만 다름
b = 0.7
tmp = np.sum(w*x)+b
if tmp<=0: return 0
else: return 1
if __name__ == "__main__":
print(NAND(0,0)) # 1
print(NAND(1,0)) # 1
print(NAND(0,1)) # 1
print(NAND(1,1)) # 0
# 가중치와 편향을 도입한 OR
def OR(x1,x2):
x = np.array([x1,x2])
w = np.array([0.5,0.5]) # AND 와 가중치와 편향만 다름
b = -0.2
tmp = np.sum(w*x)+b
if tmp<=0: return 0
else: return 1
if __name__ == "__main__":
print(OR(0,0)) # 0
print(OR(1,0)) # 1
print(OR(0,1)) # 1
print(OR(1,1)) # 1
퍼셉트론의 한계
베타적 논리합(XOR)을 구현할 수 없다.
x1 |
x2 |
y |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
위와 같은 그래프는 선형적인 선으로 나눌 수가 없음. 곡선으로 가야함
다층퍼셉트론
퍼셉트론에 층을 쌓아서 다층 퍼셉트론을 구현
XOR 게이트를 AND,NAND,OR 게이트를 조합하여 구현
def XOR(x1,x2):
s1 = NAND(x1,x2)
s2 = OR(x1,x2)
y = AND(s1,s2)
return y
if __name__ == "__main__":
print(XOR(0,0)) # 0
print(XOR(1,0)) # 1
print(XOR(0,1)) # 1
print(XOR(1,1)) # 0
- 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 |
1. 0층의 두 뉴런이 입력 신호를 받아 1층의 뉴런으로 신호를 보냄
2. 1층의 뉴런이 2층의 뉴런으로 신호를 보내고, 2층의 뉴런은 이 입력 신호를 바탕으로 y를 출력
'밑바닥 딥러닝' 카테고리의 다른 글
Chapter5 - Backpropogation (0) | 2021.07.03 |
---|---|
Chapter4 - Training Neural Network(1) (0) | 2021.02.02 |
Chapter3 - Neural Network(3) (0) | 2021.01.10 |
Chapter3 - Neural Network(2) (0) | 2021.01.10 |
Chapter3 - Neural Network(1) (0) | 2021.01.10 |
댓글