[NLP] RNN / LSTM

4 minute read

RNN

RNN은 대표적인 recurrent deep learning 모델 중 하나이다. 이번 포스팅에서는 recurrent 모델의 대표격인 RNN, LSTM, GRU 에 대해 알아보고, 좀 더 구체적으로 Bidirectional / Stacked LSTM은 무엇인지, Backpropagation through time은 어떤 것인지, 그리고 RNN의 문제점은 뭔지 등을 살펴보도록 하자. 그리고 RNN 계열의 모델이 활용될 수 있는 task 중 하나인 Image captioning 예시도 잠깐 언급하고 넘어가겠다.

RNN & LSTM & GRU

Recurrent 모델은 명칭에서도 알 수 있듯, 순환 구조를 지니고 있기 때문에 sequential data와 같이 시간/순차적인 흐름에 대한 고려가 중요한 분야에서 많이 쓰이고 있다. 그렇다면 recurrent 모델로 가장 언급이 많이 되는 RNN, LSTM, GRU에 대해 살펴보자.

RNN

우선 RNN은 가장 기본이 되는 모델로, 이전 시점에서의 hidden state를 받아 예측을 이어나감으로써 과거의 정보를 활용할 수 있게 하는 모델이다. 따라서 특정 과거 input 몇개만을 반영하는 것보다 더 나은 측면이 있다고 볼 수 있다. 그림으로 표현하면 아래와 같으며, 모든 hidden layer 간 동일한 파라미터를 공유한다는 특징이 있다.

rnn1

파라미터 업데이트 관점에서 보면 RNN과 같은 recurrent model은 과거의 정보를 계속해서 반영해나간다는 특징 때문에 기존의 backpropagation을 그대로 적용하기에는 다소 무리가 있다. 따라서 이러한 경우에는 Backpropagation Through Time (BPTT)라는 알고리즘을 사용한다.

BPTT의 원리는 직관적으로 봤을 때 RNN에서 과거의 정보를 쭉쭉 forward 해주는 원리와 비슷하나, 전파의 중심이 되는 것이 ‘에러’라는 차이점이 있다고 이해해볼 수도 있겠다. 즉, BPTT는 현 시점의 에러를 과거까지 역전파 시켜주어 현재의 에러가 과거를 업데이트해주는 데에 영향을 미치게 한다는 것이다. 이것은 사실 forward 과정 상 과거의 정보를 계속 전달해주는 RNN의 구조를 생각해보면 에러 또한 이렇게 과거까지 역전파해주어야 한다는 것이 당연한 것일 수 있겠다. 하지만 이렇게 에러를 더해가면서 과거로 역전파하게 되면 계산량이 너무 커질 수 있으므로, practical하게는 일정기간 단위로 끊어주는 Truncated-BPTT를 주로 사용한다고 한다. BPTT를 도식화하면 아래와 같다.

RNN에는 몇 가지 문제점이 존재한다. 대표적인 것이 바로 Gradient Vanishing or Exploding / Long-term dependency problem 이다. 과거의 정보를 반영해준다는 목적으로는 연관성이 있는 input 간 거리 차이가 좀 나도 여전히 잘 맞출 수 있어야 하는데 실질적으로 그렇지 못하다. 이는 모델링 상 backpropagation을 진행할수록 gradient가 점점 사라져서 그런 것이다. 이러한 Long-term dependency / Vanishing or Exploding gradient 문제를 완화하기 위해 LSTM, Attention과 같은 후속 연구들이 이어졌다.

LSTM

LSTM은 위에서 언급한 것과 같은 RNN의 문제점을 완화하고자 고안된 모델이다. 일단 구조는 장기 메모리 역할을 하는 cell state와 forget & input & output gates 로 구성되어 있다. 이러한 gates를 잘 조절해주면 과거 정보가 그 다음 시점들로 얼마나 전달될 수 있는지(영향을 미칠 수 있는지) 를 일부 컨트롤할 수 있게 되어 RNN의 고질적인 문제였던 Long-term dependency problem을 어느정도 완화할 수 있게 된다. 즉, gates를 좀 더 세분화함으로써 과거 정보 전달에 대한 통제권을 확보하고, 이를 통해 vanishing gradient와 같은 문제를 잡아 Long-term dependency problem을 줄여보겠다는 것이다. LSTM의 대략적인 구조를 도식화하면 아래와 같다.

lstm

LSTM의 좀 더 구체적인 버전인 Bidirectional / Stacked LSTM을 간단히 살펴보고 넘어가자.

  • Bidirectional LSTM : 일단 bidirectional, 즉 양방향을 본다는 것은 말그대로 정방향과 역방향 추론을 모두 시도하여 양쪽의 정보를 모두 활용하겠다는 것이다. 기본적인 구조는 양방향에서 뽑아낸 hidden unit을 concatenate 하여 output을 산출할 수 있도록 하는 것이고, 업데이트는 하던대로 backpropagation 통해 해주면 된다. 이러한 접근 방식은 NLP를 예로 들었을 때 문맥의 일방향만 모델에 반영하는 것이 아니라 양방향 모두를 고려할 수 있게 해주어 다양한 task에서 더 나은 결과를 가져다줄 수 있다고 판단할 수 있다.

  • Stacked LSTM : Stacked LSTM은 LSTM 여러 셀을 deep하게 쌓은 것으로, 복잡한 task에서는 그냥 shallow하게 분석하는 것보다 이렇게 겹겹이 쌓아 깊게 분석하는 것이 좋다고 한다. NMT와 같은 분야에서도 Stacked LSTM을 잘 활용하고 있으며, 구조적 그림은 아래와 같다.

GRU

GRU는 LSTM과 비슷하지만 좀 더 간소화된 구조를 가진 recurrent model이다. GRU는 LSTM처럼 gate를 활용하기는 하지만 그 수가 줄어들었다. 3개의 forget & input & output gates가 아닌 update & reset 2개의 gates만 지니고 있는데, 어떻게 보면 forget & input gates가 묶여서 update gate가 되었다고도 볼 수 있겠다. 그리고 cell/hidden state 구조도 그냥 hidden state 구조로 다소 간결하게 모델링되었다. 따라서 LSTM보다는 더 간단해졌지만 성능 자체는 크게 뒤지지 않는 것으로 연구된 GRU는 여러 분야에서 활용되고 있다.

gru

LSTM on Image Captioning

사실 NLP에서 RNN 계열 모델이 사용되는 분야는 POS tagging, sentiment classification 등 무궁무진하지만 이번 포스팅에서는 필자의 관심분야인 computer vision과 결합된 Image Captioning task를 예시로 간략히 살펴보도록 하겠다.

Image Captioning에 쓰이는 기본적인 모델로는 CNN-LSTM 모델을 꼽을 수 있다. Image+Text가 결합된 task이므로 각 분야에서 널리 쓰이는 두 모델이 결합된 버전이라고 생각하면 되겠다. 일단 LSTM을 통해 이미지의 특성을 살려 text를 뽑아내기 위해서는 이미지의 특징을 뽑아내는 feature extraction이 선행되어야 한다. 이 역할을 해주는 것이 CNN 파트인 것이다. CNN을 거쳐서 이미지 데이터의 특징을 뽑아내고 나면 그것들을 바탕으로 LSTM을 돌려 해당 이미지에 적합한 Caption, 즉 text를 생성하게 된다. 텍스트를 뽑아내는 과정 자체는 마치 NMT 하듯이 input이 들어가고 sequential data인 caption words가 나오는 것이라고 보면 되는데, 단지 input이 이미지에서 뽑아낸 feature vectors라는 것을 주의하면 된다.

이번 포스팅에서는 기본적인 CNN-LSTM 구조만 간략하게 살펴보았으나 이렇게 CV+NLP인 Image captioning task에서는 여러 발전된 CV기법 (향상된 CNN pre-trained 모델 활용 등)과 NLP 기법 (Attention 활용한 LSTM 등)을 결합하여 더 나은 결과를 기대할 수 있다. CV와 NLP 모두 전망이 밝고 현실세계에서 활용도가 높은 분야인 만큼 잘 결합시켜 개선해나가는 연구가 큰 의미를 지닐 것으로 예상된다.

이렇게해서 이 포스팅에서는 RNN과 그 계열의 모델, 그리고 예시에 대해 살펴보았다. Seq2Seq 포스팅과 함께 보면 시너지가 날 것으로 생각되니 비슷한 흐름의 공부를 할 때 도움이 되었으면 좋겠다.