by Yngie

순환 신경망(Recurrent Neural Network, RNN)

|

본 포스트의 내용은 cs231n 강의자료 와 책 밑바닥에서 시작하는 딥러닝 2 를 참고하였습니다.

RNN (Recurrent Neural Network)

이번 시간에는 시퀀스를 다루기 위한 신경망인 순환 신경망(Recurrent Neural Network, RNN)에 대해 알아보도록 하겠습니다.

Sequential Data

우리가 실제로 맞닥뜨리는 데이터는 여러 형태를 가지고 있습니다. 그 중 하나가 바로 아래와 같은 이미지 데이터입니다. 합성곱 신경망은 이와 같은 데이터를 잘 다루지요.

non_sequential

위와 같은 데이터는 데이터가 등장하는 순서가 바뀌더라도 데이터의 의미가 달라지지 않습니다. 어떤 고양이 사진을 처리하기 전에 강아지 사진이 등장하든, 고양이 사진이 등장하든, 아무 상관없는 빌딩 사진이 등장하든 원래 데이터가 고양이 사진이라는 것은 달라지지 않지요. 이런 데이터와는 달리 등장 순서에 따라 의미가 달라지는 데이터가 있습니다. 아래와 같은 자연어와 시계열 데이터가 대표적인 사례입니다.

sequential

자연어와 시계열 데이터는 앞,뒤로 어떤 데이터가 등장하는 지에 따라서 특정 데이터의 의미가 달라집니다. 좀 더 간단한 아래의 예시를 보겠습니다.

“The stolen car sped into the arena.” : 도난 차량이 경기장 안으로 돌진했다.

“The clown car sped into the arena.” : 광대 차가 공연장 안으로 들어왔다.

두 문장은 “stolen”“clown” 으로 바뀐 것 외에는 아무런 바뀐 것이 없습니다. 하지만 문장의 의미는 완전히 달라졌네요. 바뀐 단어 이후에 있는 “sped into”, “arena” 의 의미까지 바뀌어버렸습니다. 이렇게 앞,뒤에 어떤 단어가 오느냐에 따라서 뒤따라오는 데이터의 의미도 변화하는 데이터를 연속형(Sequential) 데이터라고 합니다. 대표적인 연속형 데이터가 바로 위에서 설명한 자연어와 시계열 데이터입니다.

RNN

연속형 데이터는 데이터가 등장하는 순서가 중요하기 때문에 이 순서를 체크할 수 있는 신경망을 사용해주어야 합니다. 순환 신경망은 이런 데이터를 학습하기 위해 등장한 신경망입니다. 먼저 순환 신경망의 구조를 살펴보도록 하겠습니다.

rnn2

이미지 출처 : cs231n.stanford.edu

가장 단순한 순환 신경망은 은닉층이 1개인 구조를 가지고 있습니다. 하지만 단층 퍼셉트론 신경망과는 다릅니다. 단층 퍼셉트론 레이어는 은닉층의 벡터를 출력층으로 넘겨주고 끝내지만 순환 신겸망은 은닉층의 벡터를 다음 Time-step에 다시 사용합니다. 이전에 생성된 은닉층 벡터를 재활용(?) 하기 때문에 순환(Recurrent) 신경망이라는 이름이 붙었습니다. Time-step 에 따라서 순환 신경망이 어떻게 동작하는 지를 펼쳐보면 아래와 같습니다.

rnn4

이미지 출처 : cs231n.stanford.edu

첫 번째 Time-step, $t=0$ 에는 입력 벡터 $\mathbf{x}1$ 와 초기화 되어있는 은닉층의 상태(Hidden-state) 벡터 $\mathbf{h}_0$ 가 은닉층에 입력됩니다. 은닉층은 두 개의 벡터를 입력받아 새로운 Hidden-state 벡터 $\mathbf{h}_1$ 을 만들어내고 벡터 $\mathbf{y}_1$ 을 출력합니다. 다음 Time-step인 $t=1$ 에는 $t=0$ 에서 생성했던 $\mathbf{h}_1$ 을 다시 활용합니다. 이 $\mathbf{h}_1$ 과 해당 순서의 입력 벡터인 $\mathbf{x}_2$ 가 은닉층에 입력되지요. 순환 신경망은 이 과정을 문장 끝까지 반복합니다. 만약 $n$ 개로 이루어진 시퀀스라면 마지막 Time-step에서는 은닉입력 벡터 $\mathbf{x}_n$ 와 이전 Time-step에서 생성된 Hidden-state 벡터 $\mathbf{h}{n-1}$ 이 은닉층으로 입력됩니다. 은닉층은 이 둘을 받아 $\mathbf{y}_n$ 를 출력한 후 생성을 마치고 모든 출력에 대한 손실을 계산합니다.

Time-step $t$ 에서 순환 신경망이 은닉 상태 벡터 $\mathbf{h}_t$ 가 생성되는 과정을 수식으로 나타내면 아래와 같습니다.

\[\begin{aligned} \mathbf{h}_t &= f_W(\mathbf{h}_{t-1}, \mathbf{x}_t)\\ &= \tanh(\mathbf{h}_{t-1}W_\mathbf{h} + \mathbf{x}_tW_\mathbf{x} + b) \end{aligned}\]

위 식에서 $\mathbf{x}t$ 은 해당 Time-step에서 입력되는 벡터이고, $\mathbf{h}{t-1}$ 은 이전 Time-step 에서 생성된 은닉 상태 벡터입니다. $b$ 는 편향 벡터입니다. 순환 신경망은 활성화 함수로 하이퍼탄젠트 함수 $\tanh$ 를 사용합니다. 은닉층에는 Hidden-state 벡터에 곱해지는 가중치 $W_\mathbf{h}$ 와 입력 벡터에 곱해지는 가중치 $W_\mathbf{x}$ 가 있으며 이 가중치는 역전파로 갱신되기 전까지 모든 Time-step에 동일한 값이 적용됩니다. (순환 신경망의 활성화 함수로 하이퍼탄젠트 함수를 사용하는 이유는 이곳을 참고하시면 좋습니다.)

BPTT(BackPropagation Through Time)

순환 신경망의 순전파를 알아보았으니 이제 역전파가 어떻게 일어나는지 알아보도록 하겠습니다.

rnn5

이미지 출처 : cs231n.stanford.edu

순환 신경망의 역전파는 Time-step마다 생성된 순전파의 역순으로 진행됩니다. Time-step의 역방향을 따라 진행되기 때문에 BPTT(Backpropagation Through Time) 이라고 불립니다.

Advantage & Problems

Advantage

순환 신경망은 여러 장점을 가지고 있습니다. 첫 번째로 이론상으로는 아무리 긴 시퀀스라도 처리가 가능합니다. 물론 엄청난 메모리를 필요로 하기 때문에 실제로는 일정 길이 이상의 시퀀스를 다루는 데에는 현실적인 한계가 있습니다. 두 번째로 시퀀스의 길이가 길어지더라도 모델 사이즈가 커지지 않습니다. 위에서 살펴본 가장 단순한 순환 신경망의 경우 은닉층 1개만으로 긴 시퀀스를 처리할 수 있습니다. 마지막으로 이론상으로는 Time-step $t$ 이전에 입력된 모든 입력 벡터의 정보를 사용할 수 있습니다. $\mathbf{h}_t$ 는 매 Time-step 마다의 입력 벡터 $\mathbf{x}_1, \mathbf{x}_2, \cdots, \mathbf{x}_t$ 를 정보를 모두 가지고 있습니다. Hidden-state 벡터가 잘 작동하기만 한다면 모든 입력 벡터의 정보를 끝까지 잘 전달할 수 있을 것입니다.

Problems

문제는 순환 신경망의 이런 장점이 이론상으로만 가능하다는 데에 있습니다. 첫 번째 문제는 학습에 걸리는 시간이 너무 느리다는 것입니다. 순환 신경망은 입력 벡터가 순차적으로 입력되기 때문에 모든 벡터에 대한 정보를 한꺼번에 계산할 수 없습니다. 이 문제는 모든 토큰을 동시에 입력한 뒤에 위치 벡터를 따로 처리해주는 트랜스포머(Transformer)에 가서야 해결됩니다.

기본적인 순환 신경망(Vanilla RNN)의 가장 큰 단점은 장기 의존성(Long-Term Dependency) 문제 입니다. 이 장기 의존성 문제 때문에 실제로는 마지막 장점이 발휘되지 못하지요. 장기 의존성 문제란 시퀀스가 길어질 때 Hidden-state 벡터 $\mathbf{h}_t$ 가 시퀀스 앞쪽 입력 벡터의 정보를 제대로 간직하지 못하는 현상입니다. 아래의 예를 보겠습니다.

“Tom was watching TV in his room. Mary came into the room. Mary said hi to ( ? ).”

괄호 안에 들어갈 단어는 “Tom” 입니다. “Tom” 을 정확히 예측하기 위해서는 이전에 등장하는 단어들의 의미를 모두 기억하고 있어야 합니다. 하지만 역전파 과정에서 활성화 함수의 역전파를 거칠 때마다 정보가 점점 사라지는 기울기 소실(Gradient vanishing)이 발생합니다. 장기 의존성 문제를 해결하기 위해 수많은 연구가 있었습니다. 그 결과 은닉층에 게이트를 추가한 장단기 기억망(Long Short Term Memory, LSTM)게이트 순환 유닛(Gated Recurrent Unit, GRU)등이 탄생하였습니다. 게다가 모든 Time-step에 대한 Hidden state 벡터를 사용하는 어텐션(Attention) 방법도 제시되었습니다.

여러가지 RNN

위에서 살펴본 순환 신경망 구조 외에도 입/출력 벡터를 어떻게 처리할 지에 따라 여러가지 순환 신경망으로 구분할 수 있습니다. 아래는 여러 순환 신경망을 입/출력 벡터의 형태에 따라 구분한 것입니다.

diverse_rnn

이미지 출처 : cs231n.stanford.edu

위 그림에서 2번째 있는 일대다 구조를 가지는 순환 신경망이 사용되는 대표적인 태스크는 이미지 캡셔닝(Image captioning)입니다. 특정 이미지를 입력하면 이를 묘사하는 문장을 생성합니다. Non-sequential 데이터를 입력하여 Seqential 한 데이터를 출력하는 대표적인 태스크입니다.

3번째에 있는 순환 신경망은 다대일 구조를 갖습니다. 이런 순환 신경망이 사용되는 대표적인 태스크는 감성 분석과 같은 문서 분류가 있습니다. 문서 분류에서는 Sequential 데이터인 문서를 입력받은 뒤에 이를 모아 해당 문서의 클래스를 판단합니다.

다대다 구조는 두 가지로 분류됩니다. 4번째와 같이 모든 입력 벡터를 다 받아들인 뒤에 여러 개의 벡터를 출력하는 구조가 있고, 5번째와 같이 입력 벡터마다 즉시 벡터를 출력하는 구조가 있습니다. 전자를 사용하는 대표적인 태스크는 기계 번역(Machine translation)입니다. 번역하고자 하는 문장의 단어를 모두 받아들인 후 번역된 문장의 단어를 출력합니다. 후자를 사용하는 태스크에는 프레임 단위의 영상 분류가 있습니다.

지금가지는 은닉층이 1개인 순환 신경망에 대해서만 알아보았으나 실제로는 층이 여러 개인 다층 순환 신경망(Multi Layer RNN)이 사용됩니다. 다층 순환 신경망의 대략적인 구조는 아래와 같습니다.

multilayer_rnn

이미지 출처 : cs231n.stanford.edu



Comments