공부하는 안씨의 기록
[논문 리뷰] Neural machine translation by jointly learning to align and translate 본문
[논문 리뷰] Neural machine translation by jointly learning to align and translate
an씨 2025. 3. 31. 23:08이번 논문 리뷰에서는 Neural Machine Translation 분야에서 Attention 메커니즘을 처음 도입한 논문인 "Neural Machine Translation by Jointly Learning to Align and Translate"를 다루고자 한다. 이 논문은 기존 Seq2Seq 구조의 한계인 Bottleneck 문제를 해결하고자 Attention 메커니즘을 제안한 점에서 큰 의의가 있다. 패스트 캠퍼스 강의에서 Attention 관련 강의를 수강하다가, 해당 논문을 언급해주셔서, 따로 논문 리뷰를 진행해보았다. Attention 메커니즘을 잘 이해하기 위해 정리해보았는데, 아직 미숙한 실력이지만 이번 논문을 리뷰해 보면서 학습에 큰 도움이 되었다.
1. 기존 Seq2Seq 구조의 한계
Seq2Seq 구조에 대해 알아보기 전에, 먼저 RNN에 대해 짚고 넘어가보자.
RNN은 Recurrent Neural Network(순환 신경망)의 약자로, 입력과 출력을 시퀀스 단위로 처리하는 시퀀스(Sequence) 모델이다. 이러한 기존의 RNN(Recurrent Neural Network) 기반(또는 LSTM)의 Seq2Seq 모델은 입력 시퀀스를 인코더가 고정된 크기의 context vector로 요약하고, 이를 디코더가 참고하여 출력 시퀀스를 생성한다. 하단 이미지를 통해 쉽게 이해가 가능하다.
인코더는 입력을 sequential하게 처리한다. 예를 들어 I am a student 라는 문장을 입력하면, 이 문장의 각 단어는 워드 임베딩을 통해 벡터로 변환되어 인코더에 전달된다. 이를 바탕으로 인코더 내부의 RNN 구조에서 hidden state를 업데이트시키며, 다음 스텝으로 넘어가게 되며, 이를 바탕으로 최종적으로 받아들여진 문장 전체가 C(Context vector)로 저장되며 디코더는 이 Context vector를 바탕으로 출력 시퀀스를 생성해낸다.
그러나 이 구조는 문장이 길어질수록 입력 정보를 압축하는 데 한계가 있으며, 이를 Bottleneck 문제라고 한다. 입력 문장의 길이가 길면 길 수록, 고정된 길이의 Context Vector로 인해 다양한 입력 문장의 정보를 전부 담을 수 없게 된다. 즉, 정보 손실로 인해 의도했던 기능(번역 등)을 전부 담기 어려워지는 것이다.
이번 논문은 이러한 문제를 해결하기 위해 디코더가 입력 전체를 매번 다시 참고할 수 있도록하는, Attention 메커니즘을 도입하였다.
2. 해결 방안: Seq2Seq with attention(논문 제시: RNNsearch 모델)
위와 같은 문제를 해결하기 위해, 해당 논문에서는 Attention 메커니즘을 도입한 RNNsearch 모델을 제시한다.
기존 모델과 어떻게 다른지 해당 논문에서 제시한 RNNsearch 모델의 Encoder와 Decoder 구조에 대해 자세하게 설명해보았다.
(1) RNN Encoder 구조
- 시작하기 전에, 간단하게 기호에 대해 정의를 내리면, 아래와 같다.
- 인코더에는 Bidirectional RNN(BiRNN)을 적용하여 입력 문장을 앞에서 뒤로, 뒤에서 앞으로 동시에 처리한다. 이를 통해 입력 문장의 앞뒤 문맥을 동시에 반영할 수 있다.
- 단어별로 앞에서 읽은 정보와 뒤에서 읽은 정보를 합쳐서 annotation vector를 구상한다. 이를 수식으로 나타낸 바는 아래와 같다. (순방향 벡터, 역방향 벡터)
- 이렇게 생성된 annotation vector의 집합인 annotation sequence {h₁, ..., h_{Tₓ}} 는 디코더와 attention 모듈에서 context vector를 계산할 때 사용된다. 또한, 위 수식의 j 는 인코더 입력 문장의 단어 위치를 의미한다.
(2) RNN Decoder 구조
- 디코더는 현재 단어를 생성할 때, 아래의 세가지 정보를 사용하여 현재 상태 s_i를 만든 다음, 이를 기반으로 다음 단어의 확률을 예측
- 이때, Context Vector c_i는 인코더가 만든 annotaion vectors인 h_j에 대해 각각의 중요도를 나타내는 가중치 α_{ij}를 곱한 후 더해서 만든다. 이때, 각 기호의 정의를 짚고 넘어가자면, 아래와 같다.
- 이 attention 가중치 α_{ij} 를 이용해 context vector를 다음과 같이 계산한다.
- 즉, 디코더는 입력 문장의 전체를 다 보면서 이번 단어를 만들 때 어디에 집중해야 할지 판단하여 중요한 위치일 수록 높은 가중치를 주고, 그 정보를 합쳐서 context vector를 만든다.
- 이때, 가중치 α_{ij}는 alignment model이라 불리는 함수로 계산된 score e_{ij}를 softmax 정규화해서 만든다. score e_{ij}는 디코더의 이전 상태 s_{i-1}와 인코더의 위치 j에 해당하는 annotation h_j 사이의 연관도를 나타낸다.
- 쉽게 말해, 디코더가 어떤 단어를 출력할지 결정할 때, 인코더가 생성한 각 위치의 벡터(h₁, h₂, ..., hₜ) 중 어디에 주목할지(align) 판단하는 점수가 e_{ij} ,그걸 softmax로 정규화한 것이 attention weight α_{ij}
- 즉, 디코더는 번역을 진행하며 어디를 봐야할지를 매번 판단한다. 그 판단은 학습을 통해 자동으로 이루어지고, 결과적으로 context vector가 매번 달라지며 이는 동적인 soft-alignment로 작동한다.
- 이전 모델은 고정된 c 하나만을 사용했었으나, attention mechanism의 seq2seq 모델에서는 매번 달라지는 c가 존재.
3. (예시) I love you → Je t'aime
이번 예시는 논문을 리뷰하면서 매번 달라지는 context vector의 존재가 잘 이해되지 않아, 스스로 간단한 예시를 만들어본 내용이다. I love you 라는 문장을 프랑스어로 번역을 진행하고자 하는데, 본 논문에서 제시한 attention을 도입한 seq2seq 모델에서 어떻게 처리되는지 살펴보자.
(1) Encoder (입력 처리)
(2) Decoder (출력 처리)
- i = 1 ( "Je" 생성 )
- 이전 상태: s_0 (초기 값)
- 이전 단어: <SOS> (시작 토큰)
- attention 계산(예)
입력 단어 | Attention α₁ⱼ |
"I" (h₁) | 0.6 |
"love" | 0.3 |
"you" | 0.1 |
c_1, s_0, 그리고 이전 단어인 <SOS> 토큰을 기반으로 "Je"를 출력하고,이렇게 구한 정보들을 바탕으로 새로운 상태인 s_1을 생성한다.
- i = 2 ( " t' " 생성)
- 이전 상태: s_1 (이전 상태는 s_0 → s_1로 변화하였음. 상태가 다르기 때문에, 지금 어떤 입력 단어를 주목할 지에 대한 판단도 달라질 것이다.)
- 이전 단어: Je
- attention 계산(예)
입력 단어 | Attention α₁ⱼ |
"I" | 0.1 |
"love" | 0.2 |
"you" | 0.7 |
마찬가지로 위와 같은 정보를 바탕으로 " t' "를 출력하고, 상태 s_2를 생성한다.
- i = 3 ( " aime " 생성)
- 이전 상태: s_2
- 이전 단어: t'
- attention 계산(예)
입력 단어 | Attention α₁ⱼ |
"I" | 0.2 |
"love" | 0.7 |
"you" | 0.1 |
마찬가지로 위와 같은 정보를 바탕으로 " aime "를 출력하고, <EOS> 토큰을 만나며 종료.
그래서, 제시된 모델은 왜 유동적인 context vector를 가진다는 건지?
앞선 예시를 바탕으로, 기존 모델이 고정된 길이의 context vector를 가지는 것과 달리,
attention을 적용한 seq2seq모델은 매번 다른, 유동적인 context vector를 가지는 이유를 설명해볼 수 있다.
매 디코딩 스텝 i 마다 바뀌는 상태 s_{i-1}을 기반으로 attention score가 계산되고,
디코더 상태 s_{i-1} 가 다르면
→ alignment score e_{ij} = a(s_{i-1}, h_j)도 달라짐
→ attention weight α_{ij}가 달라짐 ( e_{ij}에서 softmax가 적용된 값이니까.)
→ context vector c_i = \sum_j \alpha_{ij} h_j도 달라짐 (attention이 다르니 context 도 매번 다름.)
4. 모델 구조 요약
🔍 직관적인 흐름 요약
- 인코더가 입력 문장을 위치별 벡터 h_j로 변환
- 디코더는 단어를 하나씩 생성
- 생성할 때마다 "어디를 볼까?" 판단 → attention
- 그에 맞춰 입력 정보를 골라낸 context vector c_i
- 이를 바탕으로 다음 단어 생성
Encoder (annotation vector) |
Decoder |
![]() |
![]() |
5. 실험 결과 요약
- BLEU 점수 기준으로 RNNsearch가 기존 RNNencdec 모델보다 우수한 성능을 보였다.
- 특히 문장이 길어질수록 성능 차이가 더 커졌으며, attention 메커니즘의 효과가 확실하게 나타났다.
- 또한 attention weight를 시각화함으로써 단어 간 정렬(align)이 어떻게 이루어지는지를 명확히 확인할 수 있다.
6. 결론 및 의의
- 이 논문은 Seq2Seq 모델에 attention을 도입하여 Bottleneck 문제를 해결하였다.
- 디코더가 입력 문장의 특정 위치를 집중해서 바라볼 수 있게 하여, 긴 문장도 효과적으로 번역할 수 있게 되었다.
- 또한 정렬 정보와 번역을 동시에 학습하는 end-to-end 학습 구조를 구성하였다.
이 논문은 이후 Transformer 구조, BERT, GPT 등 self-attention 기반 모델의 발전에 기초를 마련한 중요한 연구이다. 단, 이 모델은 여전히 RNN 기반이기 때문에 시간 순서를 따르는 구조에서 인접한 단어에 집중하는 경향이 남아 있으며, 이는 추후 Transformer에서 개선된다고 한다. 이후 단계에 대해서도 추가적으로 리뷰하기 좋은 논문이 있다면 리뷰해보며 공부하고 싶다.