RNN 네트워크의 구조(간단 버전, 시그모이드 생략)
Recurrent 하게 나타낼 수 있다. 아주 간단하게(LSTM, GRU 가 아닌) 표현하면, Hidden State를 저장하는 weight matrix W_h 가 Sequential input X_t에 recurrent 하게 적용되며, 해당 t time별로 Hidden State H_t가 기록된다. 아래와 같이 간단히 나타낼 수 있다.
RNN 네트워크 함수로의 표현
H를 Hidden State로 표현하면 위와 같이 간단하게 표현할 수 있다.
마지막 Hidden state H_n의 경우, 그리고 RNN 이 Many-to-one classification에 사용된다면 H_n은 시그모이드 함수를 거친 뒤 predicted output Y_hat으로 계산되어 나온다(하지만 여기선 계산의 편의를 위해 시그모이드를 생략하겠다)
각 변수의 Gradient 계산방법
각 변수 W_h와 W_x를 우리는 '학습'이라는 과정을 통해(backpropagation) 마지막 H_n이 target Y 와 같은 값을 가질 수 있도록 해야 한다. 즉, cost_function의 값이 최소가 되게 해야 하는 것이며, 이는 loss fucntion의 값을 최소화하는 것과 같다.
loss function을 MSE, RMSE ... 등으로 설정할 수 있는데, MSE Loss 를 기준으로 한다면, 각 변수의 gradient는 아래와 같이 계산이 가능하다.
이 때 H_n의 경우 H_(n-1) , H_(n-2), ... 으로부터 계산되어 나온 결과 값이다.
각 n번째 Hidden state의 값들에 W_h의 값이 multiply되어 H_n 의 값이 도출되는 것이기 때문에, H_k 번째에 대해서도 편미분이 이루어져야 한다(W_x 에 대한 편미분도 마찬가지). 아래와 같이 연쇄법칙을 적용하여 계산 식을 도출할 수 있다.
여기서 loss에 대한 H_n으로의 편미분 값은 아래와 같다.
Pseudo code
// Pseudo Code for gradient of "W_h"
// Backpropagation은 n -> 0 순서로 계산된다.
partial_deriv_Loss_of_H_k = partial_deriv_loss_of_H_(k+1) * partial_deriv_H_(k+1)_of_H_k
// 여기서 partial_deriv_loss_of_H_(k+1) 값은 계속 기억되며 전달
// partial_deriv_H_(k+1)_of_H_k = W_h
출처