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번이 정답

복사했습니다!