Closed eubinecto closed 3 years ago
슬라이드 |
---|
![]() |
슬라이드 |
---|
![]() |
경사도 하강법:
weight_new = weight_old - learn_rate * loss_gradient
vanishing & exploding gradients 문제의 원인은 무엇이고, 어떤 현상이 나타나며, 심층 신경망의 학습에 어떠한 영향을 주는가?
loss_gradient
가 너무 작음 -> weight_old
랑 weight_new
가 사실상 거의 동일 -> 가중치에 변화 없음 -> 사실상 학습이 이루어지지 않음.loss_gradient
가 너무 큼 -> weight_new
가 너무 크게 변화함 -> 가중치에 매우 큰 변화 -> "step"이 너무 커져서, 수렴이 아닌 발산의 위험problem | 원인 | 결과 | 학습에 주는 영향 |
---|---|---|---|
vanishing gradient | the loss gradient is close to zero | virtually no change in the weights after gradient descent because the "step" is too small | ![]() |
exploding gradient | the loss gradient is too large | too much change in the weights after gradient descent because "step" is too huge, inconsistent | ![]() |
두 경우 모두, gradient가 불안정해짐으로 인해, 모델의 학습이 더뎌지는 것으로 볼 수 있다.
그렇다면 이 두 문제의 원인은 무엇이고, 사람들은 이 문제를 어떻게 해결했을까?
여러 이유가 있겠으나, 활성화 함수가 시그모이드인 경우, 모든 값이 0보다 크고 평균값이 0.5인 점이 기울기의 소멸의 큰 원인될 수 있는 것으로 분석한 논문이 있음.
Understanding the difficulty of training deep feedforward neural network:
sigmoid function을 사용함으로 인한 레이어 출력의 saturation 현상 |
---|
![]() |
sigmoid function이 saturate 할 때 |
---|
![]() |
기울기의 폭주로 weight값이 NaN
이 되어서 어쩔 줄 모르겠는 사람들이 아주 많이 보인다.
슬라이드 |
---|
![]() |
Bengio & Glorot은 논문에서
fan-in, fan-out에서의 convariance가 모든 레이어에 대하여 동일하도록 유지해야 한다.
라고 주장함.
완벽하게는 아니지만, 그런 효과를 어느정도 기대할 수 있는 방법:
혹은 배치 졍규화 레이어를 중간 중간에 추가한다.
깊은 신경망은 학습과정에서 그런 문제가 있었으나, 지금은 그 문제를 어느정도 해결할 수 있는 방법이 고안되었다.
"문제를 일으킬 소지가 있는 특정 데이터를 다른 데이터와 혼합해 처리" <- 먼소리?
"편미분을 이용한 손실 기울기 계산 과정을 정확히 이해하고 적용" <- 먼소리?
batch normalisation <- 두 문제를 해결하는데에 큰 도움이 되었음.
gradient clipping <- 기울기 폭주의 경우 특정 절댓값 이상으로 기울기가 증가하지 않게 threshold를 둠으로서 방지할 수 있다.
슬라이드 |
---|
![]() |
vanishing & exploding gradient은 RNN에서도 발생하며, 사실 DNN보다 RNN에서 두 문제가 더 심각하다. 이는 "동일한 내용의 가중치 행렬이 각 시간대에 반복 이용"되기 때문이다.
다음의 코드에 break point를 두고, 이게 무슨 말인지 알아보자. https://github.com/eubinecto/k4ji_ai/blob/e94a5d01fb0fb59a82e0a32e016356bbc9a75840/eb/src/chap_10/rnn_basic_model.py#L45-L54
그런데 각 시간대에 동일한 가중치를 사용하는 것이 왜 정보의 소멸 & 폭주문제를 야기할까? 어떤 정보가 소멸 혹은 폭주한다는 것인가? 왜 그런 문제가 유독 RNN에서 더 심할까?
슬라이드 |
---|
![]() |
먼저, 각 시간대에 동일한 가중치를 사용하는 것은 순전파 과정에서부터 순환 벡터 정보의 손실 / 폭주를 야기할 수 있다. 다른 요인들(가중치, 각기 다른 벡터성분)에 의해 완화될 수 있기에 손실 기울기의 소멸 및 폭주 문제보다 심각하지는 않다.
슬라이드 |
---|
![]() |
각 시간대에 동일한 가중치를 사용하는 것은 역전파 과정에서는 손실 기울기 정보의 손실 / 폭주를 야기할 수 있다.
Stanford CS224N: NLP with Deep Learning | Winter 2019 | Lecture 7 – Vanishing Gradients, Fancy RNNs:
왜 손실 기울기가 불안정해지는가? |
---|
![]() |
chain rule을 따라서 가장 과거에 존재하는 시간대의 최종 loss에 대한 편미분을 구해보면 위와 같다. 미래 시간대에 존재하는 시간대에서의 손실 기울기 편미분을 차례대로 곱해주어야 한다.
|
그런데 만약, 손실 기울기가 그렇게 backpropagate하는 과정 속에서, 중간의 손실 기울기가 모두 0에 가깝거나, 절댓값이 1보다 크다면 어떻게 될까? 각각
h1
에서의 손실 기울기의 소멸 / 폭주를 초래할 것이다.|
|
좀더 formal proof sketch. 만약 i=20이고, previous state j=0이라면, 전체 손실기울기에 대한 j=0에서의 손실 기울기는 똑같은 가중치 행렬
W_h
를 20번 제곱을 해야한다(만약 W_h
의 절댓값이 1보다 작다면 j=0에 도달 했을 때, 최종 손실 기울기는 0에 가까워져 "vanish"해버린다). 즉, 만약 가중치 행렬 속 원소값의 절댓값이 1보다 작다면 / 크다면, i <-> j의 격차가 벌어지면 벌어질 수록 j에서의 손실 기울기는 소멸한다 / 폭주한다.
그런데 이러한 순환 벡터 & 손실 기울기 정보의 손실은 RNN의 성능에 어떠한 영향을 미치는가?
슬라이드 |
---|
![]() |
그렇다면 RNN에서의
[Stanford CS224N: NLP with Deep Learning | Winter 2019 | Lecture 7 – Vanishing Gradients, Fancy RNNs](https://youtu.be/QEw0qEa0E50?t=804): why is vanishing gradient a problem? |
---|---|---|
![]() |
vanishing gradients with RNN: 특히, long-term dependency가 중요하게 작용하는 언어를 학습 시킬 때 문제가 된다.
예를 들면, plurality 매칭:
이렇게 멀리 떨어져서 존재하는 패턴의 경우, RNN은 입력 time frame이 길어지면 기울기 손실 & 폭주 가능성이 높아지는 현상으로 인해, 학습을 잘하지 못한다.
즉, RNN으로 짧은 문장을 만드는 것은 가능하지만, 앞뒤가 맞는 하나의 유기적인 에세이를 쓰도록 훈련시키는 것은 매우 어렵다.
그리고 그 이유는 위에서 설명하듯, sequence의 길이가 길어질수록 똑같은 가중치가 각 시간대에 동일하게 곱해지면서, 기울기 손실 & 폭주가 빈번하게 일어나기 때문.
비유하자면 "단기기억상실증"에 걸린 모델이다 |
---|
Dori's Short-term memory loss![]() |
(pg. 514, Hands on ML 2) ... After a while, the RNN's state contains virtually no trace of of the first inputs. This can be a showstopper. Image Dory the fish trying to translate a long sentence; by the time she's finished reading it, she has no clue how it started |
슬라이드 |
---|
![]() |
RNN의 이런 문제를 극복하기 위해, RNN의 기본 단위를 보다 더 복잡한 구조로 바꾸는 방법이 모색되었다. 그런 motive를 바탕으로 고안된 모델이 LSTM이다.
p.491 "문제를 일으킬 소지가 있는 특정 데이터를 다른 데이터와 혼합해 처리" 부분에 대한 코멘트인데요.
Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift 위 논문의 한국어 정리
이 논문에 기반해서 나온 얘기인 것 같은데 맥락은 이해가 가지만 여전히 "문제를 일으킬 소지가 있는 특정 데이터를 다른 데이터와 혼합해 처리"라는 표현은 잘 모르겠네요.
LSTM에 대한 간략한 소개
깊은 신경망에서의 기울기 손실 & 폭주 문제
깊은 신경망에서의 기울기 손실 & 폭주 문제 해소
순환 신경망에서의 소멸 및 폭주 문제
순환 벡터 원소 값의 소멸 및 폭주 문제
순환 계층 순전파 과정과 역전파 과정에서의 소멸 및 폭주 문제
순환 계층 소멸 및 폭주 문제의 심각성
순환 계층 소멸 및 폭주 문제의 대안 및 해결책