IQ Lab
← all posts
AI 2026.04.28 · 14 min read Advanced

Seq2Seq에서 Attention까지, 무엇이 달라졌나

고정 벡터 병목부터 Bahdanau의 soft alignment, Luong의 효율화, Coverage와 Pointer Network까지 — RNN 기반 attention 계보의 설계 결정을 추적한다.


Sutskever 2014의 Seq2Seq는 번역·요약·대화를 하나의 틀로 묶었다. Encoder가 입력 전체를 하나의 벡터로 압축하고, Decoder가 그 벡터에서 출력을 뽑아낸다. 단순하고 우아하다. 그런데 문장이 30단어를 넘어서는 순간 BLEU가 무너지기 시작한다. 왜 이 구조는 긴 문장 앞에서 취약한가, 그리고 Attention은 이 문제를 어떻게 다르게 접근했는가?

고정 벡터의 병목

Encoder의 마지막 hidden state v=hTencRHv = h_T^{\text{enc}} \in \mathbb{R}^H 하나가 입력 전체의 정보를 담아야 한다. 이론적으로는 가능하다 — float32 기준 H=1024H=1024이면 약 32,768비트, 50단어 문장의 정보량(50×log230,00075050 \times \log_2 30{,}000 \approx 750 비트)을 충분히 수용한다.

문제는 용량이 아니라 최적화다. BPTT가 h1h_1에서 hTh_T까지 TT 스텝을 거슬러야 하는 탓에, 첫 번째 토큰의 정보가 vv까지 도달하는 경로가 너무 길다. Cho 2014b는 이를 실증으로 보여줬다.

Long Sentence Curse (Cho 2014b)

WMT’14 En→Fr에서 문장 길이가 30단어를 넘는 순간 BLEU가 급감한다. 길이 10 근방에서 BLEU 30이던 것이 길이 60에서 10 아래로 떨어진다. 이론적 용량이 아니라 학습 dynamics가 병목이다.

Decoder의 구조적 한계도 더해진다. 매 출력 스텝 sts_t가 같은 vv만 참조하므로, “번역의 첫 단어는 입력의 첫 단어 정보가 필요하다”는 단서를 활용할 수 없다. 용량은 충분하나 접근이 균등하다.

Sutskever가 제안한 **역순 입력(reverse input trick)**은 이 문제의 일부를 해결한다. 입력을 xT,xT1,,x1x_T, x_{T-1}, \ldots, x_1 순서로 넣으면 vv가 원래 x1x_1에 가장 가까이 위치하게 되어, 번역의 첫 단어와 입력의 첫 단어 사이 경로가 단축된다. Sutskever 2014의 실험에서 +4.7 BLEU가 여기서 나왔다. 그러나 이것은 해결이 아니라 workaround다.

Bahdanau Attention — 병목을 우회하다

Bahdanau 2015는 구조를 바꾼다. Encoder의 마지막 hidden만 쓰는 대신, 모든 encoder hidden state {h1,,hT}\{h_1, \ldots, h_T\}를 보존하고, Decoder가 매 스텝마다 필요한 위치에 집중한다.

eij=vtanh(W1hi+W2sj)e_{ij} = v^\top \tanh(W_1 h_i + W_2 s_j) αij=exp(eij)k=1Texp(ekj),cj=i=1Tαijhi\alpha_{ij} = \frac{\exp(e_{ij})}{\sum_{k=1}^{T} \exp(e_{kj})}, \quad c_j = \sum_{i=1}^{T} \alpha_{ij} h_i

핵심은 capacity의 변화다. Vanilla Seq2Seq의 용량은 O(H)O(H)로 고정이지만, Attention의 유효 용량은 O(TH)O(T \cdot H)다 — 문장이 길어질수록 함께 늘어난다.

명제 1 · Attention의 용량 스케일링

Bahdanau attention에서 Decoder의 각 스텝은 모든 encoder state {hi}i=1T\{h_i\}_{i=1}^T에 접근 가능하다. 유효 용량은 THT \cdot H로 입력 길이에 선형 비례한다.

▷ 증명

Decoder step jj의 context vector cj=iαijhic_j = \sum_i \alpha_{ij} h_iα\alpha의 값에 따라 임의의 hih_i를 임의의 가중치로 조합할 수 있다. 따라서 TT개의 HH-차원 벡터 전체가 정보원이 된다. \square

또 다른 핵심은 alignment가 학습된다는 점이다. IBM 통계 번역 모델은 alignment를 별도 단계에서 EM으로 추정했다. Bahdanau는 v,W1,W2v, W_1, W_2가 번역 손실 자체로 end-to-end 학습된다. “J’aime”를 출력할 때 “love”에 높은 α\alpha를 부여하는 패턴이 alignment label 없이 나타난다.

WMT’14 En→Fr에서 Vanilla Seq2Seq + reverse 대비 +7.7 BLEU. 긴 문장에서의 개선이 특히 크다.

Luong Attention — 효율화와 Transformer로의 다리

Bahdanau의 additive attention은 표현력이 높지만 per-pair tanh 연산이 들어간다. Luong 2015는 세 가지 scoring 함수를 체계적으로 비교한다.

eij={hisjdothiWasjgeneralvtanh(Wa[hi;sj])concate_{ij} = \begin{cases} h_i^\top s_j & \text{dot} \\ h_i^\top W_a s_j & \text{general} \\ v^\top \tanh(W_a [h_i; s_j]) & \text{concat} \end{cases}

WMT’15 En→De 실험에서 general scoring이 BLEU 25.9로 최우수였다 — concat(Bahdanau 방식)과 동등하거나 약간 우월하면서도 계산이 빠르다. encoder state WKhiW_K h_i를 미리 계산해 재사용할 수 있기 때문이다.

더 중요한 것은 Transformer와의 연결이다. Luong general을 저랭크 분해하면:

W = W_K^T W_Q 라 하면

e_{ij} = h_i^T W_K^T W_Q s_j
       = (W_K h_i)^T (W_Q s_j)
       = K_i^T Q_j

여기에 dK\sqrt{d_K} 정규화를 추가하면 정확히 Transformer의 scaled dot-product attention이 된다. Luong general은 Query/Key 분리의 직전 단계였다.

Coverage와 Pointer — Attention의 두 확장

Attention이 도입되자 새로운 문제가 드러났다. 같은 source position을 반복해서 attend하면 번역이 반복된다. Tu 2016의 Coverage mechanism은 이력을 추적한다.

cjcov=j=1jα:,jRTc_j^{\text{cov}} = \sum_{j'=1}^{j} \alpha_{:,j'} \in \mathbb{R}^T

누적된 coverage가 높은 위치는 scoring 시 패널티를 받는다. 이미 번역된 구간을 다시 번역하지 않도록 attention이 새 위치를 탐색하게 된다. WMT’14에서 +1.5 BLEU.

Vinyals 2015의 Pointer Network는 다른 방향의 확장이다. TSP나 정렬 같은 조합 최적화에서는 출력이 입력의 인덱스다. 어휘 크기가 고정되지 않고 입력 길이 TT에 따라 바뀐다.

p(yt=iy<t,x)=αtip(y_t = i \mid y_{<t}, x) = \alpha_{ti}

Attention weight 자체가 출력 확률이 된다. 입력이 5개이면 출력 어휘도 5개, 20개이면 20개 — 가변 크기를 자연스럽게 처리한다.

See 2017의 Pointer-Generator는 둘을 결합한다. 추상적 요약에서 일반 단어는 어휘에서 생성하고, 고유명사나 희귀어는 source에서 직접 복사한다.

p(yt=w)=pgenpvocab(w)+(1pgen)i:xi=wαitp(y_t = w) = p_{\text{gen}} \cdot p_{\text{vocab}}(w) + (1 - p_{\text{gen}}) \cdot \sum_{i: x_i = w} \alpha_{it}

pgenp_{\text{gen}}은 학습이 자동으로 결정한다. CNN/Daily Mail 데이터셋에서 ROUGE-1 기준 +5. 이 copy mechanism의 정신은 현대 RAG(Retrieval-Augmented Generation)로 직접 이어진다 — 단일 문서에서 외부 지식 저장소 전체로 스케일이 바뀌었을 뿐이다.

트레이드오프

아키텍처별 트레이드오프
  • Vanilla Seq2Seq: 단순하지만 긴 문장에서 정보 손실. Reverse trick은 workaround.
  • Bahdanau: 용량 O(TH)O(T \cdot H), 표현력 높음, additive per-pair 연산이 느림.
  • Luong general: Bahdanau와 동등한 품질, 행렬 pre-compute로 30-50% 빠름.
  • Coverage: 반복 번역 제거, 추가 파라미터와 loss term 필요.
  • Pointer Network: 가변 출력 어휘, 조합 최적화에 강함, 제약 조건 처리는 약함.
  • Pointer-Generator: OOV 해결, copy/generate 혼합으로 복잡도 증가.

Luong의 Local attention은 또 다른 축이다. 전체 TT 위치 대신 예측된 중심 pjp_j 주변 윈도우만 attend하면 복잡도가 O(T2S)O(T^2 S)에서 O(TSD)O(T S D)로 줄어든다(DTD \ll T). BLEU는 약 0.5 손실되지만 긴 문서에서 속도 이득이 크다. Transformer 이후 Longformer, BigBird 등의 sliding window attention이 같은 아이디어를 계승한다.

정리

  • Seq2Seq의 고정 벡터 병목은 이론적 용량 문제가 아니라 최적화 문제다 — 경로가 길어 gradient가 소실된다.
  • Bahdanau attention은 용량을 O(H)O(H)에서 O(TH)O(T \cdot H)로 늘리고, alignment를 end-to-end로 학습한다.
  • Luong general은 Bahdanau와 동등한 품질을 더 빠르게 달성하고, Query/Key 분리를 통해 Transformer의 직전 단계가 된다.
  • Coverage는 attention 이력으로 반복을 억제하고, Pointer-Generator는 copy mechanism으로 OOV를 해결한다. 두 아이디어는 현대 RAG 아키텍처에 계승된다.

이 계보에서 각 논문은 이전 논문의 “정확한 진단” 위에서 나왔다. Cho가 병목을 진단하고 Bahdanau가 해결했고, Luong이 효율화하고 Vaswani가 RNN 자체를 교체했다. 문제를 정확히 이름 붙이는 것이 해결의 절반이다.