먼저 역전파를 하는 이유는 결과의 오류를 바로잡기 위함이고, 이를 위해 각 layer들의 가중치(w)를 조절하게 됩니다.
cost함수를 최적화하기 위해 기울기를 구하게 되고 이때 기울기는 해당 함수의 미적분값이겠죠.
문제는 여기서 발생합니다. 신경망이 곱하기연산을 기반으로 만들어져 있기 때문에, 미적값이 1보다 조금만 커도 gradient값이 발산하게 되고 1보다 조금만 작아도 gradient값이 소실하게 됩니다.
EX) 1.1^100 = 13,780.6 0.9^100 = 0.0000265
아래 사진은 sigmoid와 tanh의 그래프와 미적 그래프 입니다.
sigmoid와 tanh 모두 미분함수가 절댓값 x 가 커질수록 0에 수렴하는 모양을 보이며 Backpropagation시 미분값이 소실될 가능성이 큽니다.
그래서 기존 RNN의 장기 의존성 문제(the problem of Long-Term Dependencies)가 발생하게 되었고, 이 다음부터 LSTM이 어떻게 문제를 해결하였는지에 대해 설명하도록 하겠습니다.
[리빙포인트 -ReLU]
Vanishing Gradient Problem의 해결책 중 가장 일반적인 해결책은 기존의 sigmoid나 tanh을 relu로 바꾸는 것입니다. 하지만 본문에서 relu를 언급하지 않은 이유는, 이전 편에서 언급했듯이 RNN계열은 같은 레이어를 반복하는 특징이 있기 때문입니다. RNN계열이 아닌 다른 네트워크 모델들은 relu가 훨—씬 효과적이니 참고하세요!
그 다음 Gate에서는 현재 상태의 input(x)를 얼마나 기억할 것인지에 대한것을 계산합니다.
그림이 약간 헷갈리실 수도 있습니다.
이전상태의 hidden state(h)와 현재상태의 input(x)값을 시그모이드와 하이퍼볼릭탄젠트(tanh)로 지나게 합니다. 이렇게 하면 시그모이드를 지난 값은 01의 값을 가지며 gate의 역할을 하게 되고(input gate), tanh를 지난 값은 -11의 값을 가지며 현재 cell state를 나타내게 됩니다.
기존 RNN에서의 hidden state를 구하는 공식과 같은 것을 확인할 수 있습니다. 활성화함수가 tanh인것
GRU에서는 LSTM과 다르게 게이트가 2개인데, **Reset Gate(r)**과 **Update Gate(z)**입니다. 게이트 이름에서 알 수 있듯이, 리셋 게이트는 새로운 입력을 이전 메모리와 어떻게 합칠지를 정해주고, 업데이트 게이트는 이전 메모리를 얼만큼 기억할지를 정해줍니다.
긴 시퀀스를 잘 기억하게 해준다는 점에서 LSTM의 컨셉과 같지만 몇가지 차이점들이 있습니다.
Gate개수 : LSTM은 3개, GRU는 2개
LSTM에서의 C(cell state)와 h(hidden state)가 hidden state로 통합