RNN cell 구조와 BPTT(Backpropagation through time)

2024. 6. 27. 13:32머신러닝&딥러닝/RNN

728x90

RNN cell의 구조

RNN(순환신경망)은 기본적인 FFN(Feed-Forward Network)과 달리, 시간 차원을 가지며 이전 시간에 있었던 정보가 다음 시간으로 전달되기 때문에 일종의 "기억"을 가진다. RNN cell의 기초 구조는 아래와 같다.

input으로 들어온 벡터 x가 입력 가중치와 곱해지고, cell 안의 hidden layer 에도 시간 단위 가중치가 곱해진 후 더해진 값이 activation function을 거쳐 다음 시점의 hidden layer 값을 만든다. 이 과정을 시간 축으로 펴 보면, 아래와 같다.

이를 수식으로 적으면 아래와 같다.  W_x는 입력 벡터에 곱해지는 가중치, W_h는 이전 시점의 hidden layer에 곱해지는 가중치 역할을 한다. Hidden layer에서 Output이 출력될 때도 가중치와 곱해진 후, activation function을 거친다. 

 

이처럼 다음 hidden layer를 이전 hidden layer값이 결정하는 RNN구조를 Elman's Network라고 한다. 반면, 이전 시점의 output이 다음 hidden layer를 결정하는 Jordan's Network도 있다. pytorch 등 일반적인 프레임워크에서는 주로 Elman 형태를 사용하며, 본 포스팅에서도 마찬가지이다.

 

이러한 cell 구조에서 나온 output값을 다른 cell의 입력으로 사용하여 여러 RNN을 연결한 deep RNN을 만들 수도 있다.

출처: Semantic Scholar

RNN에서의 Backpropagation

일반적인 neural network에서 backpropagation은 error의 편미분값이 거꾸로 전파되며 가중치를 조정하는 과정을 말한다. RNN은 일반적인 신경망과 달리 시간 변수를 가지므로, 여기서 일어나는 backpropagation을 BPTT(BackPropagation Through Time)이라고 한다.

 

RNN에서는 오차의 편미분값이 hidden layer와 input의 두 방향으로 전파되며, 이 전파된 편미분값으로 가중치값이 업데이트되어 FFN과 마찬가지로 gradient descent 기법을 사용할 수 있게 된다.

 

시간이 늘어날수록 전파되는 오차는 누적되어 exponential하게 변한다. 즉, 굉장히 긴 시계열 데이터를 다룰 때 등 cell이 가로로 길어지게 되면, 시간 방향으로 전파되는 오차는 누적되어 곱해진다. 즉 편미분값이 1보다 작으면 여러 번 곱해져 0에 가까워지고, 1보다 크면 여러 번 곱해져 매우 큰 값이 된다. 전자를 gradient vanishing, 후자를 gradient explosion이라고 한다.

 

이러한 문제를 해결하기 위해 긴 시계열 데이터를 짧은 시간 단위로 쪼개어 학습시키는 truncated BPTT를 사용하거나, 장기와 단기기억이 나뉘어 있어 기울기 문제가 생기지 않는 LSTM 같은 후속 모델을 쓰기도 한다.

반응형