일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 조합론
- 백트래킹
- 알고리즘
- DP
- 다익스트라
- 너비 우선 탐색
- object detection
- dfs
- 미래는_현재와_과거로
- back propagation
- 크루스칼
- BFS
- pytorch
- 문자열
- 2023
- NEXT
- 분할 정복
- 회고록
- c++
- 가끔은 말로
- 자바스크립트
- 우선 순위 큐
- 세그먼트 트리
- tensorflow
- 플로이드 와샬
- 가끔은_말로
- 이분 탐색
- dropout
- lazy propagation
- Overfitting
- Today
- Total
Doby's Lab
Gradient Vanishing / Exploding에 대하여 본문
✅ 1. Intro
Gradient Vanishing / Exploding의 문제에 대해 알아보겠습니다.
이 문제에 대해 왜 발생하는지를 알기 위해 앞서 Back Propagation에 대해 포스팅으로 정리해 두었습니다.
https://draw-code-boy.tistory.com/519
✅ 2. Gradient Vanishing
📄 2.1. What
Gradient Vanishing이란 가중치 업데이트를 하면서 점점 가중치의 변화가 줄어들며, 거의 정착되어 보이는 것처럼 보이고, 이로 인해 최적의 모델을 찾을 수 없게 되는 현상입니다.
📄 2.2. Why
왜 발생하는지에 대해 알아봅시다. 앞서 다룬 Back Propagation 포스팅의 MLP 구조에서 input layer의 가중치가 업데이트를 할 때 더해주는 항을 가져와보겠습니다.
$$ \frac{\partial J_{total}}{\partial w_{1,1}^{(1)}}
= \frac{\partial J_{total}}{\partial a_1^{(3)}}
\times\frac{\partial a_1^{(3)}}{\partial z_1^{(3)}}
\times\frac{\partial z_1^{(3)}}{\partial a_1^{(2)}}
\times\frac{\partial a_1^{(2)}}{\partial z_1^{(2)}}
\times\frac{\partial z_1^{(2)}}{\partial w_{1,1}^{(1)}} $$
이 MLP에서 활성화 함수로 모든 layer에 대해 sigmoid 함수를 사용했습니다.
sigmoid 함수에 대한 미분을 나타내는 항은 아래의 2개로 정리됩니다.
$$ \frac{\partial a_1^{(3)}}{\partial z_1^{(3)}}=\phi(z_{1}^{(3)})(1-\phi(z_{1}^{(3)})),\;\frac{\partial a_1^{(2)}}{\partial z_1^{(2)}}=\phi(z_{1}^{(2)})(1-\phi(z_{1}^{(2)})) $$
그런데 시그모이드 함수는 아래와 같이 생긴 함수입니다.
0일 때의 미분 값이 제일 최댓값으로 보이는데 시그모이드 함수를 미분했을 때, 최댓값을 보면 아래와 같습니다.
0.25가 시그모이드 함수 미분의 최댓값인데 이러한 값을 가중치 업데이트 할 때마다 곱하여 가중치에서 빼준다고 생각합시다.
곱할수록 0에 가까워지는 값으로 기존의 가중치에 변동을 주어봤자 크게 변할 수가 없을 것입니다.
또한, Layer가 깊어질 때, input layer에 다가갈수록 곱해지는 항들이 매우 늘어납니다. 이에 따라 input layer에 다가갈수록 시그모이드 함수의 미분 값 곱셈이 많아질 것이고, Vanishing 현상이 더 심하게 일어난다고 이해할 수 있습니다.
📄 2.3. Solve
그렇다면 이러한 문제점을 해결하기 위해서는 어떤 방안들이 있는지 알아봅시다.
2.3.1. ReLU
기본적으로 활성화 함수를 시그모이드 함수가 아닌 다른 함수를 쓰는 방법이 있습니다.
대표적으로는 'ReLU' 함수가 있습니다.
ReLU 함수를 미분했을 때는 입력 값이 양수라면 기울기가 1이라 보존되지만, 0이 되어버리는 경우에는 여전히 Vanishing 문제를 해결하지 못하는 게 됩니다. 이러한 점을 보완하여 나온 함수가 'Leaky ReLU' 함수입니다.
2.3.2. Batch Normalization
시그모이드 함수의 미분 출력 값들이 0에 가까워지는 이유는 시그모이드 함수에 대한 입력 값이 크기 때문입니다.
이러한 점에 대해 입력 값에 대한 편차를 줄이고자 나온 방안이 Batch Normalization입니다.
Batch Normalization은 Batch 단위로 훈련할 때, 출력 값들에 대한 편차를 줄이고자 정규화하여 다음 Layer 혹은 활성화 함수에 보내는 방식으로 Vanishing에 대한 적절한 개선 방안입니다.
스케일에 대하여 정규화를 한 것이기 때문에 완전히 Vanishing 문제에 대하여 해결할 수 있다고 볼 수는 없습니다.
✅ 3. Gradient Exploding
📄 3.1. What
Gradient Vanishing이란 Vanishing과 상반되어 나타나는 현상으로 원인은 Vanishing과 유사한 원인이 있고, 다른 하나는 높은 Learning Rate로 인한 발생 원인이 있습니다.
📄 3.2. Why
Vanishing에서 사용한 input layer의 가중치의 업데이트 항을 다시 가져와보겠습니다.
$$ \frac{\partial J_{total}}{\partial w_{1,1}^{(1)}}
= \frac{\partial J_{total}}{\partial a_1^{(3)}}
\times\frac{\partial a_1^{(3)}}{\partial z_1^{(3)}}
\times\frac{\partial z_1^{(3)}}{\partial a_1^{(2)}}
\times\frac{\partial a_1^{(2)}}{\partial z_1^{(2)}}
\times\frac{\partial z_1^{(2)}}{\partial w_{1,1}^{(1)}} $$
이번에 주목해보아야 할 항은 미분을 함에 따라 생기는 가중치에 대한 항입니다.
$$ \frac{\partial z_1^{(3)}}{\partial a_1^{(2)}} = w_{1,1}^{(2)} $$
가중치 항은 충분히 학습을 통해 1보다 커질 수 있습니다. 이를 통해 layer가 깊어질수록 가중치가 많이 곱해질 것이고,
input layer에 가까워짐에 따라 Exploding 현상이 심하게 나타날 수 있습니다.
📄 3.3. Solve
가중치가 원인으로 발생하는 문제로 활성화 함수의 변경은 큰 도움이 되지 못합니다.
3.1 Regularization
가중치가 큰 값을 가지면서 발생하는 문제이기 때문에 규제를 적용하여서 너무 큰 값을 가지지 않도록 하면 Exploding을 막을 수 있습니다.
3.2 Gradient Clipping
Gradient가 일정 임계값을 넘어가게 되면 임계값을 넘어가지 않도록 가중치를 학습하는 방법입니다.
✅ 4. Reference
https://heytech.tistory.com/388
https://imlim0813.tistory.com/42
'AI > Concepts' 카테고리의 다른 글
Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift (4) | 2023.01.22 |
---|---|
Activation이 Non-linearity를 갖는 이유 (0) | 2023.01.21 |
Back-Propagation(역전파)에 대하여 (1) | 2023.01.16 |
Batch Normalization이란? (Basic) (0) | 2023.01.02 |
Dropout에 대하여 (1) | 2022.12.31 |