기계번역 모델을 RNN Seq2Seq Model을 사용해 만든다고 가정해보자.
(예시 번역 : '나는 학교에 간다' -> 'I go to school')
RNN 구조의 경우, Encoder에서 Decoder로 넘어갈 때 하나의 hidden vector만 넘길 수가 있다.
( 1.1번의 그림에서 thought vector에 해당된다)
따라서 Encoder의 마지막 hidden state에 input 문장에 대한 모든 정보를 담아서 Decoder에 전달해야 하는데, 문장이 길어지면 이 모든 정보를 Encoder의 마지막 hidden state에 제대로 담지 못하는 문제가 발생한다.
이는 정보 변질, 손실의 위험으로 이어지고, 특히 Encoder의 마지막 hidden state에만 정보 전달을 의존하므로 앞쪽 정보를 거의 저장하지 못하게 된다.
Encoder에서 앞쪽 정보를 저장하지 못하면 Decoder에서 첫단어부터 제대로 번역하지 못하는 문제가 발생할 수 있고, 첫 단어가 잘못되면 이후 단어들도 엉망이 될 가능성이 높기 때문에 첫 단추부터 잘못 끼운 문장은 산으로 가게 된다...
이러한 문제를 해결하기 위해 '첫 단어부터 잘 맞추게 하자'라는 목적으로 Encoder에 집어 넣는 문장의 어순을 거꾸로 배열해서 ('나는 학교에 간다' -> '간다 학교에 나는') 집어넣는 시도도 있었다. 하지만 이 경우에도 Encoder 문장의 모든 정보를 잘 담아내지 못하기 때문에 근본적인 해결책이 되지 못한다.
이렇게 Encoder 문장의 많은 정보를 하나의 벡터에만 담아야 해서 나타나는 문제를 Bottleneck problem이라고 하며, Attention 방식을 통해 이러한 RNN Seq2Seq 모델의 한계를 해결하게 되었다.
- Core Idea : Decoder의 각 time step마다, Source Sentence(=Encoder에 들어온 문장)의 특정 부분을 보자.(정확히 말하면 전체를 보되 특정 부분에 집중해보자)
뭔 말인지 모를 수도 있겠지만, 한 단계씩 해보자!
예시로, 프랑스어를 영어로 번역하는 과정을 설명해보려 한다.
( les pauvres sont de'munis -> The poor do not have any money )
Encoder
Decoder
설명이 너무 길었지만 Decoder부분의 한 time step 설명이 끝났다!다음 time step들도 같은 방식으로 진행된다. (문장이 끝날때까지 = 보통 또는 토큰이 나올 때까지 진행)
여기서 헷갈릴 수 있는 부분은, Decoder의 매 time step마다 Encoder의 모든 단어에 대해 내적과 softmax를 취해 context 벡터를 본다는 것이다. 즉 Decoder에서 단어 하나 뱉을 때마다 Encoder에 있는 모든 단어를 본다고 이해하면 될 것 같다.
위에서 Attention을 사용한 Encoder와 Decoder를 거쳐 번역 문장을 만들어내는 과정을 살펴보았다.
이번에는 Attention 방식에서 Decoder hidden state의 역할, Back propagation 경로, Teacher Forcing 방식에 대해 살펴보려고 한다.
Decoder hidden state의 역할
Back propagation 방식
Teacher Forcing
위에서 본 것과 같이, 기본 Attention 방식에서는 Decoder의 hidden vector와 Encoder의 hidden vector의 유사도를 구할 때 두 벡터의 내적을 계산하였다.
하지만 Decoder의 hidden vector와 Encoder의 hidden vector의 유사도를 구할 때 반드시 두 벡터의 내적으로만 유사도를 구해야 하는 것은 아니다. 내적 값 계산 이외에 다른 두 가지 방식을 소개해보려 한다.
Generalized dot product
Concatenation 기반의 Attention
원래 내적 계산에서는 학습 가능한 파라미터가 존재하지 않았다. 하지만 'Generalized dot product'과 'Concatenation 기반의 Attention'에서는 학습가능한 파라미터가 존재한다. 이 파라미터들은 어떻게 학습될까?
관련 개념
마지막으로 Attention이 RNN의 한계를 어떻게 극복했고, 어떻게 성능이 좋아졌는지에 대해 정리해보자.
Attention significantly improves NMT performance
Attention solves the bottleneck problem
Attention helps with vanishing gradient problem
Attention provides some interpretability
attention에서 encoder hidden vector와 decoder hidden vector를 내적해서 내적값을 구하는데, 문득 내적값이 음수인 걸 어떻게 해석해야 하는지에 대해 의문이 들었다. 두 단어가 각각 -1, -2가 나왔다면 -1의 경우보다 -2의 경우가 연관성이 더 떨어진다고 보는 게 맞나?? 두 벡터가 완전히 반대 방향을 보고 있으면 이는 그냥 두 단어와 완전 관계가 없다고 봐야 하는건지, 아니면 반대 의미를 가진다고 해석해도 되는건지 궁금하다.
Seq2Seq2 with Attention의 과정이 복잡하다고만 생각해서 항상 자신이 없었는데, 이번 기회에 내 언어로 설명을 적다 보니 많은 부분이 이해가 되어 자신감이 좀 생겼다. 다음에 배우는 내용들도 내 언어로 최대한 정리를 해 보아야겠다.
Effective Approaches to Attention-based Neural Machine Translation, EMNLP 2015