




위 이미지처럼 일반적인(vanilla) RNN Cell이 있을 때 입력은 "현재 입력, x_t" 와 "이전 hidden state h_t-1"이다. 그리고 이 두 입력을 쌓는다 (Stack)
이렇게 두 입력을 쌓고 가중치 행렬 W와 행렬 곱 연산을 하고 tanh 를 씌워서 다음 hidden state(h_t)를 만든다
그러면 이 아키텍쳐는 backward pass에 그레디언트를 계산하는 과정에서 어떤 일이 발생할까?
우선 Backward pass 시 h_t에 대한 loss의 미분값을 얻는다
그 다음 Loss에 대한 h_t-1의 미분값을 계산하게 된다
backward pass의 전체과정은 위 이미지의 빨간색 통로를 따르게 된다
우선 그레이언트가 tanh gate를 타고 흘러간다. 그 다음 "Mat mul gate" 를 통과한다
Mat mul gate의 backprop은 결국 이 transpose(가중치 행렬) 을 곱하게 된다. 이는 매번 vanilla RNN cells을 하나 통과할 때 마다 가중치 행렬의 일부를 곱하게 된다는 것을 의미한다
RNN의 특성 상 RNN이 여러 시퀀스의 Cell을 쌓아 올리기 때문에 h_0에 대한 그레이언트를 구하고자 한다면 결국에는 모든 RNN Cells을 거쳐야 한다
cell 하나를 통과할 때 마다 각 Cell의 행렬 W transpose factors가 관여한다
다시 말해 h_0 의 그레디언트를 계산하는 식을 써보면 아주 많은 가중치 행렬들이 개입하며, 이는 좋지 않다
우선 가중치를 행렬이라고 생각하지 말고 스칼라로 생각해보면, 이 값들을 계속해서 곱한다고 했을 때 수백 개의 스텝이 있는 경우라면 값들을 수백 번 곱해줘야 한다. 만약 곱해지는 값이 1보다 큰 경우라면 점점 값이 커질 것이고 1보다 작은 경우라면 점점 작아져서 0이 될 것이다. 이 두 상황이 일어나지 않으려면 곱해지는 값이 1인 경우밖에 없다
이 상황은 행렬에서도 동일하게 적용된다. 행렬의 특이값(singular value)이 엄청나게 큰 경우일 때 singular value가 엄청 큰 행렬을 계속 곱하는 경우에도 역시 h_0의 그레디언트는 아주 커지게 된다
이를 'exploding gradient problem'이라고 한다
행렬의 특이값이 1보다 작은 경우라면 정 반대의 현상이 발생한다. 기하급수적으로 그레디언트가 작아진다
이를 'vanishing gradient problem' 이라고 한다