NLP 03 - RNN과 이를 활용한 Character Language Modeling

BoostCamp AI Tech

NLP

Natural Language Processing

RNN

Character Language Modeling

02/16/2021


본 정리 내용은 Naver BoostCamp AI Tech의 edwith에서 학습한 내용을 정리한 것입니다.
사실과 다른 부분이 있거나, 수정이 필요한 사항은 댓글로 남겨주세요.


RNN

구조

rnn_structure

RNN의 가장 큰 특징은 매 timestep tt마다 동일한 function ff와 파라미터 셋 WW가 사용된다는 것이다.

매 순간 tt마다 새로운 단어(혹은 형태소)를 입력으로 받아 t+1t+1에 연결되는 hidden state hth_t를 내보내는데, 이 때 hth_t를 이용하여 해당 시점에서의 예측값 yty_t를 내보내는 경우도 있다. 단어의 형태소를 판단하는 RNN의 사례를 들 수 있다.

또, 매 순간 yty_t를 출력하지 않고 hth_t를 잘 쌓아뒀다가 마지막 순간에 yty_t를 단 한번 출력하고 끝나는 경우도 있을것이다. 부정/긍정문을 판단하는 RNN을 예로 들 수 있다.

이 과정에서 사용되는 모든 파라미터 WW와 function ff는 매 timestep마다 동일하다. 또한, hth_t의 dimension은 hyperparameter로, 모든 timestep에서 동일한 형태를 가진다.

이 때, 이를 수식으로 풀이하면 다음과 같다.

ht=fW(ht1,xt)ht=tanh(Whhht1+Wxhxt)yt=Whyhth_t = f_W(h_{t-1},x_t)\\ \begin{aligned} h_t &= \tanh(\textcolor{blue}{W_{hh}}h_{t-1} + \textcolor{red}{W_{xh}}x_t)\\ y_t &= \textcolor{green}{W_{hy}}h_t \end{aligned}

여기서 Whh\textcolor{blue}{W_{hh}}Wxh\textcolor{red}{W_{xh}}이 어떤 형태인지는 다음 그림을 살펴보도록 하자.

rnn_transform

위의 그림과 같이, xtx_tht1h_{t-1}을 합친 벡터에 적용되는 선형변환 WW를 두 파트로 나눌 수 있다. 하나는 xtx_t에 적용되어 hth_t를 만들 때 사용되는 Wxh\textcolor{red}{W_{xh}}과 , 나머지 하나는 ht1h_{t-1}에 적용되어 hth_t를 만들 때 사용되는 Whh\textcolor{blue}{W_{hh}}이다. 각각의 파라미터로 선형변환하고 난 뒤, 두 값을 합쳐 비선형변환(tanh\tanh)을 적용시켜 hth_t를 완성한다.

완성된 hth_t에서 추가적인 변환으로 해당 시점의 예측값 yty_t를 뽑아낼 수도 있다. hth_t에서 yty_t로 가는 변환이므로 이 때 사용되는 파라미터를 Why\textcolor{green}{W_{hy}}라고 한다.

위의 식에서는 편의 상 bias항을 고려하지 않았지만, 실제로 계산할 때에는 bias항이 추가됨을 유의하자.

여기서 출력된 yty_t이진 분류(binary classification)이면 sigmoid를 적용시키고, 다중 분류(multiple classification)이면 softmax를 적용시켜 예측값(또는 확률값)으로 나타낼 수 있다.

sigmoid와 softmax의 차이에 대해서는 다음 글을 참조해보자.

#수학 : 시그모이드 함수(Sigmoid) / 소프트맥스함수(Softmax)

종류

rnn_types

  • One-to-one
    • 입력과 출력이 단 하나 → 시퀀스 데이터가 아닌 모델 구조
    • 이전 timestep의 hidden state ht1h_{t-1}가 들어오지 않고, 입력으로 받은 값을 그대로 출력하므로, 시퀀스 데이터가 아님
  • One-to-many
    • 입력이 하나의 timestep으로 이루어지고, 출력이 여러 timestep으로 이루어지는 모델 구조
    • Task 사례 : Image Captioning
      • 단일 입력(xx : 이미지)을 받고, 캡션을 달기 위하여 필요한 단어(yy)들을 순차적으로 생성(출력)
    • 이 경우 최초의 단일 입력 이후에 빈 입력을 넣기 위하여 같은 사이즈의 zero 벡터/행렬/텐서가 들어가게 된다.
  • Many-to-one
    • 입력이 여러 timestep으로 이루어지고, 출력이 마지막 timestep 하나로 이루어지는 모델 구조
    • Task 사례 : 긍정/부정문 판단
      • 문장 시퀀스 데이터를 받다가 마지막 순간에 문장의 긍정/부정을 판단하는 이진분류를 수행하여 출력
  • Many-to-many
    • 입력과 출력이 모두 시퀀스 형태
    • Task 1 : 기계 번역(Machine Translation)
      • 텍스트(또는 문장)의 입력이 끝나는 시점부터 해석한 정보를 바탕으로 번역된 문장의 단어를 하나씩 출력
    • Task 2 : Part-of-Speech(POS) tagging
      • 각 단어별로 형태소/성분을 분석하므로, 모든 timestep에서 입력과 출력이 다 일어난다.

Language Model

언어모델(Language Model)은 주어진 문자열이나 단어의 순서를 바탕으로 다음 단어를 예측하는 task이다.

언어모델링은 철자(character) 단위나 단어(word) 단위 두 가지 경우 모두 수행할 수 있다.

Character Language Model

철자(character)가 주어졌을 때, 단어내의 다음 철자를 예상하는 언어 모델링을 생각해보자. 이는 매 timestep마다 다음 철자(yy)를 출력해야하므로, Many-to-many task에 해당한다.

과정

character_language_modeling

  1. 학습 시퀀스 데이터에서 unique한 철자를 모아 사전을 구축한다.
  2. 해당 철자들을 len(vocab)만큼의 차원을 가지는 원-핫 벡터로 변환한다.
  3. hth_t를 만들어내기 위해 변환을 수행한다. 이 때 h0h_0는 hidden state의 dimension을 가지는 영벡터/행렬/텐서로 한다.
  4. 선형변환(Whyht+bW_{hy}h_t+b) 시킨 후, 다중 분류이므로 Softmax를 적용하여 yty_t로 내보낸다.
    • 이 때 선형변환된 값을 Logit으로 여긴다. output layer에서 나온 값 중 하나를 골라 다음에 나올 철자로 예측하기 때문이다.
      • Logit : log와 odds의 합성으로, 딥러닝에서는 일반적인 0~1 구간의 확률값이 아니라 -\infin ~ \infin 의 범위에 있는 날확률값을 의미한다. 다중 분류에서 Softmax 함수의 입력값으로 자주 사용된다.
      • Logit의 개념을 잘 모르겠다면 로짓(Logit)이란?을 참고하자.
      • logit과 sigmoid, softmax의 관계도 참고하자.
  5. 첫 출력을 보면 'h' 다음 'e'가 와야하는데 실제로는 'o'가 4.1을 받아 출력되었음을 알 수 있는데, 이와 같은 잘못된 결과에 페널티를 주고 올바른 결과인 'e'가 더 높은 값을 얻도록 하기 위해 Softmax-loss를 적용하여 업데이트한다.

해당 모델의 학습결과는 여기서 확인하자.

The Unreasonable Effectiveness of Recurrent Neural Networks

RNN의 역전파 알고리즘, BPTT

RNN에서의 순전파는 각 timestep마다 Loss를 모두 계산하고, 역전파(Backpropagation through time, BPTT)는 (Whh,Wxh,Why)(W_{hh},W_{xh},W_{hy})를 모두 연산해야하므로, 단어/철자 수가 수천/수만을 넘어가는 텍스트 데이터에서는 계산할 양이 매우 방대해진다.

따라서 이를 현실적으로 수행하기 어렵기 때문에, 시퀀스 데이터의 일부를 잘라내어 한번에 학습할 수 있는 길이를 제한시키는 truncation을 사용한다.

truncated_bptt

Searching for Interpretable Cells

그렇다면, RNN 모델에서 시퀀스 데이터에서 문맥을 이해하고, 해석가능한(interpretable) 정보는 어느 셀에 담겨있을까?

RNN에서 필요로하는 정보를 저장하는 공간은 결국 매 timestep마다 업데이트되는 hidden state vector, hth_t이다.

quote_dection_cell

위의 이미지는 학습시킨 RNN 모델에서 특정 hidden state vector의 dimension을 고정해놓고, 해당 dimension 값의 변화를 추적한 이미지이다. 따옴표(quote)를 기준으로 해당 dimension의 hidden state 값이 확연히 바뀌는 것을 알 수 있는데, 이는 hidden state가 따옴표가 열렸는지 닫혔는지를 해석하는 방식을 학습했다고 이해할 수 있다.

RNN 모델의 문제점

Vanishing/Exploding Gradient Problem

앞서 살펴본 (vanilla, original) RNN 모델은 훌륭하게 문맥을 파악했다. 그러나, 해당 RNN 모델의 학습 방식에는 한계가 있다.

tt마다 동일한 matrix WW를 곱해주기때문에, 역전파 과정에서 기울기 소실(Vanishing Gradient)이나 기울기 폭발(Exploding Gradient)이 생기게 된다. 이 경우 gradient가 뒤로 전파될수록 영향력이 사라지거나, 너무 커다란 영향을 미치게 된다. 따라서, long-term dependancy 문제가 제시된다.

이 문제를 해결하기 위해 LSTMGRU같은 RNN의 발전된 형태가 나오게 되었다.


Reference

cs231n_2017_lecture10.pdf

The Unreasonable Effectiveness of Recurrent Neural Networks


WRITTEN BY

알파카의 Always Awake Devlog

Seoul