본문 바로가기

딥러닝

4. 시그모이드와 크로스엔트로피, 양수출력문제, 죽은 ReLU

 

 

 

 

 

Sigmoid와 Cross Entropy Loss의 관계

일반적으로 딥러닝을 이용하여 이진분류 문제를 해결할 때 출력의 마지막 단에 Sigmoid layer를 추가하고, 그 다음 Cross entropy loss 함수를 적용한다. Backpropagation은 Loss function을 시작으로 network를 순차적으로 미분하는 과정이다. 그렇다면 끝에서 두 번째 layer인 Sigmoid도 어쨌거나 미분의 대상이 된다.

하지만 전 게시글에서 알아보았듯이 Sigmoid는 지수형태로 주어지므로 Sigmoid의 입력값의 절댓값이 클 때 Gradient가 0에 가까워지는 Gradient saturation이 발생한다. 따라서 Activation function으로 sigmoid를 사용하는 것은 적절치 못한데, 그렇다면 왜 output layer에서는 sigmoid를 사용할 수 있을까? 그것은 바로 sigmoid와 cross entropy의 결합에 있다.

 

먼저 Binary cross entropy loss는 다음과 같이 수식으로 나타낼 수 있다.

$$J(\theta)= -\sum_{i=1}^{N}t_i \cdot \log \mu(\vec{x}_i ; \vec{\theta}) + (1-t)\cdot \log(1-\mu(\vec{x}_i ; \vec{\theta})) $$

class $t=1$ 경우 위 식은 $J(\vec{\theta})=-\log(\mu(\vec{x}; \vec{\theta}))$로 나타낼 수 있다. 이를 풀어쓰면 다음과 같다.

$$ \begin{equation}\begin{aligned} J(\theta) &= -\log (\mu(\vec{x}; \vec{\theta})) \\ &= -\log\bigg(\frac{1}{1+e^{-\vec{x}}}\bigg) \\ &=\log(1+e^{-\vec{x}}) \\ &=\text{softplus}(-\vec{x})  \end{aligned}\end{equation}$$

 

이때 softplus 함수는 다음과 같은 개형을 가진다.

ReLU와 비슷한 개형이지만 스무스한 곡선으로 주어진다. Sigmoid는 입력값이 큰 양수일 때 gradient saturation이 발생하지만 sigmoid와 cross entropy를 같이 사용하는 경우 softplus함수가 되어 양수 범위에서 gradient saturation이 발생하지 않는다. (Softplus 함수의 개형을 보면 $x<0$ 범위에서 gradient saturation이 발생한다. 하지만 일반적으로 모델의 출력은 양수로 주어지므로 gradient saturation 문제가 제약이 되지 않는다. 양수 범위에서만 조심하면 되는 것임)

 

 

 

class $t=1$인 경우에도 마찬가지로 sigmoid와 cross entropy의 결합으로 softplus가 생성된다. Sigmoid를 단독으로 사용하면 심각한 gradient saturation이 발생하지만 cross entropy와 결합하면 이를 해결할 수 있다. 따라서 모델의 output 단에서 sigmoid를 사용하는 것은 역전파를 방해하지 않는다.

 

 

 

Activation의 양수 고집 문제

activation function을 다룰 때 ReLU, sigmoid 등에서 치역이 오로지 양수범위인 것이 문제점이라고 했다. (그래서 sigmoid 이후에 hyperbolic tangent를 사용하게 됨) 이때 발생하는 문제점이 어떤 것인지 드디어 다뤄본다.

간단한 예시를 들기 위해 $x_1,x_2,\cdots,x_n$을 입력으로 받아서 $z=\vec{w}^T \vec{x}+b$를 출력하고, 이를 activation function $f$에 입력한 결과를 $\text{output}=y=f(z)$라고 한다.

 

loss function을 $J$라고 할 때 역전파를 수행하기 위해서 $\frac{\partial J}{\partial \vec{w}}$가 이루어진다. 이는 연쇄법칙을 통해 다음과 같이 다시 쓸 수 있다. 

$$\frac{\partial J}{\partial \vec{w}} = \frac{\partial J}{\partial z} \cdot \frac{\partial z}{\partial \vec{w}} $$

이때 오른쪽 $\frac{\partial z}{\partial \vec{w}}=\vec{x}$로 만약 input $\vec{x}$가 양수이면 $\frac{\partial z}{\partial \vec{x}}$도 항상 양수가 되는 것이다. 이 경우 $\frac{\partial J}{\partial \vec{w}}$의 부호는 철저히 $\frac{\partial J}{\partial z}$에 의존한다. 즉, $\frac{\partial J}{\partial \vec{w}}=\bigg(\frac{\partial J}{\partial w_1}, \frac{\partial J}{\partial w_2}, \cdots, \frac{\partial J}{\partial w_n} \bigg)$이 전부 양수이거나 전부 음수이다.

 

 

weight가 2차원인 간단한 예시에서 이를 살펴보면 위와 같다. optimal weight는 4사분면에 존재하지만 weight update는 1사분면 혹은 3사분면 방향으로만 이동이 가능하므로 270~360도 각도로는 벡터를 이동시킬 수 없다. 따라서 4사분면의 optimal point에 도달하기 위해서는 비효율적인 zig zag path를 따라 움직여야 한다.

 

 

정리하면 다음과 같다.

  1. Hidden layer의 activation function이 양수만 출력하는 경우에
  2. Hidden layer의 한 층에서 다음 층으로 이동할 때 반드시 양수만 입력하게 된다. $\vec{x}=(x_1,x_2,\cdots, x_n)$ 전부 양수이다.
  3. 이 경우 $\frac{\partial z}{\partial \vec{x}}=\vec{x}=(x_1, x_2, \cdots, x_n)$이 전부 양수가 되어버린다.
  4. 그에 따라 $\frac{\partial J}{\partial \vec{w}} = \bigg(\frac{\partial J}{\partial w_1},\frac{\partial J}{\partial w_2}, \cdots, \frac{\partial J}{\partial w_n}  \bigg)$이 전부 같은 부호를 가지게 된다.
  5. 해결하려면 어떻게 해야되냐? $\rightarrow$ activation function의 치역이 음수, 양수 모두에서 정의된다면 $\vec{x}=(x_1, x_2, \cdots, x_n)$에 음수, 양수가 섞여있을 수 있다.

 

 

 

 

 

죽은 ReLU

ReLU는 왜 죽는걸까? 알아보도록하자. 먼저 모델은 역전파를 위해 다음 계산식을 수행한다.

$$\frac{\partial J}{\partial \vec{w}} = \frac{\partial J}{\partial z} \cdot \frac{\partial z}{\partial \vec{w}} $$

 

위에서 살펴보았듯이 $\frac{\partial z}{\partial \vec{w}}=\vec{x}$인데, 이때 $\vec{x}$가 아주 큰 값이면 결과적으로 $\frac{\partial J}{\partial \vec{w}}$도 커지며 $\vec{w}^+ = \vec{w}-\alpha \frac{\partial J}{\partial \vec{w}} $이 큰 음수가 될 수 있다. 이렇게 weight가 한 번 음수가 되고나면 다음 가중합산 결과가 음수가 되므로 ReLU 출력은 0이 되어 ReLU의 gradient가 0으로 죽어버리게 된다.

 

 

죽은 ReLU에 대해서 지금 당장 직관적으로 이해되지 않는다. 역전파 개념을 한 번 더 공부하고 나서 다시 생각해 볼 필요가 있다.

 

 

 

'딥러닝' 카테고리의 다른 글

6. 배치, 미니배치, SGD  (0) 2023.09.15
5. 경사하강법, 역전파 알고리즘  (0) 2023.09.15
Optuna document 읽어보기  (0) 2023.09.14
3. 활성화 함수 (Activation function)  (0) 2023.09.13
2. 분류와 회귀  (0) 2023.09.13