AI / NLP / Architecture
Transformer 原论文重读它真正消除的不是顺序,而是训练中的递归依赖
论文:Ashish Vaswani 等,Attention Is All You Need,NeurIPS 2017,arXiv:1706.03762。本文以 arXiv v7 为准。
图 0:Transformer 的关键变化不是把序列变成“无序集合”,而是把必须沿时间步传递的递归链,改造成可以用矩阵并行计算的全局关系。
0. 先纠正标题带来的第一个误解
“Attention Is All You Need”很容易被理解成:Transformer 里只剩下 Attention,其他东西都不需要了。
原论文实际表达得更窄,也更具体。它移除的是序列建模中的两类主干结构:
- 不再用 RNN / LSTM 沿位置逐步传递隐藏状态;
- 不再用 CNN 通过局部卷积逐层扩大感受野。
但 Transformer 仍然包含词元嵌入、位置编码、前馈网络、残差连接、Layer Normalization、线性映射和 Softmax。解码器在推理时也仍然是自回归的:前一个词没生成出来,下一个词就没有完整输入。
所以这篇论文真正完成的重构是:
把“序列关系必须沿时间一步步传递”改写成“序列中任意位置可以直接计算彼此关系”。
这既缩短了远距离信息的传播路径,也让训练阶段的大量计算能够一次打包成矩阵运算。
1. Transformer 到底在处理什么
论文的主要任务是机器翻译。输入是一串源语言词元:
x1, x2, x3, ... xn
输出是另一串目标语言词元:
y1, y2, y3, ... ym
每个离散词元先通过 Embedding 变成一个长度为 d_model 的向量。Transformer base 使用 d_model = 512。编码器读取整条输入序列,输出每个位置的上下文化表示;解码器读取编码结果和已经生成的目标前缀,预测下一个词元。
这里有两个不能混淆的层次:
- 序列位置之间如何交换信息:这是 Self-Attention 要解决的问题。
- 目标序列如何逐步生成:原论文仍使用 Autoregressive Decoding。
Transformer 改写了第一层,没有在这篇论文里消灭第二层。
2. RNN 和 CNN 真正卡在哪里
2.1 RNN:信息和计算都被锁在一条时间链上
RNN 在位置 t 的隐藏状态依赖 t-1:
h1 -> h2 -> h3 -> ... -> hn
这条链有两个问题。
第一,训练同一个样本时,很难同时计算所有位置。即使 GPU 有大量并行算力,也必须等前一个隐藏状态产生以后再算下一个。
第二,两个相距很远的词之间需要经过很多步才能交换信息。前向信号和反向梯度都要穿过一条长路径。
2.2 CNN:可以并行,但远距离关系需要堆层
卷积能够同时处理不同位置,但一次卷积只看局部窗口。两个远距离位置要建立联系,需要不断堆叠卷积层,或者使用扩张卷积。它解决了顺序计算,却没有让任意两点直接相连。
2.3 Self-Attention:一层直接连接所有位置
论文用三个指标比较不同层:
| 层类型 | 每层复杂度 | 最少顺序操作 | 最大路径长度 |
|---|---|---|---|
| Self-Attention | O(n²d) | O(1) | O(1) |
| Recurrent | O(nd²) | O(n) | O(n) |
| Convolutional | O(knd²) | O(1) | O(log_k n) |
Self-Attention 的优势不是“计算量永远更低”。它的核心优势是顺序操作数和最大路径长度都变成常数;代价是注意力矩阵对序列长度 n 呈平方增长。论文也明确说,当 n < d 时 Self-Attention 通常比 Recurrent Layer 更快,这在当时的机器翻译句子表示中常见,但不能外推成“任意长度都更便宜”。
图 1:RNN 必须沿位置顺序传递,CNN 通过堆层连接远距离位置,Self-Attention 则在一层内让任意位置直接建立关系。
3. 一次 Attention 到底在算什么
Attention 接收三组向量:Query、Key、Value。
- Query / 查询:当前位置正在寻找什么信息。
- Key / 键:每个候选位置用什么特征接受匹配。
- Value / 值:匹配成功后,真正被取回并汇总的内容。
对一个 Query,模型先与所有 Key 做点积,得到匹配分数;分数除以 √d_k 后经过 Softmax,变成总和为 1 的权重;最后用这些权重对 Value 加权求和:
Attention(Q, K, V) = softmax(QKᵀ / √d_k) V
为什么要除以 √d_k?论文的解释是:当向量维度增大,点积的幅度也会变大,Softmax 更容易进入梯度极小的饱和区域。缩放不是装饰,它是在保持点积计算高效的同时,控制数值尺度。
图 2:Query 与 Key 决定“看哪里”的权重,权重再决定如何汇总 Value;√d_k 缩放用于避免高维点积把 Softmax 推入饱和区。
4. 为什么一个 Attention Head 还不够
单头 Attention 最终会把多个位置的 Value 压成一次加权平均。不同关系可能在同一个表示空间里互相干扰。
Multi-Head Attention 的做法不是把同一张注意力图复制多遍,而是:
- 用不同的可学习矩阵分别投影 Q、K、V;
- 在多个表示子空间中并行计算 Attention;
- 拼接所有 Head 的输出;
- 再经过一次输出投影
W^O。
Transformer base 使用 8 个 Head,每个 Head 的 d_k = d_v = 64,合起来仍对应 d_model = 512。由于每个 Head 的维度被缩小,多头版本的总计算量与一个完整维度的单头 Attention 接近。
论文的消融也说明“Head 越多越好”并不成立:单头在开发集上比最佳设置低约 0.9 BLEU,但增加到 32 个 Head 时质量同样下降。Multi-Head 的价值是提供多个表示子空间,不是无限堆数量。
图 3:不同 Head 使用各自学习到的 Q、K、V 投影寻找关系,随后拼接并统一投影;它们不是同一张注意力图的简单副本。
5. 没有循环以后,模型怎么知道词序
Self-Attention 本身对输入排列没有天然的先后概念。如果把词元位置交换,单靠 Attention 无法知道哪个词原本在前、哪个在后。
Transformer 的处理方式很直接:把 Positional Encoding 与 Token Embedding 相加,再送入编码器或解码器。
模型输入 = Token Embedding + Positional Encoding
原论文使用不同频率的正弦和余弦函数,让每个位置得到一组确定的波形编码。作者选择它,是因为他们推测固定偏移的位置关系可能更容易被线性变换表达,也可能外推到训练时没见过的更长序列。
但要注意证据边界:论文同时测试了 Learned Positional Embedding,结果几乎一样。开发集 BLEU 是 25.7 对 25.8。所以论文证明的是“必须注入位置信息,并且两种方案在该实验中接近”,而不是“正弦位置编码是唯一正确答案”。
图 4:词元向量负责表达“是什么”,位置编码负责表达“在哪里”;二者相加后,Self-Attention 才能同时利用内容和顺序。
6. 完整 Transformer 不是一块 Attention,而是 Encoder-Decoder 系统
原论文的 Transformer 仍沿用 Encoder-Decoder 框架,只是把内部的 Recurrent / Convolutional Layers 换成了 Attention 和逐位置前馈网络。
6.1 Encoder
Encoder 由 6 个相同结构的 Layer 堆叠。每层有两个子层:
- Multi-Head Self-Attention;
- Position-wise Feed-Forward Network。
每个子层外都有 Residual Connection,然后做 Layer Normalization:
LayerNorm(x + Sublayer(x))
这也是后来常说的 Post-Norm 结构。
6.2 Decoder
Decoder 同样堆叠 6 层,但每层有三个子层:
- Masked Multi-Head Self-Attention;
- Encoder-Decoder Attention;
- Position-wise Feed-Forward Network。
Masked Self-Attention 会把未来位置的分数设为负无穷,让当前位置只能看到已经存在的目标前缀。
6.3 三种 Attention 的差异只在数据来源和 Mask
| 类型 | Query 来源 | Key / Value 来源 | 可见范围 |
|---|---|---|---|
| Encoder Self-Attention | Encoder 上一层 | Encoder 上一层 | 全部输入位置 |
| Masked Decoder Self-Attention | Decoder 上一层 | Decoder 上一层 | 当前及更早目标位置 |
| Encoder-Decoder Attention | Decoder | Encoder 输出 | 全部输入位置 |
Cross-Attention 让解码器在生成每个目标词时,重新查看整个源句;Masked Self-Attention 则保证它不能偷看未来答案。
图 5:Encoder Self-Attention 理解输入内部关系,Masked Decoder Self-Attention 维护因果前缀,Encoder-Decoder Attention 把目标生成重新连接到源序列。
7. “Transformer 可以并行”到底指什么
这是这篇论文第二个最常见的误解。
7.1 训练阶段
训练时,完整目标句已经存在。把目标序列右移一位,再加上 Causal Mask,就可以同时计算所有目标位置的损失。每个位置虽然看不到未来词元,但不必真的等前一个位置算完才启动。
7.2 推理阶段
推理时,未来词元不存在:
生成 y1 -> 把 y1 放回输入
生成 y2 -> 把 y1, y2 放回输入
生成 y3 -> ...
因此原始 Transformer 的生成仍然是顺序的。论文结论部分也把“让生成更少顺序化”列为未来研究目标。
更准确的说法是:
Transformer 消除了训练时层内的序列对齐递归,但没有在原论文里消除自回归生成。
图 6:训练时完整目标序列已知,Causal Mask 允许所有位置并行计算;推理时下一个词元依赖真实生成出来的前缀,仍需逐步展开。
8. 训练配方不是脚注
架构并不是单独产生结果的。论文给出了一套具体训练系统:
- 英德翻译:约
450 万句对,共享约37,000个 BPE Token; - 英法翻译:约
3,600 万句对,约32,000个 WordPiece; - 每批约
25,000个源 Token 和25,000个目标 Token; - 硬件:一台机器、8 张 NVIDIA P100;
- Base:
100,000Steps,约 12 小时; - Big:
300,000Steps,约 3.5 天; - Adam:
β1 = 0.9、β2 = 0.98、ε = 10⁻⁹; - Warmup:前
4,000Steps 线性升高学习率,之后按 Step 的平方根倒数衰减; - Base Dropout:
0.1;Label Smoothing:0.1。
Label Smoothing 甚至出现了一个有意思的取舍:它让 Perplexity 变差,却提升了准确率和 BLEU。这提醒我们,不能只看一个训练指标判断生成质量。
9. 实验到底证明了什么
9.1 机器翻译
Transformer Big 在 WMT 2014 英德翻译上达到 28.4 BLEU,比论文列出的此前最佳 Ensemble 高出超过 2 BLEU。Base 模型达到 27.3。
英法结果存在论文内部冲突:
- Abstract 和 Table 2 写的是
41.8 BLEU; - Section 6.1 正文写的是
41.0 BLEU。
本文不替作者猜测哪一个是排版错误,只保留这项冲突。可以确定的是,Table 2 把 Transformer Big 列为 41.8,并比较了训练成本。
评估还依赖明确的解码设置:Base 平均最后 5 个 Checkpoint,Big 平均最后 20 个;Beam Size 为 4,Length Penalty α = 0.6。所以 BLEU 不是“裸模型单次前向”的结果。
9.2 架构消融
Table 3 支持几个相对克制的结论:
- 单 Head 比最佳多头设置差;Head 过多也会下降;
- 减小 Key Dimension 会伤害质量;
- 更大的模型在该设置中更强;
- Dropout 对防止过拟合很重要;
- Learned Position 与 Sinusoidal Position 在该实验中接近。
这些是对具体训练设置的消融,不是所有 Transformer 变体的永久定律。
9.3 英语成分句法分析
作者把 4 层 Transformer 用到 English Constituency Parsing:
- 仅使用约 4 万条 WSJ 训练句子时达到
91.3 F1; - 半监督、约 1,700 万条句子时达到
92.7 F1。
它超过了表中多种已有 Parser,但没有超过所有方法:WSJ-only 的 Recurrent Neural Network Grammar 为 91.7,表中最高的 Generative 结果为 93.3。因此更准确的结论是:Transformer 在很少任务特化的情况下迁移到另一类结构化序列任务仍表现强,而不是已经证明“所有任务都优于 RNN”。
10. 论文没有证明什么
- 没有证明长序列成本已经解决。 全局 Self-Attention 是
O(n²d);论文把 Restricted Attention 列为未来方向。 - 没有证明生成已经完全并行。 Decoder 推理仍是 Autoregressive。
- 没有证明对图像、音频、视频同样有效。 这些被写在 Future Work,而不是实验结果。
- 没有证明 Attention Weight 等于完整解释。 附录展示了某些 Head 似乎跟踪长距离依赖、指代和句法结构,这是观察性证据,不是因果解释。
- 没有证明正弦位置编码不可替代。 Learned Position 在消融中几乎持平。
- 没有证明 Attention 是模型的唯一部件。 FFN、Residual、LayerNorm、Embedding、训练调度和解码策略都参与了结果。
图 7:论文直接支持翻译、架构消融和英语句法分析上的结论;超长序列、非文本模态、完全并行生成和完整可解释性仍在证据边界之外。
11. 今天重读,这篇论文真正重要在哪里
如果只把它总结成“发明了 Self-Attention”,会漏掉更深的一层。
Attention 在此前已经存在,Encoder-Decoder 也已经存在。论文真正大胆的地方,是把 Attention 从 RNN 旁边的辅助模块,提升为序列表示的主干计算,并证明这种架构能在当时最重要的机器翻译基准上同时获得质量和训练效率。
它改变了序列建模的计算组织方式:
逐步更新状态
↓
直接计算位置之间的关系
↓
把关系计算变成大规模矩阵运算
这也是为什么“它消除的不是顺序,而是递归依赖”比“它只需要 Attention”更准确。顺序仍由位置编码表达,因果仍由 Mask 保证,生成仍按前缀推进;真正被拿掉的是那条阻止训练并行化的隐藏状态链。
回到 2017 年论文自身可以安全落下的结论是:Transformer 为 Sequence Transduction 提供了一条不依赖序列对齐 RNN 或 CNN 的可行主干,并在翻译和有限的迁移实验中展示了强结果。后来发生的一切可以说明它影响巨大,但不能反过来替原论文扩大证据范围。
术语速查
| 术语 | 本文中的含义 |
|---|---|
| Token | 序列中的离散符号单位 |
| Embedding | 把 Token 映射成连续向量 |
| Query | 当前表示想匹配的信息条件 |
| Key | 候选位置用于接受匹配的特征 |
| Value | 根据权重被汇总的内容 |
| Self-Attention | Q、K、V 来自同一序列的 Attention |
| Cross-Attention | Query 来自 Decoder,K/V 来自 Encoder |
| Causal Mask | 屏蔽未来目标位置,保持自回归因果性 |
| Multi-Head Attention | 在多个投影子空间中并行计算 Attention |
| Positional Encoding | 注入词元位置或相对顺序的信息 |
| Position-wise FFN | 对每个位置独立应用、位置间共享参数的前馈网络 |
| BLEU | 机器翻译中基于 n-gram 重合度的自动指标 |
参考来源
- arXiv 摘要页:Attention Is All You Need
- arXiv v7 PDF
- arXiv HTML 全文
- 论文链接的 Tensor2Tensor 代码仓库——该仓库目前已归档并标记为 deprecated,因此只作为历史实现来源,不作为当前复现栈推荐。
关于这篇论文的三个关键问题
Transformer 原论文重读:它真正消除的不是顺序,而是训练中的递归依赖 解决了什么问题?
图 0:Transformer 的关键变化不是把序列变成“无序集合”,而是把必须沿时间步传递的递归链,改造成可以用矩阵并行计算的全局关系。
Transformer 原论文重读:它真正消除的不是顺序,而是训练中的递归依赖 的核心结论有哪些证据?
Transformer Big 在 WMT 2014 英德翻译上达到 28.4 BLEU,比论文列出的此前最佳 Ensemble 高出超过 2 BLEU。Base 模型达到 27.3。
阅读 Transformer 原论文重读:它真正消除的不是顺序,而是训练中的递归依赖 时最需要注意什么局限?
Self-Attention 的优势不是“计算量永远更低”。它的核心优势是顺序操作数和最大路径长度都变成常数;代价是注意力矩阵对序列长度 n 呈平方增长。论文也明确说,当 n < d 时 Self-Attention 通常比 Recurrent Layer 更快,这在当时的机器翻译句子表示中常见,但不能外推成“任意长度都更便宜”。