티스토리 뷰
- perceptron은 신경망의 기원이 되는 알고리즘으로, 신경망과 딥러닝으로 나아가는데 배경이 되는 알고리즘이다. 오래된 알고리즘이지만 제대로 이해해보자.
1.1 Perceptron의 정의
perceptron은 다음 요소들에 의해 정의되는 알고리즘 모델이다.
- 입력(x)
- 가중치(w)
- 출력(y)
- 임계값(t)
이 때 입력은 n차원의 벡터일 수 있고, 가중치 w는 이 입력과 동일한 차원을 가져야 한다. 이 때 출력은 입력과 가중치의 내적인 x*w가 설정한 임계값 t를 넘을 경우 1, 임계값 t를 넘지 않을 경우 0이 된다. 다음 <그림1>은 이런 perceptron을 그림으로 나타낸 것이다. x의 weighted sum이라는 용어는 x와w의 내적을 말한다.
1.2 Perceptron으로 논리 회로 만들기
이렇게 기본적으로 동작하는 Perceptron unit이 어떻게 복잡한 논리적 판단을 구성할 수 있는지 알아보기 위해 Perceptron 하나가 NOT, AND, OR등의 동작을 수행할 수 있음을 보이겠다. NOT,AND,OR만 있으면 모든 논리적 판단을 구성할 수 있으므로, 밑의 증명은 여러개의 Perceptron을 모아 복잡한 논리 판단을 구성할 수 있다는 명제에 대한 직관적인 증명이 될 것이다.
NOT gate의 동작은 1을 받았을 때 0, 0을 받았을 때 1을 출력하는 것이고 2-input인 AND gate와 OR gate의 동작은 다음 <그림2>와 같다.
이 때 이 gate 3개를 perceptron 하나로 설계해보자.
1.2.1 NOT gate
not gate를 설계하는 것은 매우 간단한 일이다. input이 하나이므로 weight도 숫자 하나다. 따라서 weight를 1로 잡은 다음 threshold를 -0.5로 잡으면 x가 1일 때 weighted sum은 -1, x가 0일 때 weighted sum은 0이므로 x가 1일 때는 threshold보다 작아서 0, x가 0일 때는 threshold보다 커서 1로 출력이 결정된다. 이를 python 상에서 간단한 함수로 구현해보면 다음과 같다.
def NOT(x1):
w1, threshold = -1, -0.5
wsum = w1*x1
if wsum <= threshold:
return 0
else:
return 1
1.2.2 AND gate
2-input AND gate도 위의 논리처럼 구현해보면 다음과 같이 하면 될 것이다. 복습 겸 CH1에서 다룬 numpy를 조금 활용해보자.
import numpy as np
def AND(x1, x2):
x = np.array([x1, x2])
w = np.array([1, 1])
threshold = 1.5 # wsum이 2일 때만 넘어갈 수 있게 설정
wsum = np.sum(x*w)
if wsum <= threshold:
return 0
else:
return 1
1.2.3 OR gate
위의 code에서 threshold를 0.5로 바꾸어 주면 된다. 그럼 하나만 1이어도 threshold를 넘는다.
1.2.4 XOR gate?
이렇게 NOT, AND, OR을 하나의 perceptron으로 구현할 수 있음을 살펴보았는데, 복잡한 논리 회로의 경우에는 하나의 perceptron으로 구현할 수 없는 경우가 있다. 예를들어 논리적 베타합인 XOR의 경우 하나의 perceptron으로 구현할 수 없다. [1]
이런 경우 아까 말했듯이 perceptron을 층층이 쌓은 multi-layer perceptron을 사용하면 XOR같은 복잡한 논리도 구현할 수 있다. 논리회로에서도 동일한 방법으로 이를 구현하는데, 실제로 밑의 <그림3>의 '가' 항목은 필자의 논리회로 수업 때 예비보고서에 적어야 할 사항이었는데, NAND만을 이용해 XOR을 구현하는 문제였다. (논리회로에서는 NAND가 AND보다 만들기 쉽다.)
<그림3>의 회로도를 우리의 다중 perceptron으로 구현해보면 된다. NAND는 이미 구현되어있는 AND에서 if/else에서의 결과만 반전하면 되고, 이를 이용해 XOR을 구현해보면 다음과 같다.
import numpy as np
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([1, 1])
threshold = 1.5 # wsum이 2일 때만 넘어갈 수 있게 설정
wsum = np.sum(x*w)
if wsum <= threshold:
return 1
else:
return 0
def XOR(x1, x2):
NANDA = NAND(x1,x2)
NANDC = NAND(x1, NANDA)
NANDD = NAND(x2, NANDA)
return NAND(NANDC, NANDD)
출력 확인 코드는 다음과 같다.
i1 = NAND(1,1)
i2 = NAND(1,0)
i3 = NAND(0,0)
print(i1,i2,i3)
x1 = XOR(0,0)
x2 = XOR(0,1)
x3 = XOR(1,0)
x4 = XOR(1,1)
print(x1,x2,x3,x4)
참고 사항
Reference: 밑바닥부터 시작하는 딥러닝(2019). 사이토 고키
[1] : Reference의 54.p 2.4 항목 참고
'머신러닝' 카테고리의 다른 글
[ML] 3. Logistic Regression (0) | 2020.07.27 |
---|---|
[ML] 2. Binary Classification & Linear Regression (0) | 2020.07.23 |
Week 4. 3rd Programming Assignment (0) | 2020.02.04 |
Week 3. 2nd Programming Assignment (0) | 2020.02.01 |
week 2. 1st Programming Assignment (0) | 2020.01.26 |
- Total
- Today
- Yesterday
- CS
- CNN
- RGB이미지
- 딥러닝
- 순환 신경망
- 자연어 처리
- 이미지
- Andrew ng
- 영상구조
- 밑바닥부터 시작하는 딥러닝
- 신호 및 시스템
- 이산 신호
- 매트랩 함수
- rnn
- Logistic Regression
- 머신 러닝
- ML
- 신경망
- 머신러닝
- 매트랩
- 인덱스 이미지
- 이미지처리
- Neural Network
- 영상처리
- 컴퓨터 과학
- NLP
- 사진구조
- 컴퓨터과학
- 연속 신호
- gradient descent
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |