输入一句、输出一句,长句为什么丢?
本课一问:输入一句、输出一句,长句为什么丢? 翻译时,模型先读完整句原文,再逐词写出译文。原文里的信息要经过什么通道,才能到达写译文的那一侧?
这一课先不碰:翻译系统的其余细节(词表、束搜索);Transformer(下一课);打分为什么后来改成点积(C3 的第 2 课)。
从已有出发
这一课把贯穿例句换个用法:「小明 把 苹果 给了 小王」当作要译成英文的原文。换成翻译的原因:「输入一句、输出另一句」最典型的任务就是翻译,注意力也是在翻译里诞生的。编码器读完这 5 个词,手里只剩最后一个状态;解码器写英文时,「小明」是谁、「苹果」给了谁,都只能从这一个向量里找。
L2 的 RNN 每读一个词更新一次状态。读完整句,最后一个状态就是它对整句的全部记录。2014 年的想法很自然:让一个 RNN 读原文(编码器),把最后的状态交给另一个 RNN 去写译文(解码器)。这个结构叫 seq2seq,也叫编码器-解码器。
流水线里「解码层」的注意力,就是从这一课的问题里长出来的。
先自己设计:整句压成一个向量
- ① 朴素方案
- ② 它在哪失败
- ③ 改进方案
编码器读完原文,只把最后一个状态交给解码器;解码器之后写的每一个词,关于原文的信息都只能从这一个向量里来。
- Sutskever et al. 2014 用 4 层、每层 1000 个单元的 LSTM,原文说「用 8000 个实数表示一个句子」 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条4 层 × 1000 单元,隐藏状态与细胞状态合计 8000 个数;在 WMT'14 英法上 5 个模型集成 BLEU 34.8。 出处Sutskever et al. 2014 §3.4 ↗需联网
- Cho et al. 2014b 的分析:短句、没有生词时表现不错,句长和生词一增加,性能迅速下降 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条《On the Properties of Neural Machine Translation》,比较了 RNN 编码器-解码器与门控递归卷积网络。 出处Cho et al. 2014b · 摘要 ↗需联网
- Bahdanau et al. 2014 的 Table 1:RNNencdec-50 全测试集 BLEU 17.82
不再只交最后一个状态。编码器每个位置的状态 h1…hT 全部留着;解码器每写一个词,先给所有 hj 打分,softmax 成权重,加权求和得到这一步专用的「上下文向量」。
同一张表里,带注意力的 RNNsearch-50 全测试集 BLEU 26.75;原文还说它「在 50 词以上的句子上也没有性能下降」 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条同一数据、同一最大训练句长 50;RNNsearch-30 甚至超过 RNNencdec-50(21.50 对 17.82)。 出处Bahdanau et al. 2014 · Table 1 与 §5.2.1 ↗需联网 。
一个类比,带着它的映射和失效点。 定长向量像一张明信片:整本书(原文)的内容要写在一张明信片(向量)上寄给译者。 精确映射:明信片的面积 = 向量的维数 d;要写的内容 = T 个词各自的信息;字越写越挤 = 不同词的信息在同一组数里互相串扰。 失效点:明信片上的字不能无限小,但实数的精度在数学上是无限的——一个实数原则上就能编码任意长的句子。真正的限制不是「写不下」,而是训练出来的网络学不会这么精细的编码,加上浮点精度有限。这也解释了为什么够大的状态加上好的优化技巧能把问题往后推(下面的误解),却推不掉。
常见误解:「seq2seq 一遇长句就崩。」 没那么绝对。Sutskever et al. 2014 的深层 LSTM(8000 个数)把原文倒过来输入之后,原文说它在很长的句子上也没有吃亏;倒序本身让测试困惑度从 5.8 降到 4.7、BLEU 从 25.9 升到 30.6 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条作者的解释:倒序后原文开头的词离译文开头的词很近,引入了大量短距离依赖,优化变容易。 出处Sutskever et al. 2014 §3.3 ↗需联网 。但这恰恰说明问题所在:模型要靠人为制造短依赖才学得动。「定长向量是瓶颈」是 Bahdanau 提出的猜想,由 Cho 2014b 和他们自己的实验支持,不是定理。
改进到注意力:每写一个词,都回头看一遍原文
Bahdanau et al. 2014 给出的做法有三步,每一步都是可以训练的:
和定长向量相比,变化只有一处却是根本性的:记忆的大小从 d 个数变成了 T × d 个数,随原文长度增长。解码器不再需要从一个压缩摘要里「还原」原文,每一步直接去原文对应的位置取。
常见误解:「注意力是 Transformer 发明的。」 注意力出自 Bahdanau, Cho & Bengio 2014(arXiv 1409.0473),比 Transformer 早将近三年;2017 年的 Transformer 论文自己也把它列为参考文献 [2]。Transformer 的新意在别处——下一课。「对我新」不等于「对领域新」。
常见误解:「定长向量再大一点就行。」 维度加倍,能可靠装下的句长大约也只加倍——容量随 d 线性增长,而句子(和今天的上下文)没有上限。下面实验台里「跌破 90% 的句长」那张表就是这条关系。注意力让记忆随输入一起长,从根上绕开了「压进去」这一步。
还剩一个问题:它仍然建在 RNN 上。 编码器要一步一步读完原文才能得到 h1…hT,解码器也要一步一步写。注意力已经负责了「从任意位置取信息」——那 RNN 还在干什么?下一课。
现代做法:注意力被完整保留下来,打分从加性换成了点积、每层有很多个头、Q/K/V 各有投影——这些是 C3 的主线。锚点模型每一个全注意力层,都是这一课这三步的直系后代。
极小真数字:d 个数,装得下多少个词?
教学构造:随机词向量与 ±1 位置钥匙(种子固定),准确率在你的浏览器里现算,不是训练出来的翻译模型。它演示的是「d 个数装得下多少」这条数学事实;真实编码器随句长退化的证据见 Cho 2014b 与 Bahdanau 2014。
试三件事: ① 保持 d = 64,把句长 T 从 1 慢慢拖到 16:「压成一个向量」的读回准确率一路往下掉,「保留全部 + 注意力」那条线纹丝不动。 ② 依次点 d = 32、64、128、256,看下面那张「跌破 90% 的句长」表:d 翻倍,能可靠装下的句长大约也只翻倍——容量随 d 线性增长。 ③ 拖动「解码第几个词」:注意力几乎把全部权重放在目标位置上;同一句用定长向量读回,和真词向量的余弦远小于 1。
🔍 这个模拟器演示的是什么、不是什么
它是教学构造:词向量和位置钥匙都是固定种子的随机向量,「压成一个向量」用的是逐元素相乘后相加(一种线性编码),不是训练出来的 LSTM。它演示的是一条数学事实——把 T 个 d 维向量线性叠加进 d 个数,读回时的串扰随 T/d 增长,所以能可靠读回的句长与 d 成正比。「保留全部」一侧假定解码器已经学会该看哪个位置;真实模型的对齐要从数据里学出来(Bahdanau 原文图 3)。证据三问
| 问 | 本课的回答(以注意力为例) |
|---|---|
| ① 它解决什么问题? | 解码器只能从一个压缩向量里取原文信息,句子越长越难 |
| ② 数学上为什么可能有效? | 记忆随原文长度增长,每一步按相关度加权取回,不再要求「压进去」 证据等级 · 有理论动机 有数学或机制上的理由说明它可能有效,但没有证明它一定更好。最后是否采用,仍然要看实验。 本条原文称之为猜想。 出处Bahdanau et al. 2014 §1 ↗需联网 |
| ③ 实验上为什么被选中? | 同样的数据和训练句长下 BLEU 从 17.82 提到 26.75,长句不再掉分 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条英法翻译,其数据上。 出处Bahdanau et al. 2014 Table 1 ↗需联网 |
本课每条结论的证据等级:
| 结论 | 证据等级 | 依据 |
|---|---|---|
| 线性叠加进 d 个数,可靠读回的长度与 d 成正比 | 可证明 证据等级 · 数学可证明 在写明的前提下可以严格推导出来,不依赖实验。只要前提成立,换数据、换规模仍然成立。 本条随机向量串扰的方差随 T/d 增长;线性读出下 d 维空间最多容纳 d 个独立分量。 出处待补 | 线性代数;模拟器实算 |
| 编码器-解码器随句长退化 | 实验验证 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条只在其翻译数据与模型上。 出处Cho et al. 2014b ↗需联网 | Cho 2014b;Bahdanau 图 2 |
| 定长向量是瓶颈 | 理论动机 证据等级 · 有理论动机 有数学或机制上的理由说明它可能有效,但没有证明它一定更好。最后是否采用,仍然要看实验。 本条原文用的词是「猜想」;Sutskever 的大状态 + 倒序在长句上表现不差,说明它不是硬上限。 出处Bahdanau et al. 2014 §1 ↗需联网 | Bahdanau 2014 |
| 注意力提升翻译质量、对句长稳健 | 实验验证 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条RNNsearch-50 26.75 对 RNNencdec-50 17.82(全测试集 BLEU)。 出处Bahdanau et al. 2014 Table 1 ↗需联网 | Bahdanau 2014 |
| 倒序原文能提分 | 实验验证 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条PPL 5.8 → 4.7,BLEU 25.9 → 30.6。 出处Sutskever et al. 2014 ↗需联网 | Sutskever 2014 |
一句话
把整句压进一个定长向量,句子越长丢得越多;注意力让解码的每一步都回头看所有编码状态。
先停在这里:记住「定长向量 → 注意力回看全部状态」和 17.82 → 26.75 这组数,进 L4。
再深一层:展开「这个模拟器演示的是什么、不是什么」的 Dig,再读 Bahdanau 原文 §1 与 Table 1。
下一个缺口
注意力已经能从原文任意位置直接取信息,而且取得比「状态一路传下来」更准。可编码器和解码器仍然是 RNN:算 ht 必须先等 ht−1。如果只留注意力,把循环整个删掉,行不行? → L4 · 只留注意力,行不行
你可能会问
这一课还没有真实提问记录。先列几个最常见的:
- 为什么是加性打分?点积不行吗? 打分函数不止一种;Transformer 选了点积,原因之一是一次矩阵乘就能算完全部配对。完整的比较在 C3 · 注意力 的第 2 课。
- hj 既用来打分又被取回,有问题吗? 这正是后来要拆成 K 和 V 的原因——C3 第 1 课。
- 对齐矩阵真的像人工对齐吗? 原文图 3 画了几个例子,英法语序不同处(例如形容词位置)权重会斜着走;但它是从翻译 loss 里学出来的软权重,不保证和人工对齐一致。