从0训练LLM · 现代大模型体系 阅读+实验 ≈ 30 分钟 页内实验 ×1
C0 序章:为什么是 Transformer + 预测下一个词 第 3 课

输入一句、输出一句,长句为什么丢?

seq2seq 与注意力的诞生
2014 年的神经机器翻译把整句压进一个定长向量再解码,句子一长就掉分。同年 Bahdanau 让解码的每一步都回头看所有编码状态——注意力由此诞生,比 Transformer 早三年。

本课一问:输入一句、输出一句,长句为什么丢? 翻译时,模型先读完整句原文,再逐词写出译文。原文里的信息要经过什么通道,才能到达写译文的那一侧?

这一课先不碰:翻译系统的其余细节(词表、束搜索);Transformer(下一课);打分为什么后来改成点积(C3 的第 2 课)。

从已有出发

这一课把贯穿例句换个用法:「小明 把 苹果 给了 小王」当作要译成英文的原文。换成翻译的原因:「输入一句、输出另一句」最典型的任务就是翻译,注意力也是在翻译里诞生的。编码器读完这 5 个词,手里只剩最后一个状态;解码器写英文时,「小明」是谁、「苹果」给了谁,都只能从这一个向量里找。

L2 的 RNN 每读一个词更新一次状态。读完整句,最后一个状态就是它对整句的全部记录。2014 年的想法很自然:让一个 RNN 读原文(编码器),把最后的状态交给另一个 RNN 去写译文(解码器)。这个结构叫 seq2seq,也叫编码器-解码器。

从已有出发 · 累计数据流 点已学环节看形状与参数
解码层

流水线里「解码层」的注意力,就是从这一课的问题里长出来的。

先自己设计:整句压成一个向量

  1. ① 朴素方案
  2. ② 它在哪失败
  3. ③ 改进方案
朴素方案seq2seq:编码器把整句压成一个定长向量

编码器读完原文,只把最后一个状态交给解码器;解码器之后写的每一个词,关于原文的信息都只能从这一个向量里来。

  • Sutskever et al. 2014 用 4 层、每层 1000 个单元的 LSTM,原文说「用 8000 个实数表示一个句子」
  • Cho et al. 2014b 的分析:短句、没有生词时表现不错,句长和生词一增加,性能迅速下降
  • Bahdanau et al. 2014 的 Table 1:RNNencdec-50 全测试集 BLEU 17.82
🧭

一个类比,带着它的映射和失效点。 定长向量像一张明信片:整本书(原文)的内容要写在一张明信片(向量)上寄给译者。 精确映射:明信片的面积 = 向量的维数 d;要写的内容 = T 个词各自的信息;字越写越挤 = 不同词的信息在同一组数里互相串扰。 失效点:明信片上的字不能无限小,但实数的精度在数学上是无限的——一个实数原则上就能编码任意长的句子。真正的限制不是「写不下」,而是训练出来的网络学不会这么精细的编码,加上浮点精度有限。这也解释了为什么够大的状态加上好的优化技巧能把问题往后推(下面的误解),却推不掉。

⚠

常见误解:「seq2seq 一遇长句就崩。」 没那么绝对。Sutskever et al. 2014 的深层 LSTM(8000 个数)把原文倒过来输入之后,原文说它在很长的句子上也没有吃亏;倒序本身让测试困惑度从 5.8 降到 4.7、BLEU 从 25.9 升到 30.6 。但这恰恰说明问题所在:模型要靠人为制造短依赖才学得动。「定长向量是瓶颈」是 Bahdanau 提出的猜想,由 Cho 2014b 和他们自己的实验支持,不是定理。

改进到注意力:每写一个词,都回头看一遍原文

Bahdanau et al. 2014 给出的做法有三步,每一步都是可以训练的:

Bahdanau 注意力(加性打分)
= + ), ci = Σj αij
👆 公式里带下划线的每一项都可以点——点哪项,讲哪项。
原文把这一步叫「对齐」:权重 α 画成矩阵,就是原文词和译文词之间的软对应关系(原文图 3)。模型没被告诉哪个词对哪个词,对齐是从翻译 loss 里学出来的。

和定长向量相比,变化只有一处却是根本性的:记忆的大小从 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 个数,装得下多少个词?

算法模拟器 · 定长向量 vs 保留全部 + 注意力(教学构造,浏览器里现算)
定长向量的维度 d
句长 T =
■ 压成一个 d 维向量 ■ 保留全部 T 个状态 + 注意力读回 · 同一组词向量、同一批句子;虚线 = 90%。
解码第 个词时,注意力分给每个位置的权重(真 softmax)

教学构造:随机词向量与 ±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)。真实翻译模型随句长退化的证据,看 Cho 2014b 的摘要与 Bahdanau 2014 的 Table 1 与图 2,不要拿这个模拟器的百分比当真实翻译的数字。

证据三问

问本课的回答(以注意力为例)
① 它解决什么问题?解码器只能从一个压缩向量里取原文信息,句子越长越难
② 数学上为什么可能有效?记忆随原文长度增长,每一步按相关度加权取回,不再要求「压进去」
③ 实验上为什么被选中?同样的数据和训练句长下 BLEU 从 17.82 提到 26.75,长句不再掉分

本课每条结论的证据等级:

结论证据等级依据
线性叠加进 d 个数,可靠读回的长度与 d 成正比可证明 线性代数;模拟器实算
编码器-解码器随句长退化实验验证 Cho 2014b;Bahdanau 图 2
定长向量是瓶颈理论动机 Bahdanau 2014
注意力提升翻译质量、对句长稳健实验验证 Bahdanau 2014
倒序原文能提分实验验证 Sutskever 2014

一句话

📌

把整句压进一个定长向量,句子越长丢得越多;注意力让解码的每一步都回头看所有编码状态。

🚦

先停在这里:记住「定长向量 → 注意力回看全部状态」和 17.82 → 26.75 这组数,进 L4。
再深一层:展开「这个模拟器演示的是什么、不是什么」的 Dig,再读 Bahdanau 原文 §1 与 Table 1。

下一个缺口

注意力已经能从原文任意位置直接取信息,而且取得比「状态一路传下来」更准。可编码器和解码器仍然是 RNN:算 ht 必须先等 ht−1。如果只留注意力,把循环整个删掉,行不行? → L4 · 只留注意力,行不行

你可能会问

这一课还没有真实提问记录。先列几个最常见的: