这篇之前的主流是 encoder–decoder(seq2seq,P03):一台 RNN(encoder)把整句源文一个词一个词读完, 把"读完后的记忆"压成一个固定长度的向量 c(业内戏称 thought vector);另一台 RNN(decoder)拿着这唯一的 c,把译文吐出来。
不管源句是 5 个词还是 50 个词,全都要塞进同一个固定大小的 c。 短句还行,句子一长,前面的信息被后面的覆盖、稀释——像让你读完一整页再凭一句话复述。
论文最有名的实验就是这张「BLEU 随句长暴跌」曲线:固定向量模型一过 30 词,翻译质量直线跳水。 这就是要打的靶。
论文的回答(也是标题):别再用一个向量。让对齐(align)和翻译(translate)一起学。
核心改动只有一处,但改得彻底——context 向量不再是一个,而是每个输出词一个,按需重算。三步:
| 步骤 | 在做什么(用「翻译时回头看原文」打比方) |
|---|---|
| ① 打分 align | 我要译第 i 个词了,拿解码器当前状态 s 去和源句每个词的表示 hj 比一比:eij = a(si-1, hj)——这个 a 是一个小前馈网络,算"源词 j 和我现在要译的,匹配度多高"。 |
| ② 归一 softmax | 把一串匹配分数过 softmax → 一组加起来=1 的对齐权重 αij(attention 权重)。 |
| ③ 加权取 context | ci = Σj αij · hj——用这组权重对所有源词表示加权求和。译每个词,c 都不一样。 |
一句话:固定的 c 变成了"看着办"的 ci。译"猫"时注意力压在 source 的 cat 上,译"昨天"时压到 yesterday 上—— 对齐是模型自己学出来的,没人标注。这就是 "jointly learning to align and translate" 的字面意思。
把这套对到 Transformer 的语言上,胚胎一目了然:
| Bahdanau 2014 | ≈ Transformer 的 |
|---|---|
解码器状态 si-1(我要找什么) | Query |
源词表示 hj(既用来打分、又被取走) | Key 和 Value(这里两者是同一个) |
eij = a(s, h),小网络打分 | 相关度分数(但 Transformer 用 点积替掉这个小网络) |
αij = softmax(e) | 注意力权重 |
ci = Σ α·h | 加权求和的输出 |
区别只在三处:① 打分用小网络(additive)而非点积(dot-product); ② 这里是两条序列之间(译文看源文,叫 cross-attention),还不是自己看自己; ③ 底下还拖着一台 RNN。Transformer 做的是:换点积、加 multi-head、把 RNN 整个删掉。
① 双向 encoder: 每个源词的表示 hj 是前向 + 后向两台 RNN 的拼接——让它既含"前文"又含"后文",是真正以词 j 为中心的整句摘要,不只是"读到 j 为止"。
② 对齐是「免费」涌现的: 那个打分网络 a 和整个翻译系统端到端一起训,没有任何人工对齐标注。对齐是优化翻译时顺带学出来的副产品——这才叫 "jointly"。
③ soft alignment(软对齐): 传统统计翻译(SMT)是硬对齐(一个源词硬配一个译词,非此即彼)。这里是软的——权重连续、可微、可一对多。正因为可微,才能塞进反向传播一起训。
如果上面的 Q/K/V 还没「体感」,把整篇换成一个生活场景——朋友 A 只会英文,噼里啪啦说了一长段,你要翻给只会中文的朋友 B。
| 办法 | 你在干什么 | 对应论文里的什么 |
|---|---|---|
| 旧办法 固定向量 seq2seq |
闭着眼听完,凭脑子一团印象复述。一句话还行;A 一口气说 50 个词,你脑里只剩一团模糊总印象,开头讲啥早被后面冲掉 → 翻得稀碎。 | 整句压成一个 c;那张「30 词后 BLEU 暴跌」曲线,就是这团印象装不下长句。 |
| 新办法 attention(本篇) |
原文摊在桌上,边翻边用手指点回去。翻「猫」点 cat,翻「昨天」划到句尾 yesterday——每翻一个词,眼睛都回原文重扫一遍。 | 保留每个源词 hj;每个输出词重算 context ci;手指点哪、点多重 = 权重 α。 |
软对齐 = 手指虚按。 翻「了」这种时态词,原文里根本没有对应词,手指就在 ate 和 yesterday 之间悬着、各按一点(动作 + 过去)。一对多、按个大概——这就是软对齐,和老式翻译「一个词硬配一个词」的根本区别。
jointly = 手指落点没人教。 没有任何手册告诉你「翻猫时点 cat」。你是在「把整桌翻顺」这唯一目标下,自己练着练着手指就准了——对齐是优化翻译时顺带涌现的副产品,没人标注。
因为你从没受过这个病的苦——你开始用 LLM 时,attention 早已是默认的空气。真正贴你主业的体感:写长 prompt / 做 RAG 时那句焦虑「模型到底看没看我塞进去的后半段?」——病根就是 2014 年这个「固定向量装不下长句」。 attention 的回答是:别让它凭一团印象答,让它每生成一个字,都把你的上下文回头重扫一遍。
英译中,词序会调换(yesterday 跑到中间)。点不同的中文译词,看它的注意力 α 落在哪个英文源词上—— 对角线在词序调换处会拐弯,这正是 soft alignment 的价值(示意权重)。
| 维度 | seq2seq 固定向量 (2014 之前) | Bahdanau attention (本篇, 2014) | Transformer (P01, 2017) |
|---|---|---|---|
| context | 整句压成1 个 c | 每个输出词重算 ci | 每个 token、每层都重算 |
| 打分方式 | — | 小前馈网络(additive) | 缩放点积(scaled dot-product) |
| attention 类型 | 无 | cross(译文 ← 源文) | self + cross + multi-head |
| 底座 | RNN | RNN(双向) | 无 RNN,纯 attention |
| 长句表现 | 30 词后暴跌 | 长句不掉链子 | 受限于 O(n²) 成本,不受信息瓶颈 |
| 你工作里的东西 | 其实就是这篇论文的什么 |
|---|---|
| 你每天用的 self-attention | 就是这篇的直系后代:把"译文看源文"改成"序列看自己"、把小网络打分换成点积,就成了 P01。 |
| attention 热力图 / 可解释性 | 软对齐第一次让"模型在看哪"可被画出来。你 debug agent"它到底参考了上下文哪段"时,看的就是这套权重的后代。 |
| RAG 为什么要切块、不能把长文塞进一个 embedding | 正是固定向量瓶颈在检索端的回响:一个 dense 向量压不下一篇长文档。RAG 回答"答得碎/有拼接感",很多就栽在这。 |
| encoder–decoder / cross-attention | 多模态、检索增强生成里"用一条序列去引导另一条"的结构,源头就在这篇的"译文 query 源文"。 |
读原典:Bahdanau, Cho & Bengio — Neural Machine Translation by Jointly Learning to Align and Translate (arXiv:1409.0473)—— 重点读第 3 节(模型)和图 3(那张对齐热力图,本课互动的原型)。
建立直觉可配:Jay Alammar — Visualizing A Neural Machine Translation Model。
想接着读「它前一步」——固定向量的 seq2seq 本体,就是下一档的 P03 (Sutskever 2014)。
参考:
Bahdanau, Cho & Bengio, Neural Machine Translation by Jointly Learning to Align and Translate, ICLR 2015;Alammar, Visualizing A Neural Machine Translation Model.