안녕하세요~
오늘은 XOR(다층 퍼셉트론)과 신경망 활성화 함수(activation function) 에 대해 알아보겠습니다.
XOR에 대해 먼저 알아보도록 하겠습니다.
[ XOR 진리표 ]
XOR 게이트는 단층 퍼셉트론으로 구현이 되지 않습니다.
따라서, 다층 퍼셉트론으로 구현해야합니다.
" 단층 퍼셉트론 vs 다층 퍼셉트론 "
"단층 퍼셉트론"이란,
AND, OR, NAND 게이트와 같이
입력층에 가중치를 곱해 바로 출력되는 퍼셉트론입니다.
아래와 같이 표현할 수 있습니다.
"다층 퍼셉트론"이란,
퍼셉트론을 층으로 쌓은 것으로,
입력층과 출력층 사이 은닉층이 존재하는 것입니다.
위와 같은 다층 퍼셉트론으로 XOR 게이트를 구현할 수 있습니다.
XOR 게이트는 아래와 같이 AND, OR, NAND를 조합해서 만들 수 있습니다.
※ 참고: 각각의 게이트는 아래와 같은 의미 갖고 있습니다.
이제 XOR 진리표를 완성해볼까요?
문제1. XOR 게이트를 파이썬으로 구현해보세요
활성화 함수란?
입력신호의 총합을 출력신호로 변환하는 함수를 일반적으로 활성화 함수라고 합니다.
활성화 함수는 입력신호의 총합이 활성화를 일으키는지 정하는 역할을 합니다.
출처: Deep Learning from Scratch
" 활성화 함수의 종류 3가지 "
1. 계단함수(Step Function) : 0 또는 1 의 값을 출력하는 함수
2. 시그모이드 함수(Sigmoid Function) : 0 ~ 1 사이의 실수를 출력하는 함수
3. ReLu(Rectified Linear Units) : 입력이 0이 넘으면 그 입력값을 그대로 출력하고 0 이하이면 0을 출력하는 함수
이제 각각의 특징을 알았으니, 파이썬으로 구현해보도록 하겠습니다.
1. 계단함수 (Step Function)
" 퍼셉트론에서는 활성화 함수로 계단함수를 이용한다. "
" numpy로 계단함수 구현하기 "
import numpy as np
def step_function(x_data): # return [0 if x<=0 else 1 for x in x_data ]
# np.array.astype(np.int): bool type을 정수로 변환하기 return (x_data > 0).astype(np.int)
문제2. 위에서 만든 계단함수를 이용해서, 아래와 같이 그래프를 그리시오
2. 시그모이드 함수 (Sigmoid Function)
※ 계단함수와 시그모이드 함수의 공통점 & 차이점
[공통점]
둘다 0과 1 사이의 데이터만 출력한다
비선형 함수이다.
[차이점]
계단함수는 숫자 1 과 0만 출력하는데 시그모이드 함수는 0과 1사이의 실수를 출력한다.
[시그모이드 함수식]
" 통계학에서 성공할 확률이 실패할 확률보다 얼마나 큰지를 나타내는 오즈비율이라는 값이 있다. "
오즈비율(Odds ratio) = 성공 / 실패 = P / (1 - P)
성공할 확률 P를 0에서 1사이의 값으로 나타내면,
실패할 확률은 (1 - P)이다.
위에 그래프에서 확인할 수 있듯이,
P(성공할 확률)가 1에 가까워지면 오즈 비율 값이 급격히 커지는 현상이 발생한다.
그러한 현상을 방지하기 위해, 로그를 취한 Logit이라는 함수를 만든다.
* 로그를 사용하는 이유: 큰 숫자를 작은 숫자로 표현하기 위해
Logit Function = log(P/(1-P)) = wx + b
이 로짓 함수를 뉴런의 출력값에 따라 확률 P를 구하기 쉽도록 지수 함수 형태로 바꾸면,
위에서 확인한 시그모이드 함수가 됩니다.
" numpy로 Sigmoid 함수 구현하기"
import numpy as np def sigmoid(x): return 1 / (1 + np.exp(-x))
문제3. 위에서 만든 시그모이드 함수를 이용해서, 아래와 같이 그래프를 그리시오
3. ReLu 함수( RectifiedLinearUnits Function)
" 최근에는 활성화 함수로 ReLU(렐루)함수를 주로 이용합니다 "
이유는 이후 포스팅에 설명하겠습니다.
"numpy로 ReLU 함수 구현하기"
import numpy as npdef relu(x):# if x <= 0: # return 0 # return x# maximum 은 두 입력 중 큰 값을 선택해 반환하는 함수이다.return np.maximum(0,x)
문제4. 위에서 만든 렐루(ReLU)함수를 이용해서, 아래와 같이 그래프를 그리시오
오늘은 여기까지!!
다음 주에는 신경망으로 돌아올게요!!
'PYTHON으로 딥러닝하기' 카테고리의 다른 글
파이썬으로 딥러닝하기 | 손실함수 평균제곱오차(MSE) & 교차 엔트로피 오차(CEE) (1) | 2018.08.29 |
---|---|
Python으로 딥러닝하기 | 퍼셉트론 vs 신경망? & 출력함수(항등함수, Softmax 함수) (0) | 2018.08.21 |
파이썬으로 딥러닝하기 | 퍼셉트론(Perceptron)이란? (2) | 2018.08.16 |
딥러닝에 필요한 파이썬 기본 문법 | numpy & matplotlib (0) | 2018.08.16 |
Gradient Descent(경사하강법) 와 SGD( Stochastic Gradient Descent) 확률적 경사하강법 (0) | 2018.08.01 |