본 글은 Recurrent Neural Network(RNN)에 대해 '파이토치 첫걸음' 책과 '딥러닝 파이토치 교과서' 책을 참고하여 작성하였습니다.
0. Introduction
▶ Recurrent Neural Network(RNN)이란?
Recurrent Neural Network(RNN)은 순서가 있는 데이터(시계열 데이터)에서 의미를 찾아내기 위해 고안된 모델입니다.
- 시퀀스 데이터(sequence data): 순서가 존재하는 데이터
- 시계열 데이터(time series data): 순서가 존재하지만 특별한 시간에 따른 의미가 존재하는 데이터
▶ RNN의 핵심 구조
RNN의 'Recurrent(순환하는, 정기적으로 일어나는, 반복되는)'는 이전 시점의 은닉층 노드 ht가 현재 시점 h(t+1)의 은닉층 노드의 입력(input)이 되면서 '반복되는 순환 구조를 갖는다'는 의미를 갖습니다. 이 부분이 다른 인공신경망 모델과의 가장 큰 차이점입니다. [Figure 1] 그림을 통해 RNN 구조에 대한 설명에 대한 이해를 돕고자 합니다.

[Figure 1]은 2개의 은닉층(hidden layer)를 갖고 있는 RNN을 표현했습니다.
"First hidden layer"
첫번째 은닉층 h1을 살펴보면 각 은닉층 노드 h1t의 입력값은 현재 입력값 it와 이전 시점의 은닉층 노드 값 h1t−1입니다.
"Second hidden layer"
두번째 은닉층 h2를 살펴보면 각 은닉층 노드 h2t의 입력값은 이전 은닉층의 노드 h1t 값과 이전 시점의 은닉층 노드 값 h2t−1입니다.
결국, ht−1은 현재까지 입력된 데이터에 대한 요약된 정보를 갖습니다. 새로운 입력 xt가 네트워크에 들어올 때마다 기억은 조금씩 수정되며 결국 최종적으로 남겨진 기억은 모든 입력 전체를 요약한 정보가 됩니다. 즉, RNN은 '기억(memory)'를 갖습니다.
※ 첫번째 입력 x1 → 첫번째 기억 h1 생성 → 두번째 입력 x2 → 기존 기억 h1과 새로운 입력 x2를 참고하여 새 기억 h2를 만듦 → · · · → 이 과정을 입력 길이만큼 반복
RNN의 구조에 대한 자세한 내용은 [Section 1: Structure of RNN]에서 살펴보겠습니다.
▶ RNN 계층(layer)과 셀(cell)

RNN cell은 오직 하나의 time step만 처리합니다(xt → cell → yt). 즉, RNN cell은 RNN 계층의 for loop 구문을 갖는 구조로 실제 계산에 사용되는 RNN 계층의 구성요소입니다.
1. Structure of RNN
▶ Input Layer → Hidden Layer → Output Layer
RNN은 은닉층 노드들이 연결되어 이전 단계 정보(t=1,2,⋯,n−1)를 은닉층 노드 ht=n에 저장할 수 있도록 구성한 신경망입니다. 과거와 현재 정보를 반영하기 위하여 xt−1에서 ht−1을 얻고 다음 단계에서 과거 정보 ht−1과 현재 정보 xt를 사용하여 ht를 얻습니다.
[Shared Weight ]

RNN에서는 세 개의 가중치 v가 존재합니다([Figure 3] 참조).
- Wxh: 입력층(input layer)에서 은닉층(hidden layer)로 전달되는 가중치
- Whh: t 시점의 은닉층 노드에서 t+1 시점의 은닉층 노드로 전달되는 가중치
- Why: 은닉층에서 출력층으로 전달되는 가중치
RNN의 경우 가중치 Wxh,Whh,Why는 모든 시점에서 동일(가중치 공유)하다는 큰 특징이 존재합니다.
[Calculate Hidden Layer ht]
ˆst=Whh×ht−1+Wxhxt
ht=tanh(ˆst)
- 입력값: 새로운 정보 xt와 과거 정보 ht−1
- 출력값: 새로 업데이트된 요약된 정보(기억) ht
RNN에서는 은닉층에서 주로 하이퍼볼릭 탄젠트 활성화 함수를 사용합니다.
[Calculate Output Layer ˆyt]
ˆyt=softmax(Why×ht)
[Feedforward : calculate error]

심층 신경망에서 feedforward 학습과 달리 각 단계(t)마다 오차를 측정합니다. 즉, 각 단계마다 실제 값 yt와 ˆyt의 오차(mean squared error)를 이용하여 측정합니다.
[Backpropgation Through Time(시간에 따른 역전파)]
각 단계(t)마다 feedforward 단계에서 구한 오차E를 바탕으로 Wxh,Whh,Why 및 bias를 업데이트됩니다.
RNN의 경우, 모델을 학습하기 위해서는 결괏값과 목푯값의 차이를 손실 함수를 통해 계산하고 역전파하는데 기존의 역전파와 다르게 순환 신경망은 계산에 사용된 시점의 수에 영향을 받습니다. 예를 들어, $t=0$에서 $t=2$까지 계산에 사용됐다면 그 시간 전체에 대해 역전파를 해야 합니다.
※ 이에 따라 시간에 따른 역전파(BackPropagation Through Time)이라고 부릅니다.

시점 t=2에 대해서,
y2=Whyh2(t=2)+b
h2(t=2)=tanh(W12h1(t=2)+W22h2(t=1)+b)
- h2in=W12h1(t=2)+W22h2(t=1)+
h1(t=2)=tanh(Wihx2+W11h1(t=1)+b)
∂y2∂W22=∂y2∂h2(t=2)×∂h2(t=2)∂h2in×∂h2in∂W22
∂h2in∂W22=h2(t=1)으로 이전 시점들의 조합으로 이루어져있고 내부적으로 W22를 포함하고 있기 때문에 결과적으로 제대로 미분하기 위해서는 t=0 시점까지 미분해야 합니다. RNN은 각 층별로 같은 가중치를 공유하기 때문에 발생하는 현상입니다.
▶ RNN의 단점
오차가 멀리 전파될수록(왼쪽으로 전파) 계산량이 많아지고 전파되는 양이 점차 적어지는 문제(기울기 소멸 문제(vanishing gradient problem))가 발생합니다. 이를 보완하기 위해 오차를 몇 단계까지만 전파시키는 truncated BPTT를 사용할 수 있습니다.
※ truncated BPTT: 계산량을 줄이기 위해 현재 단계에서 일정 시점까지만(보통 5단계 이전까지만) 오류를 역전파
Truncated BPTT를 사용한 모델로는 LSTM과 GRU가 있으며 이에 대해서는 다음글에서 살펴보도록 하겠습니다.
'Time Series Analaysis > Time Series Analysis' 카테고리의 다른 글
Linear Gaussian State Space Model (0) | 2024.06.10 |
---|---|
Convolutional LSTM network(ConvLSTM) (0) | 2024.01.29 |
Gated Recurrent Unit(GRU) (2) | 2024.01.23 |
Long Short Term Memory(LSTM) (0) | 2024.01.22 |