跳到主要内容

注意力机制 — 机器翻译怎么学会「看词下菜」

这一章讲三件事: 编码器-解码器怎么把「一句翻成另一句」变成逐词生成; 固定语义向量的瓶颈在哪,注意力怎么按词分配「关注度」修掉它; 以及一个跑得通的中英翻译实例——训练 47 分钟,loss 从 2.64 降到 0.009。 这是全书与今天大模型距离最近的一章:注意力就是后来 Transformer 的核心零件。

1. 顶层全景:把翻译拆成一串「下一个词」

输入 X=(x1,…,xm) ──→ Encoder(如 RNN/GRU) ──→ 语义表示 C

Decoder:<SOS> → y1 → y2 → … → <EOS> ←── 每步吃 (C, 已生成的词)
逐步输出 yi = g(C, y1,…,y(i-1))

图说:编码器把源句压成中间语义 C;解码器按「已生成什么」
一个词一个词往外蹦。X、Y 可以是任意两种语言,也可以是文章↔摘要。

这套框架叫 Encoder-Decoder,也叫 Seq2Seq;编码器解码器内部用什么(CNN/RNN/GRU/LSTM)自选1。形式化只有两行:编码器把输入句子经非线性变换压成中间语义表示 C;解码器根据 C 和已生成的历史 y1…y(i-1),生成第 i 个词2。机器翻译、文本摘要、对话机器人都是这个骨架的换皮3

2. 固定 C 的瓶颈:书里叫它「分心模型」

框架有个结构性缺陷:生成每个输出词时,用的都是同一个 C——源句的全部信息被压进一个向量,句子一长,「单词自身的信息已经消失」,细节丢失,译文质量明显下滑4。而且这不合理:翻译「杰瑞」时,英文句里每个词对它的贡献并不相同,固定 C 却让它们一样5

书里给这个缺陷起了个刺眼的名字——分心模型(注意力模型的反义):它对源句每个词一视同仁,「分心」到哪个词都没多看一眼6

3. 主走查:翻译「杰瑞」时,注意力怎么分

修法就是让 C 逐输出词而变。书里的例子:输入 "Tom chase Jerry",逐词生成「汤姆」「追逐」「杰瑞」。翻译到「杰瑞」时,理想的注意力分配是一个概率分布:

(Tom, 0.3) (Chase, 0.2) (Jerry, 0.5) ← 和为 1

「杰瑞」的语义向量 C3 按这个分布加权合成:
C杰瑞 = 0.3·h(Tom) + 0.1·h(Chase) + 0.5·h(Jerry)
(h(·) 是编码器对每个词的变换输出,书里记 f2)

对照:翻译「汤姆」时分布变成 (0.6, 0.2, 0.2):
C汤姆 = 0.6·h(Tom) + 0.2·h(Chase) + 0.2·h(Jerry)

两组数都是书里原样给出的7——原书这两处本身就对不上:分布里 Chase 是 0.2,式 11-13 里 Chase 的系数却写成 0.1,系原书笔误;此处以分布为准、按 0.2 理解,「各取多少」的结论不受影响。「杰瑞」从 Jerry 那里取走一半,「汤姆」从 Tom 那里取走六成——每个目标词有自己的关注表,固定 C 变成了逐词变化的 C_i。书里强调,理解注意力模型的关键就这一句:C 换成了按当前输出词调整的 C_i8

那关注表本身怎么算?用解码器上一时刻的状态 Hi-1,与编码器每个输入词的状态 hj 逐一比对,过一个对齐函数 F(hj, Hi-1) 得原始分数,再 softmax 归一化成 0~1 的分布9。书里还给了这张表的两种物理读法:词对齐模型(翻译界本来就在研究「哪个源词对应哪个目标词」,注意力分布就是对齐概率)或影响力模型(每个输入词对当前输出有多大影响)10

4. 从蓝图到代码:带注意力的解码器

注意力不是一种,是一族:Soft/Hard/Global/Local/Self——书里一句话带过变体,本章只走 Soft(软性加权,处处可导)11。工程实现取典型的 Bahdanau 架构,解码器四层:嵌入层(词→向量)、注意力层(算能量分并归一化)、RNN 层、输出层12;关键三行代码13:

attn_weights = softmax(attn(last_hidden, encoder_outputs)) ← 算关注表
context = bmm(attn_weights, encoder_outputs) ← 加权求和成 C_i
rnn_input = cat(word_embedded, context) ← 词义+语境一起进 RNN

对照无注意力的朴素解码器:它只吃编码器最后的隐藏状态(所谓上下文向量),再不看别的14——瓶颈的代码形态一目了然。

5. 实战:中英翻译全流程与账本

数据是 eng-cmn.txt(Tab 分隔的英中句对),中文用 jieba 分词(把句子切成词);句子首尾加 SOS/EOS(起止符)表示开始与结束15。预处理后的账本很诚实:原始 21007 个句对,过滤长句后只剩 640 对;中文词表 1063 词、英文 808 词16——「玩具规模」,但这正是能在一章里跑完的意义。

训练配置:隐藏维 256,SGD 学习率 0.01,迭代 75000 次,耗时约 47 分钟。损失曲线:从 2.6447 一路降到 0.0094(前 20% 就降到 0.2 以下,之后是漫长打磨)17。随机抽测三句,译文与标准答案逐词一致18

最后是本章最值得看的产物:注意力可视化。解码时保留每步的注意力权重矩阵,用 matshow 画成热力图——输入「我们在严肃地谈论你的未来」,能看到输出每个英文词「盯着」哪个中文词,对角线附近最亮,语序差异处错位19注意力第一次变得肉眼可见:模型不是黑箱里的对齐,是一张能打印出来的表。

6. 作者的判断与证据

给了证据的: 概率分布 (0.3/0.2/0.5) 与 (0.6/0.2/0.2)、640 句对、loss 2.6447→0.0094、三句全对的译文,都是书里实际给出的数字与输出。

转述来源的: §1-§2 的框架讲解书里注明参考了张俊林的博客;Bahdanau 架构注明了提出者;这两处书里都标了出处,没有掠美。

作者的取舍: Hard/Local/Self 等变体「篇幅问题不展开」11——尤其是 Self-Attention,这页纸的省略让本书止步于 Transformer 门前(见边界)。

7. 边界与局限

  • 全书离 Transformer 一步之遥却没有迈过去。 Self-Attention(不设 RNN、让句子内部互相看)在书里只是变体清单里的一个名字;2017 年的 Attention Is All You Need 没有出现。读本书 NLP 部分,必须自觉接上这一章(补充(不在书里,来自通用知识):Transformer 即以 Self-Attention 为唯一序列机制,本书出版时已是主流)。

  • 640 句对训出的模型不可用——它只会「我週日哪裡也不去」这一档的简单句;真实翻译系统是亿级句对+子词(把词切成片段)切分。本章学的是机制,不是产品。

  • 解码没有讲集束搜索(beam search):实例用的是贪心逐步解码,真实系统的「保留多条候选」缺席。

  • 长句性能的提升没有给出量化(用具体数字横比)的对比——书只用「句子稍长就不尽如人意」描述瓶颈。

8. 可带走的

  1. 翻译=编码器压语义+解码器逐词生成;Encoder-Decoder 是摘要、对话共用的骨架;
  2. 固定语义向量 C 是长句瓶颈:「分心模型」对所有源词一视同仁;
  3. 注意力=每个目标词一张关注表(softmax 归一化的分布),按表加权取编码器各词的输出;C 变成逐词的 C_i;
  4. 注意力分布=词对齐概率=影响力,同一件事的三种读法;
  5. 实现三件套:算分数→softmax→加权求和(context),再与词嵌入(词的向量)拼接进 RNN;
  6. 训练这类模型先看数据规模账:21007 对过滤剩 640——玩具规模能跑通机制,不能出产品;
  7. 注意力矩阵可视化是调试翻译模型的第一工具:哪两个词对上了,一眼可见;
  8. 读到注意力就该知道下一站是 Transformer——书停在门口,门要自己推开。

9. 原文地图

主题原书章原文位置
NMT 与 Seq2Seq第11章 神经网络机器翻译实例text/12-ch11.txt:2(搜「NMT」) · text/12-ch11.txt:21(搜「Seq2Seq」)
C 与 yi 的定义第11章 神经网络机器翻译实例text/12-ch11.txt:44(搜「中间语义表示C」) · text/12-ch11.txt:45(搜「来生成i时刻要生成的单词」)
应用换皮第11章 神经网络机器翻译实例text/12-ch11.txt:20(搜「文本摘要」)
固定 C 的不足第11章 神经网络机器翻译实例text/12-ch11.txt:60(搜「相同的」) · text/12-ch11.txt:62(搜「不尽如人意」)
长句丢细节第11章 神经网络机器翻译实例text/12-ch11.txt:92(搜「丢失很多细节信息」)
Tom chase Jerry第11章 神经网络机器翻译实例text/12-ch11.txt:84(搜「Tom chase Jerry」)
注意力分布第11章 神经网络机器翻译实例text/12-ch11.txt:98(搜「0.3」)
C_i 加权合成第11章 神经网络机器翻译实例text/12-ch11.txt:125(搜「C汤姆」)
对齐函数与归一化第11章 神经网络机器翻译实例text/12-ch11.txt:159(搜「对齐函数」) · text/12-ch11.txt:163(搜「归一化」)
词对齐与影响力第11章 神经网络机器翻译实例text/12-ch11.txt:173(搜「单词对齐模型」) · text/12-ch11.txt:177(搜「影响力模型」)
变体一句话第11章 神经网络机器翻译实例text/12-ch11.txt:182(搜「Self Attention」)
Bahdanau 四层第11章 神经网络机器翻译实例text/12-ch11.txt:247(搜「Bahdanau」)
朴素解码器的上下文向量第11章 神经网络机器翻译实例text/12-ch11.txt:218(搜「上下文向量」)
注意力三行代码第11章 神经网络机器翻译实例text/12-ch11.txt:566(搜「attn_weights」) · text/12-ch11.txt:568(搜「bmm」)
数据与分词第11章 神经网络机器翻译实例text/12-ch11.txt:317(搜「eng-cmn.txt」) · text/12-ch11.txt:423(搜「SOS_token」)
数据规模账本第11章 神经网络机器翻译实例text/12-ch11.txt:475(搜「21007」) · text/12-ch11.txt:479(搜「1063」)
训练配置第11章 神经网络机器翻译实例text/12-ch11.txt:622(搜「hidden_size = 256」)
损失 2.64→0.0094第11章 神经网络机器翻译实例text/12-ch11.txt:630(搜「2.6447」) · text/12-ch11.txt:644(搜「0.0094」)
译文样例第11章 神经网络机器翻译实例text/12-ch11.txt:669(搜「anywhere」)
注意力可视化第11章 神经网络机器翻译实例text/12-ch11.txt:691(搜「matshow」) · text/12-ch11.txt:714(搜「严肃」)

Footnotes

  1. 出处:「第11章 神经网络机器翻译实例」第 51 段(text/12-ch11.txt:51,搜「通用」)与第 52 段(text/12-ch11.txt:52,搜「Deep LSTM」)。

  2. 出处:「第11章 神经网络机器翻译实例」第 44 段(text/12-ch11.txt:44,搜「中间语义表示C」)与第 45 段(text/12-ch11.txt:45,搜「来生成i时刻要生成的单词」)。

  3. 出处:「第11章 神经网络机器翻译实例」第 20 段(text/12-ch11.txt:20,搜「文本摘要」)。

  4. 出处:「第11章 神经网络机器翻译实例」第 62 段(text/12-ch11.txt:62,搜「不尽如人意」)与第 92 段(text/12-ch11.txt:92,搜「丢失很多细节信息」)。

  5. 出处:「第11章 神经网络机器翻译实例」第 87 段(text/12-ch11.txt:87,搜「贡献是相同的」)。

  6. 出处:「第11章 神经网络机器翻译实例」第 81 段(text/12-ch11.txt:81,搜「分心模型」)。

  7. 出处:「第11章 神经网络机器翻译实例」第 98 段(text/12-ch11.txt:98,搜「0.3」)与第 125 段(text/12-ch11.txt:125,搜「C汤姆」);式 11-13 里 Chase 的 0.1 系数见第 129 段(text/12-ch11.txt:129,搜「0.1*f2」)。

  8. 出处:「第11章 神经网络机器翻译实例」第 105 段(text/12-ch11.txt:105,搜「调整成加入注意力模型」)。

  9. 出处:「第11章 神经网络机器翻译实例」第 159 段(text/12-ch11.txt:159,搜「对齐函数」)与第 163 段(text/12-ch11.txt:163,搜「归一化」)。

  10. 出处:「第11章 神经网络机器翻译实例」第 173 段(text/12-ch11.txt:173,搜「单词对齐模型」)与第 177 段(text/12-ch11.txt:177,搜「影响力模型」)。

  11. 出处:「第11章 神经网络机器翻译实例」第 182 段(text/12-ch11.txt:182,搜「Self Attention」)。 2

  12. 出处:「第11章 神经网络机器翻译实例」第 247 段(text/12-ch11.txt:247,搜「Bahdanau」)。

  13. 出处:「第11章 神经网络机器翻译实例」第 566 段(text/12-ch11.txt:566,搜「attn_weights」)与第 568 段(text/12-ch11.txt:568,搜「bmm」)、第 557 段(text/12-ch11.txt:557,搜「attn_combine」)。

  14. 出处:「第11章 神经网络机器翻译实例」第 218 段(text/12-ch11.txt:218,搜「上下文向量」)。

  15. 出处:「第11章 神经网络机器翻译实例」第 317 段(text/12-ch11.txt:317,搜「eng-cmn.txt」)与第 423 段(text/12-ch11.txt:423,搜「SOS_token」)。

  16. 出处:「第11章 神经网络机器翻译实例」第 475 段(text/12-ch11.txt:475,搜「21007」)与第 479 段(text/12-ch11.txt:479,搜「1063」)。

  17. 出处:「第11章 神经网络机器翻译实例」第 630 段(text/12-ch11.txt:630,搜「2.6447」)与第 644 段(text/12-ch11.txt:644,搜「0.0094」)。

  18. 出处:「第11章 神经网络机器翻译实例」第 669 段(text/12-ch11.txt:669,搜「anywhere」)与第 681 段(text/12-ch11.txt:681,搜「he is very tall」)。

  19. 出处:「第11章 神经网络机器翻译实例」第 691 段(text/12-ch11.txt:691,搜「matshow」)与第 714 段(text/12-ch11.txt:714,搜「严肃」)。