딥러닝 이야기 / Recurrent Neural Network (RNN) / 2. Sequence-to-Sequence (Seq2Seq) 모델과 Attention

Sequence-to-Sequence (Seq2Seq) 모델과 Attention

작성자: 여행 초짜
작성일: 2022.08.27

시작하기 앞서 틀린 부분이 있을 수 있으니, 틀린 부분이 있다면 지적해주시면 감사하겠습니다.

이전 글에서는 RNN의 등장 배경과 RNN 계열의 LSTM, GRU의 원리에 대해 설명했습니다. 그리고 RNN 모델들이 어떤 연구에 적용되는지 이야기 하면서 간단히 Language Modeling (LM)에 대해 설명했었습니다. 오늘은 이전 글에서 RNN 모델들이 적용되는 분야를 얘기할 때 잠깐 등장했던 sequence-to-sequnece (seq2seq) 모델에 대해 이야기 해보고, RNN 모델들을 seq2seq에 적용하면서 발생하는 문제점을 해결하기 위해 초기에는 어떤 attention 기법들이 적용되었는지 알아보겠습니다.

오늘의 컨텐츠입니다.

  1. Seq2seq 모델
  2. Attention 기법

Sequence-to-Sequnece (Seq2Seq) 모델과 Attention

Seq2seq 모델

Seq2seq은 가변적인 데이터가 주어졌을 때 가변적인 데이터를 생성하기 위해 사용되는 모델 구조입니다. 간단히 말해 길이가 서로 다른 텍스트 데이터가 주어졌을 때, 길이가 서로 다른 텍스트 데이터를 생성하기 위해 주로 사용됩니다. 따라서 seq2seq 모델은 기계 번역, 질의응답, 챗봇 제작에 주로 사용되는 모델의 구조입니다. 그리고 이러한 seq2seq 모델을 구성하기 위해서는 필연적으로 RNN 계열의 모델이 2개가 필요합니다. 그 이유를 간단한 번역 모델을 예시로 들어서 설명해보도록 하겠습니다.

아래는 French-English 기계 번역의 예시입니다. Encoder RNN 모델에는 당연히 번역을 해야하는 프랑스어가 들어가야할 것이고, decoder RNN 모델의 결과는 번역의 결과인 영어가 나와야할 것입니다. 즉 아래 그림은 encoder, decoder 구조로 이루어진 seq2seq 모델에 encoder의 input과 decoder의 output (결과)을 나타냅니다.

French-English 기계 번역 seq2seq 모델


그렇다면 encoder와 decoder가 어떻게 이어지게, 즉 encoder의 결과를 어떻게 decoder로 전달 해줘야할까요? 결론부터 말하자면 encoder의 맨 마지막 hidden state \(h_4\)를 decoder의 initial hidden state \(s_1\)로 사용하여 encoder의 정보를 전달해줍니다. 즉 \(h_4\)가 encoder input 문장을 representation 하는 것이지요.

그러면 encoder의 output과 decoder input은 어떻게 넣어주면서 학습을 해줘야할까요? Decoder의 input은 이전글에서 설명한 Language Modeling (LM)을 하기 위해서 넣어줍니다. 즉 encoder를 통해 encoding 된 input 문장의 representation의 hidden state를 decoder로 넣어주는 동시에 [SOS] (start-of-string) 토큰을 넣어주어 다음 단어를 예측하게끔 학습을 하는 것입니다. 그리고 이러한 학습 방법을 통해 학습된 모델을 autoregressive model이라고 합니다. 하지만 encoder의 output은 번역의 목적의 모델이기 때문에 어떻게 되든 큰 상관이 없습니다. 왜냐하면 encoder의 목적은 모델의 학습을 통해서 encoder input을 잘 representation할 수 있는 hidden state \(h_4\)를 찾는 것이 목적이기 때문입니다.

French-English 기계 번역 seq2seq 모델


위의 모델의 loss 계산을 하는 방법을 좀 더 자세히 살펴보겠습니다. 위의 모델을 구성하였다면 loss를 계산하면서 모델의 가중치를 업데이트 해야 합니다. 즉 loss는 decoder의 input의 [I, am, a, student]과 decoder output의 [I, am, a, student]의 위치에 해당하는 결과 값을 비교하여 계산됩니다. 여기서 주의깊게 봐야할 부분은, input의 2번째 토큰부터 끝까지, ouput의 1번째 토큰부터 맨 마지막에서 2번째 토큰 위치의 결과를 추출하여 계산하는 것을 알아야 합니다.

그리고 이렇게 ground-truth의 input 토큰을 이용하여 decoder의 output과 loss를 계산하는 방식을 교사 강요(teacher forcing)라고 합니다. 즉 decoder의 output 값을 input 값과 동일하게 하도록 강요한다고 하여 붙여진 이름입니다. 그리고 이 기법은 아래의 1989년에 나온 RNN 논문에 처음 소개 되었습니다.


훈련은 teacher forcing으로 진행한다면 decoder의 input이 없는 추론 단계에서는 어떻게 해야할까요? 처음에는 [SOS]를 넣어주고 나온 결과를 다음 input 토큰으로 넣어줍니다. 그리고 이렇게 해서 나온 결과를 또 그 다음 input 토큰으로 넣어주고 이 과정을 [EOS] (end-of-string) 토큰이 나올 때까지 반복합니다.

French-English 기계 번역 seq2seq 모델 추론 단계


번외로 seq2seq 모델 추론 단계는 학습 단계와 그 형태가 다른 것을 알 수 있습니다. 그래서 몇몇 논문에서는 이러한 차이로 인해 학습이 제대로 되지 않는다고 주장합니다. 이렇게 훈련과 추론 과정의 차이를 train-inference discrepancy라고 합니다. 즉 훈련 과정에서는 teacher forcing을 통해 틀린 토큰이 예측 되어도 바로 잡을 수 있지만, 추론 과정에서 초기에 틀린 토큰이 예측되면 그 이후의 순서도 다 틀리게 예측되기 때문에 문제가 발생한다고 합니다. 이러한 문제를 exposure bias 문제라고 부르고 이를 해결하기 위해 scheduled sampling (SS) 방법을 도입합니다. SS는 훈련 과정 중 teacher forcing 방법만을 쓰지말고 추론할 때와 비슷하게 예측된 결과를 다음 decoder input으로 넣어 학습하는 방법을 섞어서 쓰는 방법입니다. 말 그대로 teacher forcing과 추론 과정과 비슷하게 학습 과정을 구성하여 이 두 방법을 섞어서 학습하는 것이지요. SS와 관련된 논문은 아래 링크에 있습니다.


하지만 이러한 SS의 기법을 사용하여도 exposure bias를 해결하는 데 한계가 있다고 합니다.

Attention 기법

RNN 기반의 seq2seq 모델은 몇가지 문제점이 존재합니다.

  • 문장이 길어질수록 gradient vanishing 현상이 발생.
  • Encoder의 마지막 hidden state를 encoder의 input 문장의 모든 정보를 representation 하는 데 한계가 존재.
이러한 문제점은 기계 번역을 위한 encoder의 input 데이터가 길어질수록 심해집니다. 따라서 이러한 문제점들을 보완하기 위해 등장한 것이 바로 attention입니다.

원래 seq2seq 모델에서 encoder는 input 문장을 representation하는 hidden state만 내어주고 decoder에 영향을 주지 않았습니다. 하지만 attention을 해준다는 것은 decoder의 각 time-step 마다 encoder의 output을 참조하는 것이지요. 이때 같은 가중치로 encoder의 output을 참고하는 것이 아니라 모델 스스로가 더 중요하다 싶은 부분을 집중하여 참고하는 것입니다. 즉 encoder의 특정 결과를 집중하여 참조한다고 하여 이름이 attention이 된 것입니다. 위의 Je suis etudiant → I am a student 번역을 예를 들어보자면, student의 단어는 불어의 Je 보다는 etudiant에 집중 하면 더 좋은 결과가 나올 수 있겠죠.

지금부터 attention 기법을 두 가지를 예시로 들어 아래에서 설명하겠습니다. 첫 번째는 간단한 감성 분류(sentiment classification), 두 번째는 기계 번역(machine translator)를 예시로 attention 기법이 무엇인지 살펴보겠습니다.


감성 분류의 Attention
첫 번째로 설명할 감성 분류 모델은 seq2seq 기반의 모델이 아닙니다. 단지 encoder 하나만 존재하는 모델을 이용하여, encoder에 분류할 문장을 넣고 나온 결과를 긍부정의 이진 분류(binary classification)하는 모델입니다. 여기서 attention을 사용하는 기법은 아래 그림과 같습니다. 아래 그림의 B는 batch size, L은 sequence length, H는 hidden dimension을 의미합니다.

먼저 분석할 문장의 모든 time-step의 결과를 concatenate하여 attention 모듈로 넣습니다. Attention 모듈은 Multi-Layer Perceptron (MLP)과 softmax로 되어있는데, MLP는 단순한 linear layer라고 생각하면 될 것 같습니다. 이때 MLP를 통해 H 차원을 1로 줄여주고 길이(L) 방향으로 softmax를 해주어, 각 문장별 결과의 길이 방향으로 나온 결과값의 합이 1이 되도록 해줍니다. 즉 각 time-step별로 나온 결과를 0 ~ 1 사이의 확률로 표현하는 것이지요.

이렇게 나온 각 time-step의 확률을 기존의 LSTM output에 곱해줍니다. 그럼 각 확률로 표현된 attention에 의해 0에 가까운 time-step일수록 output의 값이 0에 가까워지기 때문에 결과에 미치는 영향이 작아질 것입니다. 그 후 문장의 감성 분류를 진행합니다.

감성 분류 모델의 attention




기계 번역 모델의 Attention
두 번째로 설명할 기계 번역 모델은 인코더와 디코더로 구성된 seq2seq 모델입니다. 이러한 seq2seq 기반의 번역 모델에서도 attention이 사용되는데, 여기서 소개할 attention 기법은 여러 기법들 중 Bahdanau가 제안한 Bahdanau attention 입니다. 이 attention 기법을 활용한 기계 번역 모델 논문은 아래 링크로 들어가서 볼 수 있습니다.


여기서 염두해야할 부분은 본 번역 기법은 decoder의 문장 전체를 넣지 않고 한 단어씩 attention을 진행하여 다음 단어를 예측하는 방식입니다. 요즘에는 transformer와 같은 모델을 사용하기 때문에 decoder에 전체 문장을 넣고 masking 하여 학습을 진행하지만, 지금 소개하는 기법은 이와 다르게 전체의 문장을 넣지 않고 하나의 time-step 별로 attention을 진행하고 다음 단어를 예측하는 방식입니다. 아래에서 그림과 같이 천천히 살펴보겠습니다.

기계 번역 모델의 attention


참고로 위 그림의 size 중 B는 batch size, L은 sequence length, H는 hidden dimension을 의미합니다.

  1. 번역 해야할 대상이 되는 문장을 encoder에 넣고 encoder output 혹은 hidden state를 구함(원래 논문은 hidden state를 사용하지만, 편의상 대부분 구현에서 encoder output을 사용).
  2. Decoder에서 현재 예측 해야하는 step의 이전 step의 hidden state를 가져옴.
  3. 위의 encoder output은 B x L x H의 크기를 가지고 decoder hidden state는 B x 1 x H의 크기를 가지며, 두 개의 데이터 모두 서로 크기를 유지하도록 하는 linear layer를 태움.
  4. 이렇게 나온 두 개의 데이터를 element-wise로 더한 후, hyperbolic tangent (tanh) 함수에 적용.
  5. 이렇게 나온 데이터에 encoder 데이터 길이별 현재 decoder step에서 중요하게 여기는 점수를 알기 위해서 H x 1의 linear layer를 태워 B x L x 1의 score 결과를 구함.
  6. Score에 softmax 함수를 적용하여 길이 별 score의 합이 1이 되도록 맞춤.
  7. 이렇게 확률로써 얻어진 score를 encoder output을 그대로 가져와서 행렬곱 수행하여 최종적으로 context vector를 구함.
  8. 이렇게 나온 context vector를 다음 step의 input과 concatenate하여 모델에 적용(즉 decoder의 input은 encoder의 input의 hidden dimension 보다 차원이 큼).


이렇게 attention이 잘 학습이 된다면 decoder의 step별로 적절한 encoder output에 대한 확률이 높게 나타날 것입니다. 예를 들어 I를 예측해야한다면 encoder input의 Je, student를 예측해야한다면 encoder input의 etudiant의 부분의 확률이 높게 나타날 것입니다. 아래는 실제 Bahdanau attention 기반 기계 번역 논문에 나와있는 attention 결과입니다. Attention 모델이 실제로 적절한 위치의 문장 단어를 잘 attention 하는 것을 확인할 수 있습니다.

기계 번역 모델의 attention 결과, 출처: Bahdanau attention 기반 기계 번역 모델 논문


위에서 설명한 바나다우 어텐션(Bahnadau Attention) 이외에도 dot product 기반의 조금 더 단순한 루옹 어텐션(Luong Attention) 기법도 존재합니다. 관심이 있다면 이러한 attention 기법들도 찾아보면 좋을 듯 합니다.


Attention과 설명가능 AI (eXplainable AI, XAI)
Attention은 딥러닝 모델의 성능을 향상시켜주기도 합니다. 하지만 이러한 이유 이외에도 attention이 중요한 이유는 바로 설명 가능 AI (eXplainable AI, XAI)와 연관이 있기 때문입니다. 원래 AI 모델은 사람이 그 원리를 정확하게 규명할 수 없는 black-box 모델에 가깝습니다. 이러한 모델 중에서 유일하게 사람이 결과에 대한 원인을 볼 수 있는 것이 바로 attention 결과인 것이죠. 물론 attention이 딥러닝 모델의 특정 결과를 내어주게 되는 이유 중 100 %를 차지 하지는 않겠지만 어느정도 사람에게 납득을 시켜줄 수 있다는 것입니다. 그리고 실제로 attention 모델도 non-linearity를 가지는 activation function을 지나기 때문에 이 부분이 설명 불가능하다는 주장도 있어, linear layer로만 구성된 attention 모델도 나온 사례들도 있습니다. 아래의 REverse Time AttentIoN model (RETAIN) 논문도 그러한 사례입니다.




다음에는 IMDb 영화 데이터를 이용하여 위에서 설명한 attention 기반의 감성 분류 모델을 학습해보도록 하겠습니다.

태그 #Sequence-to-Sequence #Attention #ScheduledSampling #TeacherForcing #XAI
⟨ 이전글
RNN, LSTM, GRU
다음글 ⟩
LSTM을 이용한 IMDb 영화 리뷰 감성 분류