Activation Functions
sigmoid 함수가 아닌 다른 것으로 선택할 수 있음
시그모이드 함수 $\sigma(z^{[i]})$가 아닌 $g(z^{[i]})$를 사용할 수 있음
- sigmoid 함수 $a = \frac{1}{1+e^{-z}}$ : 0 ~ 1
- tahn 함수 $a = tanh(z) = \frac{e^{z}-e^{-z}}{e^{z}+e^{-z}}$ : -1 ~ 1
- tanh 함수는 시그모이드 함수를 shift 한 거
- 시그모이드 함수보다 나음 (데이터의 centre (평균)를 $0.5$가 아닌 $0$으로 잡게 되기 때문에 학습에 더 용이)
- 마지막 레이어 제외하고는 시그모이드 거의 쓰지 않음 : 마지막 레이어의 출력은 이진 분류에서 0~1 사이가 되기 때문
- 레이어마다 다른 활성화 함수를 사용할 수 있으며 superscript로 표시함 (Ex. $g^{[1]}(z^{[1]})$)
- sigmoid 함수와 tanh 함수의 단점 : $z$가 매우 크거나 작으면 활성화 함수의 gradient가 0에 가까워지기 때문에 gradient descent에서 속도가 느려질 수 있음
- ReLU 함수 $a=max(0,z)$
- $0$보다 크면 미분값이 $1$이고 작으면 $0$이다
- 딱 $0$ 일 때의 미분값은 not defined 이나, 실제 적용할 때는 $0$ 혹은 $1$ 로 간주할 수 있으니 ok
- to choose activation function?
- output이 0과 1 사이인 이진 분류라면 마지막 레이어에 sigmoid 함수를 쓴다
- ReLU를 요즘 많이 쓴다 - 잘 모르겠으면 그냥 이걸 쓰세요
- ReLU의 단점은 $z$가 음수일 때 미분값이 $0$이라는 건데, 실제로는 잘 작동
--> Leaky ReLU $a = max(0.01z, z)$ : $z$가 음수일 때 slope 가 살짝 존재
- ReLU 학습이 더 빠른 이유 : 함수의 slope가 0이 되는 영향이 덜하기 때문에
- ReLU 도 음수일 때는 slope 가 0인데?
-> 실제로 은닉층에서 $z$값은 웬만하면 0보다 클 것임
(1) sigmoid
(2) tanh
(3) ReLU
(4) Leaky ReLU
Why do you need Non-Linear Activation Functions?
왜 신경망은 비선형적인 activation function 이 필요할까?
위 식에서 $a^{[1]} = z^{[1]} $ (혹은 $g(z)=z$) 라고 가정해보자.
--> $g(z)$는 Linear Activation Function or identity activation function
마찬가지로 $ a^{[2]} = z^{[2]}$
이 모델은 $\hat{y}$을 input feature의 linear function으로 계산하고 있음
$$a^{[1]} = z ^{[1]} = w ^{[1]}x + b ^{[1]} $$
$$a^{[2]} = z ^{[2]} = w ^{[2]}a^{[1]} + b ^{[2]} $$
즉,
$$a^{[2]} = w^{[2]}(w ^{[1]}x + b ^{[1]} ) + b^{[2]} = (w^{[2]}w^{[1]})x + (w^{[2]}b^{[1]}+b^{[2]}) = w\prime x + b\prime$$
linear(identity) activation function을 사용하면, 모델도 output의 linear function 을 출력하게 된다($ w\prime x + b\prime$)
나중에 레이어가 깊어졌을 때, linear activation function을 사용한다면 아무리 레이어가 깊어져도 linear activation function을 계산하는 셈이 됨
이렇게 생긴 레이어는 그냥 logistic regression과 다를 바가 없음
그렇다면 linear activation function $g(x )=z$을 적용하는 사례는? regression problem에 머신러닝을 적용할 때.
예를 들어 집값을 예측할 때, $y \in R$ 이면 $\hat{y}$ 도 real number
하지만 이마저도 ReLU 같은 함수 사용 (집값이 음수는 되지 않으니까)
하지만 은닉층들은 output layer 말고는 linear activation function을 쓰지 않는다
Derivatives of Activation Functions
[시그모이드 함수]
$g(z) = \frac{1}{1+e^{-z}}$ 의 derivatives(slope)?!
즉 z에서의 미분값은?
$$g \prime (z) = \frac{d}{dz}g(z) = \frac{1}{1+e^{-z}}(1- \frac{1}{1+e^{-z}} ) = g(z)(1-g(z)) $$
신경망 식으로 생각하면 $g \prime (z) = a(1-a)$, 이때 $a$의 값을 구했다면 쉽게 slope를 구할 수 있음
[Tanh 함수]
$g(z) = tanh(z) = \frac{e^{z}-e^{-z}}{e^{z}+e^{-z}}$ 의 derivatives
$$g \prime (z) = \frac{d}{dz}g(z) = 1 - (tanh(z))^{2}$$
$a=g(z)$라면, $g \prime (z) = 1-a^{2}$
[ReLU 함수]
$g(z) = max(0, z) $ 이므로
$$g \prime (z) =\begin{cases}0 & z < 0\\ 1 & z > 0 \\ undefined & z = 0\end{cases} $$
실제 적용할 때는 $z = 0$일 때 문제가 되지는 않는다 -> z가 정확하게 0이 될 확률이 희박하기 때문
[Leaky ReLU 함수]
$g(z) = max(0.01z, z) $ 이므로
$$g \prime (z) =\begin{cases}0.01 & z < 0\\ 1 & z > 0 \\ undefined & z \geq 0\end{cases} $$
Gradient Descent for Neural Networks
single hidden layer 를 가지고 있다고 했을 때
- 파라미터
$w^{[1]}$, $b^{[1]}$, $w^{[2]}$, $b^{[2]}$
$n_{x} = n^{[0]},\ n^{[1]},\ n^{[2]}=1$ 일 때 shape :
- $w^{[1]}$ <-- $(n^{[1]}, n^{[0]})$
- $b^{[1]}$ <-- $(n^{[1]}, 1)$
- $w^{[2]}$ <-- $( n^{[2]}, n^{[1]})$
- $b^{[2]}$ <-- $( n^{[2]}, 1)$
*지금까지 $n^{[2]}=1$인 예시만 확인했음
- Cost function
lost function의 평균, 즉
$$J( w^{[1]}, b^{[1]}, w^{[2]}, b^{[2]}) = \frac{1}{m} \sum_{i=1}^m L(\hat{y}, y)$$
이때 $\hat{h} = a^{[2]}$
- Gradient descent
파라미터 initialize 한 후, loop마다 예측을 할 것임
$Repeat\ \{$
$$ Compute\ prediction (\hat{y}^{(i)},\ i = 1 \ldots m)$$
$$dw^{[1]} = \frac{\partial J}{\partial w^{[1]} },\ db^{[1]} = \frac{\partial J}{\partial b^{[1]} }\ldots$$
$$ w^{[1]} := w^{[1]} - \alpha dw^{[1]} $$
$$ b^{[1]} : = b^{[1]} - \alpha db^{[1]} $$
$\ldots\ \}$
[Formulas for computing drivatives]
-forward propagation
- 모두 벡터화된 상태라고 생각 ($Y = \begin{bmatrix}y^{(1)} & y^{(2)} & \ldots & y^{(m)} \end{bmatrix} $)
$Z^{[1]} = W^{[1]}X + b^{[1]}$
$A^{[1]} = g^{[1]}(Z^{[1]})$
$Z^{[2]} = W^{[2]}A^{[1]} + b^{[2]}$
$A^{[2]} = g^{[2]}(Z^{[2]}) = \sigma(Z^{[2]})$
- backpropagation (compute derivatives)
*logistic regression을 위한 gradient descent와 유사함
$dZ^{[2]} = A^{[2]} - Y $
$dW^{[2]} = \frac{1}{m}dZ^{[2]}{A^{[1]}}^{T}$
$db^{[2]}= \frac{1}{m}np.sum(dZ^{[2]},\ axis=1,\ keepdims=True)$
- numpy
command for summing across one-dimension of a matrix
- axis=1
: horizontally 계산
- keepdims=True
: rank array 로 출력하는 것을 방지, $(n^{[2]},\ )$ 가 아니라 $(n^{[2]}, 1)$로 출력하게끔
- 아래에서와 다르게 하나의 실수를 출력하게 되므로 그렇게 중요하지 않을 수도. 그러나...
$dZ^{[1]} = {W^{[2]}}^{T}dZ^{[2]} \ast g^{[1]}\prime(Z^{[1]})$
- $\ast$ : element-wise product
- ${W^{[2]}}^{T}dZ^{[2]}$ : $(n^{[1]}, m)$ matrix
- $g^{[1]}\prime(Z^{[1]})$ : $(n^{[1]}, m)$ matrix
$dW^{[1]} = \frac{1}{m}dz^{[1]}X^{T}$
$db^{[1]} = \frac{1}{m} np.sum(dZ^{[1]},\ axis=1,\ keepdims=True)$
- 위와 다르게 $db^{[1]}$ 는 $(n^{[1]}, 1)$ 벡터
Backpropagation Intuition
Random Initialization
- weight을 random하게 initialize하는 것은 중요
- logistic regression 에서는 weights를 $0$으로 초기화해도 괜찮음 - 하지만 NN에서는 안 됨
위 그림과 같은 경우, $n^{[0]}=2$, $n^{[1]}=2$ 이므로 0으로 초기화한 $w^{[1]}$ 는 $\begin{bmatrix} 0 & 0\\ 0 & 0 \end{bmatrix}$ 그리고 $b^{[1]}$ 는 $\begin{bmatrix} 0 \\ 0 \end{bmatrix}$
*bias 항은 $0$으로 초기화해도 괜찮음
위처럼 설정할 경우, ${a_{[1]}}^{1} = {a_{[2]}}^{1}$ 가 되므로 (같은 function을 계산하는 셈이 되기 때문)
이때 backpropagation을 계산하면 ${dz_{[1]}}^{1} = {dz_{[2]}}^{1}$
즉 weight를 $0$으로 설정하면 한 레이어의 hidden unit 들이 동일하게 된다 --> completely symmetric
iteration 마다 동일한 function을 계산함
결국 2개 이상의 hidden unit을 가지고 계산하는 것이 의미없는
--> hidden unit 들을 random 하게 initialize 한다
$w^{[1]} = np.random.randn((2, 2)) \times 0.01$
- 매우 작은 난수
$b^{[1]} = np.zero((2, 1))$
- $b$는 symmetric 문제가 없으므로 0으로 해도 괜찮음
$w^{[2]}$, $b^{[2]}$. ...도 마찬가지
$w^{[2]} = np.random.randn((1, 2)) \times 0.01$
왜 $0.01$을 곱할까?
weight($W$)가 너무 크면, $Z^{[1]}=W^{[1]}x+b^{[1]}$도 매우 클 것이고, 그러면 sigmoid, tanh 함수에서 gradient가 매우 작아지는 구간에 가까워진다 -> 학습이 느려진다
it causes your tanh or sigmoid activation function to be saturated, thus slowing down learning
sigmoid나 tanh 함수가 아니라면 덜 문제적일 수도 있지만, 이진분류에서 마지막 output unit 이 sigmoid 라면 initial parameters가 너무 크면 안 됨
$0.01$보다 높아야 할 때?
shallow network는 $0.01$로 괜찮다면, 더 큰 신경망이라면 더 큰 상수를 골라야 할 수도
하지만 어떤 경우든 비교적 작은 숫자를 곱하게 됨
QUIZ
1) $b^{[2]}$ 는 $(1, 1)$ 도 골랐어야 했겠지...?
2) 10번은 2번이 정답
'인공지능 > DLS' 카테고리의 다른 글
강좌1 정리 노트 (0) | 2022.07.03 |
---|---|
[1.4.] Deep Neural Networks (0) | 2022.07.02 |
[1.3.] Shallow Neural Networks(1) (0) | 2022.06.26 |
[1.2.] Neural Networks Basics - Python and Vectorization (0) | 2022.06.26 |
[1.2.] Neural Networks Basics - Logistic Regression as a neural network(3) (0) | 2022.06.26 |