인공지능 공부/기초 개념
[인공지능 기초 / python] 1. 퍼셉트론
KimDove
2022. 4. 17. 17:21
728x90
1. 퍼셉트론
- 다수의 신호를 입력받아 하나의 신호를 출력
- 신경망의 기본 단위 정도로 생각하면 될 것 같다.
- 이미지에서 Xn은 입력신호, Wn은 가중치, Y는 출력신호이다.
- 입력신호(Xn)가 뉴런에 보내질 때 각각 고유한 가중치(Wn)가 곱해짐
- 뉴런에서 보내온 신호의 총합이 임계값을 넘길 때 뉴런이 활성화 된다.
- 퍼셉트론은 복수의 입력 신호 각각에 고유한 신호를 부여한다.
- 이 가중치가 클 수록 해당 신호가 그만큼 더 중요하다는 의미임.
예제) 퍼셉트론 예제 - 논리 회로 구현하기
a. AND 게이트
- 두 개의 입력이 1일 때만 1을 출력하는 논리 회로
x1 | x2 | y |
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
b. NAND (Not AND) 게이트
- AND게이트의 출력결과를 뒤집어 두 개의 입력이 1일 때만 0을 출력하는 논리 회로
x1 | x2 | y |
0 | 0 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
c. OR 게이트
- 두 개의 입력이 0일 때만 0을 출력하는 논리 회로
x1 | x2 | y |
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 1 |
d. 논리회로 퍼셉트론 구현
## AND 게이트 구현 코드
def AND(x1, x2):
## 가중치와 임계값
w1, w2, theta = 0.5, 0.5, 0.7
temp = x1*w1 + x2*w2
output = lambda x: 1 if x > theta else 0
return output(temp)
print(f'x1 : {0}, x2: {0}, output : {AND(0, 0)}')
print(f'x1 : {1}, x2: {0}, output : {AND(1, 0)}')
print(f'x1 : {0}, x2: {1}, output : {AND(0, 1)}')
print(f'x1 : {1}, x2: {1}, output : {AND(1, 1)}')
## 출력 결과
x1 : 0, x2: 0, output : 0
x1 : 1, x2: 0, output : 0
x1 : 0, x2: 1, output : 0
x1 : 1, x2: 1, output : 1
(!) 편향의 도입
- 가중치 w는 각 입력신호가 결과에 주는 영향력을 조절하는 매개변수
- 편향 b는 뉴런(노드)이 얼마나 쉽게 활성화 되는지 조절하는 매개변수
e. g)
(1) b = -0.7인 경우
→ 가중합(w1*x1 + w2*x2 + ... + wn*xn)이 0.8 이상이어야 활성화 됨.
(2) b = 20인 경우
→ 가중합(w1*x1 + w2*x2 + ... + wn*xn)이 21 이상이어야 활성화 됨.
import numpy as np
## 편향을 추가한 AND 게이트
def AND_w_bias(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.7
## temp = x[0]*w[0] + x[1]*w[1] + b와 동일
temp = np.sum(w*x) + b
output = lambda x: 1 if x > 0 else 0
return output(temp)
print(f'x1 : {0}, x2: {0}, output : {AND_w_bias(0, 0)}')
print(f'x1 : {1}, x2: {0}, output : {AND_w_bias(1, 0)}')
print(f'x1 : {0}, x2: {1}, output : {AND_w_bias(0, 1)}')
print(f'x1 : {1}, x2: {1}, output : {AND_w_bias(1, 1)}')
## 출력 결과
x1 : 0, x2: 0, output : 0
x1 : 1, x2: 0, output : 0
x1 : 0, x2: 1, output : 0
x1 : 1, x2: 1, output : 1
## 편향을 추가한 NAND 게이트
def NAND_w_bias(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.7
## temp = x[0]*w[0] + x[1]*w[1] + b와 동일
temp = np.sum(w*x) + b
output = lambda x: 1 if x < 0 else 0
return output(temp)
print(f'x1 : {0}, x2: {0}, output : {NAND_w_bias(0, 0)}')
print(f'x1 : {1}, x2: {0}, output : {NAND_w_bias(1, 0)}')
print(f'x1 : {0}, x2: {1}, output : {NAND_w_bias(0, 1)}')
print(f'x1 : {1}, x2: {1}, output : {NAND_w_bias(1, 1)}')
## 출력 결과
x1 : 0, x2: 0, output : 1
x1 : 1, x2: 0, output : 1
x1 : 0, x2: 1, output : 1
x1 : 1, x2: 1, output : 0
def OR_w_bias(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.2
## temp = x[0]*w[0] + x[1]*w[1] + b와 동일
temp = np.sum(w*x) + b
output = lambda x: 1 if x > 0 else 0
return output(temp)
print(f'x1 : {0}, x2: {0}, output : {OR_w_bias(0, 0)}')
print(f'x1 : {1}, x2: {0}, output : {OR_w_bias(1, 0)}')
print(f'x1 : {0}, x2: {1}, output : {OR_w_bias(0, 1)}')
print(f'x1 : {1}, x2: {1}, output : {OR_w_bias(1, 1)}')
## 출력 결과
x1 : 0, x2: 0, output : 0
x1 : 1, x2: 0, output : 1
x1 : 0, x2: 1, output : 1
x1 : 1, x2: 1, output : 1
1-1. 퍼셉트론의 한계
- AND, NAND, OR 게이트는 단층 퍼셉트론만으로 구현이 가능하였으나,
XOR 게이트는 단층 퍼셉트론으로는 구현할 수 없다.
a. XOR 게이트
- 입력 x1, x2 둘 중에 하나만이라도 1인 경우에 1을 출력하는 논리 회로
x1 | x2 | y |
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
- AND, NAND, OR 게이트의 경우 선형(직선 1개)으로 0과 1의 경계를 구분할 수 없지만,
XOR 게이트의 경우 선형으로 0과 1의 경계를 구분 할 수 없다. - 이런 경우에 단층 퍼셉트론을 조합하여 다층 퍼셉트론으로 만들어 구현할 수 있다.
- XOR은 (x1 OR x2) AND (x1 NAND x2)로 표시할 수 있다.
(1) x1 OR x2
x1 | x2 | y |
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 1 |
(2) x1 NAND x2
x1 | x2 | y |
0 | 0 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
(3) (x1 OR x2) AND (x1 NAND x2)
x1 | x2 | y |
0 | 1 | 0 |
1 | 1 | 1 |
1 | 1 | 1 |
1 | 0 | 0 |
#### a. XOR 게이트 구현
def XOR_w_bias(x1, x2):
s1 = OR_w_bias(x1, x2)
s2 = NAND_w_bias(x1, x2)
return AND_w_bias(s1, s2)
print(f'x1 : {0}, x2: {0}, output : {XOR_w_bias(0, 0)}')
print(f'x1 : {1}, x2: {0}, output : {XOR_w_bias(1, 0)}')
print(f'x1 : {0}, x2: {1}, output : {XOR_w_bias(0, 1)}')
print(f'x1 : {1}, x2: {1}, output : {XOR_w_bias(1, 1)}')
## 출력 결과
x1 : 0, x2: 0, output : 0
x1 : 1, x2: 0, output : 1
x1 : 0, x2: 1, output : 1
x1 : 1, x2: 1, output : 0
99. 자료 출처
99-1. 도서
- 한빛 미디어 | 밑바닥부터 시작하는 딥러닝
99-2.웹 사이트
- 하얀종이 개발자 | 딥러닝에서 가중치(W), 편향(Bias)의 역할 [블로그 링크]
99-3. 데이터 셋
전체코드
내용 추가 이력
부탁 말씀
개인적으로 공부하는 과정에서 오류가 있을 수 있으니, 오류가 있는 부분은 댓글로 정정 부탁드립니다.
728x90