跳到主要内容

序列与注意力 — RNN 的困境和解法

这一章讲三件事: 网络怎么「记住」上文,为什么记不长;LSTM 的三扇门 各自把住哪一关;注意力怎么用一个加权平均拆掉「整句压成一个向量」的信息瓶颈。 这一章是第 10 章 Transformer 的直接前置——Transformer 的每个零件都为了 替换这一章的某个部件而生。

1. 这一章讲什么

第二篇开局,书里给语言下了判词:难点在「人类语言的歧义性、可变性以及病态性」, 而且语言是符号、计算机只认数字1。处理语言的数据有个图像没有的特点: 词是一个接一个来的,而且前面的词决定后面的词。能把「先后」学进去的网络 才有资格处理它——这是 RNN;记性不够好——这是 LSTM;整句压扁太亏——这是注意力。 三层递进,一节一层。

2. 顶层全景:从「记」到「挑」

RNN: x1 → [h1] → x2 → [h2] → … (上一刻的记忆 h 喂回下一刻)
LSTM: 同上,但 h 旁边加一条「传送带」,三扇门控制进出
编码器-解码器: 整句 → 压成一个向量 c → 逐词翻译 ← 瓶颈在这里
注意力: 整句 → 一串特征 → 每个译词自己挑着用 ← 瓶颈被拆掉

图说:本章的推理链。「挑」的具体动作就是本章的主走查——六步加权平均。

3. 核心原理

3.1 RNN:会记,但记不长

RNN 的全部秘密就一句话:把上一刻的内部状态——网络对上文的记忆**(一串数,读过的内容都被概括在里面)——作为这一刻的输入**。 书里的表述:「RNN 在 t 时间片时会将 t − 1 时间片的隐层节点状态作为当前时间片的输入」2 ——于是这个状态有了双重身份:既用来算当前的输出,又要传给下一刻3。传统网络 每层只看当前输入,RNN 靠这一点拿到了「上文感」。

但记性有价。两个病:

长期依赖。 书里的例子一读就懂:「The cat, which already ate a bunch of food, was full」——想判断系动词用 was 还是 were,得回头看第一个词是 cat 还是 cats;可 RNN 读到 句尾时,「更关注的可能是距离其更近的 food,而非若干个时间片之前的 cat」4。 记忆被一路冲刷,最初的线索到不了终点。

梯度消失与爆炸。 病根同第 01 章,但更棘手:RNN 每个时间片用的是同一套权重表(把所有权重摆成一张大总表,行话叫权值矩阵)——「相同函数的多次组合会导致极端的非线性行为」,梯度要么爆要么没5

爆炸好办——梯度截断,超过界限(术语叫阈值)就手动压回去6;消失难办——不能把小梯度 放大来凑合,因为句中段的小梯度恰恰是「别乱改记忆」的合理要求,硬放大等于拆掉 长期依赖本身7

3.2 LSTM:三扇门,一条传送带

LSTM(1997 年提出)的解法:在 RNN 旁边加一条自始至终贯通的单元状态——书里 形容为传送带8;再装三扇来控制传送带上特征的「流通和损失」9。 门就是一个 0 到 1 的开关向量(sigmoid 输出),第 03 章见过它的雏形,这里成套登场:

管什么直觉
遗忘门上一刻记忆里哪些该擦掉「猫的性别要记住,food 可以忘」
输入门这一时刻的新信息哪些写进记忆「这是关键线索,写入」
输出门记忆里哪些此刻要拿出来用「现在要决定单复数,取出 cat 的记录」

(门的定义与三个名字见10。)一个耐人寻味的观察:训练好的 LSTM 里,门的值 「绝大多数都非常接近 0 或者 1」——名义上是旋钮,实际上全是开关11。 书里还转述了一个实用偏方:把输出门的偏置均值初始化为 1,LSTM 就能达到接近 GRU 的效果12

GRU 是 LSTM 的减配版:两扇门搞定。重置门决定「过去的记忆对当前还剩多少影响」, 更新门决定「新状态里新旧各占多少」——更新门拉满时 ht=ht−1,「相当于残差网络的捷径」 (第 03 章的直通道道在时间轴上复现)13。哪个好?书里转述了一场大混战: 收集 100 个变体、再变异出一万个,在四类数据(文字串、结构化文档、语言、音频)上打擂台—— 结论:GRU、LSTM 就是最好的两个;GRU 除语言模型外全面胜出;重要性排序是 「遗忘门 > 输入门 > 输出门」14——忘什么,比记什么更要紧

3.3 翻译的经典框架:读的一边与写的一边

机器翻译的经典框架分两半。编码器就是负责读的那一半:把输入句子读成一串 内部表示,并压缩成一个固定长度的向量15

解码器就是负责写的那一半:拿这个向量逐词写出译文。Sutskever 的 seq2seq 更极端:只把 编码器最后一个时间片的输出交给解码器16。句子一长就穿帮:书里画了长度 64 的序列示意——「这种方式无疑会遗忘大量前面时间片的特征」17。一根水管灌整本书,水量不够。

3.4 主走查:注意力的六步计算

Bahdanau 的破局思路:解码器每写一个词,允许回头看原文的全部特征,自己挑要用的; 顺带把「对齐」——原文词与译文词的对应关系——也一并学了出来,而不再是翻译的副产品。 书里的原话:模型「可以同时学习原句子和目标句子的对齐关系和翻译关系」18。编码器也升级成双向 (正着读一遍、反着读一遍,每个位置同时带上左右文)19

书里把「挑」的动作拆成六步,并配了具体数字——这就是本章的主走查。设解码器当前状态 是 [10, 5, 10],编码器给出四个位置的特征(数字全部来自原书图 4.18~4.21 的示例)20:

① 生成编码节点:四个位置各有一份特征
② 打分(点乘):特征·解码器状态
[0,1,1] → 0×10+1×5+1×10 = 15
[5,0,1] → 5×10+0×5+1×10 = 60 ← 最高分
[1,1,0] → 15
[0,5,1] → 35
③ softmax 归一化:15/60/15/35 → 0/1/0/0
(书里特意注明:真实场景是 0 到 1 之间的小数,这里取整便于看)[^guize]
④ 加权:每个特征乘自己的得分 → [0,0,0]、[5,0,1]、[0,0,0]、[0,0,0]
⑤ 求和:得「内容向量」= [5,0,1] —— 一个为当前译词定制的原文摘要
⑥ 喂给解码器;下一词重复①~⑤,且「注意力的结果会随着解码器状态的改变而更改」[^genggai]

直觉翻译:第二步是「打相似分」,第三步把分数变成「注意力预算」,四、五步按预算 把原文信息拼成一句定制摘要。这套动作书里叫它对齐模型21;按作用范围分, 全句都看的叫全局注意力,只看局部的叫局部注意力22。打分函数不止点乘一种, 书里的汇总表列了从「基于内容相似度」到「缩放点乘」的六种23——最后一个正是 第 10 章 Transformer 用的那个。

三个经典翻译系统的配置也值得抄录(数字为各自论文的 BLEU 值,BLEU 是翻译质量的 标准评分,越高越好):Bahdanau 模型(双向 GRU+相加式打分)26.75;Luong 模型 (双层 LSTM+多种打分)25.9;GNMT(8 层 LSTM、首层双向、层层带残差)英法 38.9524

判断(我们的,不是书里的): 这一章埋着全书的机制总纲——「门」与「注意力」 是同一个思想的两副面孔:都是学出一组 0~1 的权重,决定信息去留。LSTM 把它装在 时间轴上(记什么忘什么),SENet 装在通道上(听谁的),第 10 章的 Transformer 把它装在位置之间(看谁),Dropout 装在节点上(留谁)。认出这个模式,后面两篇 的新名词会省一半力气。 如果错,会错在: 如果某类权重必须有负值或超出 01(比如允许「反相关」), 门与注意力的统一就只是形似;但书里出现的全部实例确实都落在 01 区间内。

4. 作者的判断与证据

书里给了实验证据的: Jozefowicz 等人的一万个变体大混战(转述,含四类任务与 重要性排序);Bahdanau/Luong/GNMT 的 BLEU 数字(转述论文);动态测试、稀有类合并 等 RNN 语言模型的训练技巧(下一章开头还会用到)。

书里署名的取舍: 主走查那套得分取整成 0/1,书里自己注明「其实不是很符合真实情况」 ——教学优先于真实,这个坦白本身就值得学25

5. 边界与局限

  • RNN 按时间片顺序计算,t 依赖 t−1,并行不了——这是第 10 章 Transformer 起义的直接理由,本章先按下不表;
  • LSTM 的门救的是「梯度别消失」,记性上限仍在:书里下一章给的数量级是约 200 个 时间片,离「几千个时间片」的任务还差得远;
  • 注意力拯救了编码器-解码器,但解码器仍是逐词的循环结构——翻译必须一个词一个词 顺序生成,快不起来。

6. 可带走的

  1. 「把上一刻的状态喂回这一刻」是网络获得时间感的全部原理;代价是同一套权值连乘;
  2. 长期依赖的检查方法:找一个「线索在句首、验证在句尾」的句子(cat/cats 式)喂给模型;
  3. LSTM 三扇门的分工:擦旧、写新、取用;训练后门几乎都退化为开关;
  4. 重要性排序「遗忘门 > 输入门 > 输出门」——对抗记忆冲刷比囤积信息更要紧;
  5. 更新门拉满等于时间轴上的残差捷径:GRU 是 LSTM 与 ResNet 的中间形态;
  6. 编码器-解码器的瓶颈在「整句压一个向量」;注意力把它换成「每步定制摘要」;
  7. 注意力六步:打分→归一化→加权→求和,本质是按相似度做的软查询—— 第 10 章的 Q、K、V 就是给这四步起的名字。

7. 原文地图

主题原书节原文位置
RNN 结构与状态的双重身份4.1.1 序列模型的背景text/09-p161-180.txt:262(搜「隐层节点状态作为当前时间片的输入」) · text/09-p161-180.txt:274(搜「两个作用」)
长期依赖(cat/cats 例子)4.1.1 序列模型的背景text/09-p161-180.txt:284(搜「was full」) · text/09-p161-180.txt:293(搜「距离其更近的 food」)
梯度消失/爆炸与截断4.1.1 序列模型的背景text/09-p161-180.txt:301(搜「循环相乘」) · text/09-p161-180.txt:305(搜「梯度截断」) · text/09-p161-180.txt:310(搜「失去解决长期依赖问题的能力」)
LSTM 传送带与三门4.1.2 LSTMtext/09-p161-180.txt:323(搜「gate」) · text/09-p161-180.txt:338(搜「传送带」) · text/09-p161-180.txt:343(搜「非常接近 0 或者 1」)
输入门、输出门与偏置偏方4.1.2 LSTMtext/09-p161-180.txt:349(搜「输入门」) · text/09-p161-180.txt:357(搜「均值初始化为 1」)
GRU 两门4.1.3 GRUtext/09-p161-180.txt:372(搜「重置门」) · text/09-p161-180.txt:381(搜「相当于残差网络的捷径」)
一万个变体的结论4.1.4 其他 LSTMtext/09-p161-180.txt:394(搜「10 000 个新的模型」) · text/09-p161-180.txt:400(搜「门的重要性排序」)
编码器-解码器瓶颈4.2 / 4.2.2text/09-p161-180.txt:468(搜「序列到序列模型」) · text/09-p161-180.txt:477(搜「大量前面时间片的特征」)
注意力动机与对齐4.2 注意力机制text/09-p161-180.txt:412(搜「非常不理想」) · text/09-p161-180.txt:417(搜「对齐关系和翻译关系」) · text/09-p161-180.txt:425(搜「双向 RNN」)
主走查:六步与具体得分4.2.2 图解注意力机制text/09-p161-180.txt:520(搜「10x0 + 5x1 + 10x1」) · text/10-p181-200.txt:5(搜「介于 0 和 1 之间」) · text/10-p181-200.txt:39(搜「内容向量」) · text/10-p181-200.txt:42(搜「改变而更改」)
对齐模型、全局/局部4.2.2 图解注意力机制text/09-p161-180.txt:493(搜「对齐模型」) · text/09-p161-180.txt:495(搜「全局注意力」)
打分函数汇总4.2.3 经典注意力模型text/10-p181-200.txt:67(搜「缩放点乘」)
三个经典系统4.2.3 经典注意力模型text/10-p181-200.txt:85(搜「26.75」) · text/10-p181-200.txt:104(搜「38.95」)

Footnotes

  1. 出处:「第二篇 自然语言处理(篇首)」(text/09-p161-180.txt:241,搜「病态性」)。

  2. 出处:「4.1.1 序列模型的背景」(text/09-p161-180.txt:262,搜「隐层节点状态作为当前时间片的输入」)。

  3. 出处:「4.1.1 序列模型的背景」(text/09-p161-180.txt:274,搜「两个作用」)。

  4. 出处:「4.1.1 序列模型的背景」(text/09-p161-180.txt:291,搜「单复数情况」)与(text/09-p161-180.txt:293,搜「距离其更近的 food」)。

  5. 出处:「4.1.1 序列模型的背景」(text/09-p161-180.txt:301,搜「循环相乘」)。

  6. 出处:「4.1.1 序列模型的背景」(text/09-p161-180.txt:305,搜「梯度截断」)。

  7. 出处:「4.1.1 序列模型的背景」(text/09-p161-180.txt:310,搜「失去解决长期依赖问题的能力」)。

  8. 出处:「4.1.2 LSTM」(text/09-p161-180.txt:338,搜「传送带」)。

  9. 出处:「4.1.2 LSTM」(text/09-p161-180.txt:323,搜「gate」)。原文:「LSTM 引入了门(gate)机制用于控制特征的流通和损失」。

  10. 出处:「4.1.2 LSTM」(text/09-p161-180.txt:341,搜「遗忘门」)、(text/09-p161-180.txt:349,搜「输入门」)与(text/09-p161-180.txt:356,搜「输出门」)。

  11. 出处:「4.1.2 LSTM」(text/09-p161-180.txt:343,搜「非常接近 0 或者 1」)。

  12. 出处:「4.1.2 LSTM」(text/09-p161-180.txt:357,搜「均值初始化为 1」)。

  13. 出处:「4.1.3 GRU」(text/09-p161-180.txt:381,搜「相当于残差网络的捷径」)。

  14. 出处:「4.1.4 其他 LSTM」(text/09-p161-180.txt:397,搜「表现最好的模型」)与(text/09-p161-180.txt:400,搜「门的重要性排序」)。

  15. 出处:「4.2 注意力机制」(text/09-p161-180.txt:407,搜「编码器」)与(text/09-p161-180.txt:470,搜「解码器的作用」)。

  16. 出处:「4.2.2 图解注意力机制」(text/09-p161-180.txt:473,搜「Sequence to Sequence」)。

  17. 出处:「4.2.2 图解注意力机制」(text/09-p161-180.txt:477,搜「大量前面时间片的特征」)。

  18. 出处:「4.2 注意力机制」(text/09-p161-180.txt:417,搜「对齐关系和翻译关系」)。

  19. 出处:「4.2.1 机器翻译的注意力机制」(text/09-p161-180.txt:425,搜「双向 RNN」)。

  20. 出处:「4.2.2 图解注意力机制」(text/09-p161-180.txt:516,搜「10, 5, 10」)与(text/09-p161-180.txt:520,搜「10x0 + 5x1 + 10x1」)。②③④⑤步的具体数字分别见 text/09-p161-180.txt:516-523text/10-p181-200.txt:9-39

  21. 出处:「4.2.2 图解注意力机制」(text/09-p161-180.txt:493,搜「对齐模型」)。

  22. 出处:「4.2.2 图解注意力机制」(text/09-p161-180.txt:495,搜「全局注意力」)。

  23. 出处:「4.2.3 经典注意力模型」(text/10-p181-200.txt:53,搜「常用的注意力得分计算方式」)。

  24. 出处:「4.2.3 经典注意力模型」(text/10-p181-200.txt:85,搜「26.75」)、(text/10-p181-200.txt:94,搜「25.9」)与(text/10-p181-200.txt:104,搜「38.95」)。

  25. 出处:「4.2.2 图解注意力机制」(text/10-p181-200.txt:5,搜「不是很符合真实情况」)。