신경망 기계 번역(NMT)은 단일 신경망을 통해 번역 성능을 극대화하는 혁신적인 접근 방식입니다. 오늘 정리할 논문은 기존 NMT 모델이 가졌던 치명적인 약점인 '고정 길이 벡터의 병목 현상'을 해결하며 어텐션(Attention) 메커니즘의 시대를 연 연구입니다.
1. 기존 NMT의 문제점: 고정 길이 벡터의 병목 현상
기존의 Encoder-Decoder 모델(예: Cho et al., 2014)은 다음과 같은 구조적 한계를 가지고 있었습니다.
- 정보 압축의 부담: 인코더는 입력 문장의 모든 정보를 단 하나의 고정 길이 컨텍스트 벡터(Fixed-length Context Vector)에 압축해야 합니다.
- 긴 문장에서의 성능 저하: 문장이 길어질수록 모든 정보를 작은 벡터 안에 담기 어려워지며, 이로 인해 번역 품질이 급격히 떨어지는 현상이 발생했습니다.
- 병목 현상(Bottleneck): 아무리 복잡한 문장이라도 동일한 크기의 공간에 밀어 넣어야 한다는 점이 전체 시스템 성능 향상의 걸림돌이 되었습니다.
2. Align and Translate (정렬과 번역의 결합)
본 논문은 이러한 한계를 극복하기 위해 "디코더가 단어를 생성할 때마다 입력 문장의 관련 부분을 스스로 탐색하게 하자"는 가설을 세웠습니다.
- Soft-Alignment: 특정 시점의 단어를 번역할 때, 소스 문장의 어떤 단어들이 중요한지 가중치를 할당하여 찾아냅니다.
- 어노테이션(Annotations): 전체 문장을 하나의 벡터로 압축하지 않고, 입력 문장의 각 단어 주변 정보를 포함하는 벡터 시퀀스로 인코딩합니다.
- 적응적 선택: 번역 과정에서 이 벡터 시퀀스 중 필요한 부분만 적응적으로 선택하여 컨텍스트 벡터를 생성합니다.
3. 방법론 (Core Methodology)
이 모델(RNNsearch)은 인코더(BiRNN)와 디코더(Attention 기반 RNN)로 구성됩니다.
3-1 디코더: 어텐션 메커니즘 (Attention Mechanism)
디코더는 각 단계 $i$에서 다음 목표 단어 $y_i$를 예측할 때, 고정된 벡터가 아닌 매번 변화하는 컨텍스트 벡터 $c_i$를 사용합니다.
여기서 핵심인 $c_i$는 다음과 같이 계산됩니다.
- 컨텍스트 벡터 계산: 인코더의 은닉 상태(어노테이션) $h_j$들의 가중합입니다.
-
$$c_i = \sum_{j=1}^{T_x} \alpha_{ij} h_j$$
- 어텐션 가중치 ($\alpha_{ij}$): 정렬 모델(Alignment Model) $e_{ij}$를 소프트맥스 함수로 정규화한 값입니다.
-
$$\alpha_{ij} = \frac{\exp(e_{ij})}{\sum_{k=1}^{T_x} \exp(e_{ik})}$$
- 정렬 모델 ($e_{ij}$): 이전 디코더 상태 $s_{i-1}$와 현재 인코더 어노테이션 $h_j$가 얼마나 관련 있는지 점수화하는 작은 피드포워드 신경망입니다.
-
$$e_{ij} = a(s_{i-1}, h_j) = v_a^T \tanh (W_a s_{i-1} + U_a h_j)$$
이 방식은 정렬(Alignment)을 직접 계산 가능한 변수로 만들어, 전체 모델이 역전파(Backpropagation)를 통해 동시에 학습될 수 있게 합니다.
3-2 인코더: 양방향 RNN (Bidirectional RNN)
단순한 순방향 RNN은 나중에 들어온 정보에 편향될 수 있습니다. 이를 해결하기 위해 **양방향 RNN(BiRNN)**을 사용합니다.
- 순방향 RNN ($\vec{f}$): $x_1$부터 $x_{T_x}$까지 읽어 $\vec{h}_j$ 생성
- 역방향 RNN ($\overleftarrow{f}$): $x_{T_x}$부터 $x_1$까지 거꾸로 읽어 $\overleftarrow{h}_j$ 생성
- 최종 어노테이션 ($h_j$): 두 상태를 연결(Concatenate)하여 $h_j = [\vec{h}_j^T; \overleftarrow{h}_j^T]^T$를 만듭니다. 이를 통해 $h_j$는 해당 단어 앞뒤의 모든 문맥 정보를 요약하게 됩니다.
3-3 Gated Hidden Unit (GRU-like unit)
모델은 장기 의존성(Long-term dependency) 학습에 유리한 게이트 유닛(Gated Hidden Unit)을 사용합니다.
- 업데이트 게이트 ($z_i$): 이전 상태를 얼마나 유지할지 결정
- 리셋 게이트 ($r_i$): 이전 상태를 얼마나 무시할지 결정
- 출력: Maxout 유닛을 포함한 다층 신경망을 통해 최종 확률을 계산합니다.
4. 실험 설정 및 결과
실험 데이터 및 환경
- 태스크: 영어-프랑스어 번역 (WMT '14 코퍼스)
- 데이터 규모: 3.48억 개의 단어
- 비교 모델:
- RNNencdec: 기존 고정 길이 벡터 방식 (Baseline)
- RNNsearch: 제안된 어텐션 기반 방식 (Proposed)
- 기타: Adadelta 최적화, 그래디언트 클리핑, 빔 서치 적용
주요 결과
- 정량적 성과: RNNsearch 모델은 모든 문장 길이에서 기존 RNNencdec 모델을 압도했습니다. 특히, 추가적인 단일 언어 코퍼스를 사용하지 않고도 기존 통계 기반 시스템(Moses)에 필적하는 성능을 보여주었습니다.
- 문장 길이에 대한 강건함: RNNencdec는 문장이 길어질수록 성능이 급락했지만, RNNsearch-50은 50단어 이상의 긴 문장에서도 성능 저하 없이 안정적인 번역 품질을 유지했습니다.
5. 정성적 분석: 모델이 보고 있는 곳은 어디인가?
이 논문의 가장 흥미로운 점 중 하나는 모델이 어떤 단어에 집중하는지 시각화했다는 것입니다.
- 언어적 타당성: 영어의 "European Economic Area"가 프랑스어의 "zone économique européenne"으로 번역될 때, 모델이 어순 차이를 극복하고 비단조적(non-monotonic)으로 정확히 정렬하는 것을 확인했습니다.
- 유연한 번역: "the"를 프랑스어 "l’"로 번역할 때, 바로 뒤의 단어가 모음으로 시작하는지 확인하기 위해 다음 단어까지 살펴보는 "Soft-alignment"의 유연함이 돋보였습니다.
6. Bahdanau Attention 구현
6-1 Bahdanau Attention 핵심 수식 복습
코드 구현 전, 우리가 코드로 옮길 핵심 수식 3가지를 다시 확인합니다.
- Alignment Score ($e_{ij}$): $e_{ij} = v_a^\top \tanh(W_a s_{i-1} + U_a h_j)$
- Attention Weights ($\alpha_{ij}$): $\alpha_{ij} = \text{softmax}(e_{ij})$
- Context Vector ($c_i$): $c_i = \sum \alpha_{ij} h_j$
6-2 PyTorch 구현 코드 (Class)
이 모듈은 디코더의 현재 상태($s_{i-1}$)와 인코더의 전체 상태들($h$)을 입력받아 컨텍스트 벡터를 반환합니다.
import torch
import torch.nn as nn
import torch.nn.functional as F
class BahdanauAttention(nn.Module):
def __init__(self, hidden_dim):
super(BahdanauAttention, self).__init__()
# W_a: 디코더 상태(s_i-1)를 변환하는 가중치
self.W = nn.Linear(hidden_dim, hidden_dim)
# U_a: 인코더 상태(h_j)를 변환하는 가중치
self.U = nn.Linear(hidden_dim, hidden_dim)
# v_a: 최종 점수를 계산하기 위한 벡터
self.v = nn.Parameter(torch.rand(hidden_dim))
def forward(self, hidden, encoder_outputs):
"""
hidden: 디코더의 이전 은닉 상태 [batch_size, hidden_dim]
encoder_outputs: 인코더의 모든 은닉 상태 [seq_len, batch_size, hidden_dim]
"""
seq_len = encoder_outputs.size(0)
batch_size = encoder_outputs.size(1)
# 1. 디코더 hidden 상태의 차원 맞추기 (시퀀스 길이만큼 반복)
# [batch_size, hidden_dim] -> [seq_len, batch_size, hidden_dim]
hidden_expanded = hidden.repeat(seq_len, 1, 1)
# 2. Alignment Score 계산 (Additive Attention)
# e_ij = v_a^T * tanh(W*s_{i-1} + U*h_j)
# score shape: [seq_len, batch_size, hidden_dim]
energy = torch.tanh(self.W(hidden_expanded) + self.U(encoder_outputs))
# v_a와 내적하여 스칼라 점수 획득
# score shape: [seq_len, batch_size]
v = self.v.repeat(batch_size, 1).unsqueeze(2) # [batch_size, hidden_dim, 1]
energy = energy.permute(1, 0, 2) # [batch_size, seq_len, hidden_dim]
score = torch.bmm(energy, v).squeeze(2) # [batch_size, seq_len]
# 3. Attention Weights 계산 (Softmax)
# weights shape: [batch_size, seq_len]
attention_weights = F.softmax(score, dim=1)
# 4. Context Vector 계산 (가중합)
# weights: [batch_size, 1, seq_len]
# encoder_outputs: [batch_size, seq_len, hidden_dim]
encoder_outputs = encoder_outputs.permute(1, 0, 2)
context_vector = torch.bmm(attention_weights.unsqueeze(1), encoder_outputs)
# context_vector shape: [batch_size, 1, hidden_dim]
return context_vector, attention_weights
6-3 코드 상세 설명 (Step-by-Step)
① 가중치 선형 결합 (Linear Transformation)
논문의 수식 $W_a s_{i-1} + U_a h_j$ 부분을 처리합니다. 디코더의 은닉 상태와 인코더의 어노테이션을 각각 선형 변환한 뒤 더해줍니다. 이 방식이 '더하기(Additive)' 방식이라 불리는 이유입니다.
② Tanh 활성화 함수와 $v_a$ 내적
더해진 값에 비선형성($\tanh$)을 부여한 후, 학습 가능한 파라미터인 $v_a$와 곱하여 최종적인 에너지(Energy) 혹은 점수를 얻습니다. 이 점수는 "디코더의 현재 단계에서 인코더의 특정 단어가 얼마나 중요한가"를 나타냅니다.
③ 소프트맥스(Softmax)를 통한 확률화
계산된 점수들을 0~1 사이의 확률 값으로 변환합니다. 모든 입력 단어에 대한 가중치 합은 1이 됩니다.
④ 컨텍스트 벡터(Context Vector) 생성
인코더의 각 단어 벡터($h_j$)에 계산된 가중치($\alpha_{ij}$)를 곱해 모두 더합니다. 결과적으로 현재 시점에서 번역에 가장 필요한 정보만 '농축된' 하나의 벡터가 만들어집니다.
6-4 이 메커니즘이 중요한 이유
- 동적 정보 추출: 고정된 벡터를 쓰는 대신, 매 스텝마다 필요한 정보를 새롭게 정의합니다.
- 가중치 시각화: attention_weights를 출력해 보면 모델이 실제로 어떤 단어를 보고 번역했는지 히트맵(Heatmap)으로 그려볼 수 있습니다. 이는 딥러닝의 '블랙박스' 문제를 일부 해결해 줍니다.
7. 결론 및 향후 과제
본 논문은 NMT의 고질적인 문제였던 정보 압축의 한계를 '어텐션 메커니즘'으로 해결했습니다.
- 의의: 전체 문장을 고정 길이 벡터에 쑤셔 넣을 필요가 없어져, 긴 문장 번역 능력이 비약적으로 향상되었습니다.
- 영향: 이 연구는 이후 Luong Attention, 그리고 오늘날 AI 열풍의 핵심인 Transformer 구조의 근간이 되었습니다.
- 향후 과제: 미지어(Unknown word)나 희귀어(Rare word) 처리에 대한 연구가 추가적으로 필요함을 시사했습니다.
이 논문은 단순히 번역 성능을 높인 것을 넘어, 인공지능이 정보를 처리할 때 "어디에 집중해야 하는가"라는 질문에 대한 답을 제시한 명작입니다. NMT를 공부하신다면 반드시 원문과 함께 이 메커니즘을 숙지하시길 권장합니다.
