본 글은 Recurrent Neural Network(RNN)에 대해 '파이토치 첫걸음' 책과 '딥러닝 파이토치 교과서' 책을 참고하여 작성하였습니다.
0. Introduction
▶ Recurrent Neural Network(RNN)이란?
Recurrent Neural Network(RNN)은 순서가 있는 데이터(시계열 데이터)에서 의미를 찾아내기 위해 고안된 모델입니다.
- 시퀀스 데이터(sequence data): 순서가 존재하는 데이터
- 시계열 데이터(time series data): 순서가 존재하지만 특별한 시간에 따른 의미가 존재하는 데이터
▶ RNN의 핵심 구조
RNN의 'Recurrent(순환하는, 정기적으로 일어나는, 반복되는)'는 이전 시점의 은닉층 노드 $h_{t}$가 현재 시점 $h_{(t+1)}$의 은닉층 노드의 입력(input)이 되면서 '반복되는 순환 구조를 갖는다'는 의미를 갖습니다. 이 부분이 다른 인공신경망 모델과의 가장 큰 차이점입니다. [Figure 1] 그림을 통해 RNN 구조에 대한 설명에 대한 이해를 돕고자 합니다.
[Figure 1]은 2개의 은닉층(hidden layer)를 갖고 있는 RNN을 표현했습니다.
"First hidden layer"
첫번째 은닉층 $h1$을 살펴보면 각 은닉층 노드 $h1_{t}$의 입력값은 현재 입력값 $i_t$와 이전 시점의 은닉층 노드 값 $h1_{t-1}$입니다.
"Second hidden layer"
두번째 은닉층 $h2$를 살펴보면 각 은닉층 노드 $h2_{t}$의 입력값은 이전 은닉층의 노드 $h1_{t}$ 값과 이전 시점의 은닉층 노드 값 $h2_{t-1}$입니다.
결국, $h_{t-1}$은 현재까지 입력된 데이터에 대한 요약된 정보를 갖습니다. 새로운 입력 $x_t$가 네트워크에 들어올 때마다 기억은 조금씩 수정되며 결국 최종적으로 남겨진 기억은 모든 입력 전체를 요약한 정보가 됩니다. 즉, RNN은 '기억(memory)'를 갖습니다.
※ 첫번째 입력 $x_1$ → 첫번째 기억 $h_1$ 생성 → 두번째 입력 $x_2$ → 기존 기억 $h_1$과 새로운 입력 $x_2$를 참고하여 새 기억 $h_2$를 만듦 → · · · → 이 과정을 입력 길이만큼 반복
RNN의 구조에 대한 자세한 내용은 [Section 1: Structure of RNN]에서 살펴보겠습니다.
▶ RNN 계층(layer)과 셀(cell)
RNN cell은 오직 하나의 time step만 처리합니다($x_t$ → cell → $y_t$). 즉, RNN cell은 RNN 계층의 for loop 구문을 갖는 구조로 실제 계산에 사용되는 RNN 계층의 구성요소입니다.
1. Structure of RNN
▶ Input Layer → Hidden Layer → Output Layer
RNN은 은닉층 노드들이 연결되어 이전 단계 정보($t=1,2,\cdots, n-1$)를 은닉층 노드 $h_{t=n}$에 저장할 수 있도록 구성한 신경망입니다. 과거와 현재 정보를 반영하기 위하여 $x_{t-1}$에서 $h_{t-1}$을 얻고 다음 단계에서 과거 정보 $h_{t-1}$과 현재 정보 $x_t$를 사용하여 $h_{t}$를 얻습니다.
[Shared Weight ]
RNN에서는 세 개의 가중치 v가 존재합니다([Figure 3] 참조).
- $W_{xh}$: 입력층(input layer)에서 은닉층(hidden layer)로 전달되는 가중치
- $W_{hh}$: $t$ 시점의 은닉층 노드에서 $t+1$ 시점의 은닉층 노드로 전달되는 가중치
- $W_{hy}$: 은닉층에서 출력층으로 전달되는 가중치
RNN의 경우 가중치 $W_{xh}, W_{hh}, W_{hy}$는 모든 시점에서 동일(가중치 공유)하다는 큰 특징이 존재합니다.
[Calculate Hidden Layer $h_t$]
$$\hat{s}_t = W_{hh} \times h_{t-1} + W_{xh} x_t$$
$$h_t = \text{tanh}(\hat{s}_t)$$
- 입력값: 새로운 정보 $x_{t}$와 과거 정보 $h_{t-1}$
- 출력값: 새로 업데이트된 요약된 정보(기억) $h_t$
RNN에서는 은닉층에서 주로 하이퍼볼릭 탄젠트 활성화 함수를 사용합니다.
[Calculate Output Layer $\hat{y}_t$]
$$\hat{y}_t = \text{softmax}(W_{hy} \times h_t)$$
[Feedforward : calculate error]
심층 신경망에서 feedforward 학습과 달리 각 단계($t$)마다 오차를 측정합니다. 즉, 각 단계마다 실제 값 $y_t$와 $\hat{y}_t$의 오차(mean squared error)를 이용하여 측정합니다.
[Backpropgation Through Time(시간에 따른 역전파)]
각 단계($t$)마다 feedforward 단계에서 구한 오차$E$를 바탕으로 $W_{xh}, W_{hh}, W_{hy}$ 및 bias를 업데이트됩니다.
RNN의 경우, 모델을 학습하기 위해서는 결괏값과 목푯값의 차이를 손실 함수를 통해 계산하고 역전파하는데 기존의 역전파와 다르게 순환 신경망은 계산에 사용된 시점의 수에 영향을 받습니다. 예를 들어, $t=0$에서 $t=2$까지 계산에 사용됐다면 그 시간 전체에 대해 역전파를 해야 합니다.
※ 이에 따라 시간에 따른 역전파(BackPropagation Through Time)이라고 부릅니다.
시점 $t=2$에 대해서,
$y_2 = W_{hy}h2_{(t=2)} + b$
$h2_{(t=2)} = \text{tanh}(W_{12}h1_{(t=2)} + W_{22} h2_{(t=1)} + b)$
- $h2_{\text{in}} = W_{12}h1_{(t=2)} + W_{22} h2_{(t=1)} + $
$h1_{(t=2)} = \text{tanh}(W_{ih}x_2 + W_{11}h1_{(t=1)} + b)$
$$\dfrac{\partial y_2}{\partial W_{22}} = \dfrac{\partial y_2}{\partial h2_{(t=2)}} \times \dfrac{\partial h2_{(t=2)}}{\partial h2_{\text{in}}} \times \dfrac{\partial h2_{\text{in}}}{\partial W_{22}}$$
$\dfrac{\partial h2_{\text{in}}}{\partial W_{22}}=h2_{(t=1)}$으로 이전 시점들의 조합으로 이루어져있고 내부적으로 $W_{22}$를 포함하고 있기 때문에 결과적으로 제대로 미분하기 위해서는 $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 |