《Attention Is All You Need》论文精读
零、论文速览
| 项目 | 内容 |
|---|---|
| 标题 | Attention Is All You Need |
| 作者 | Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Łukasz Kaiser, Illia Polosukhin |
| 机构 | Google Brain / Google Research / University of Toronto |
| 发表 | NIPS 2017 |
| 核心贡献 | 提出 Transformer——第一个完全基于注意力机制的序列转导模型,彻底摒弃循环和卷积 |
⚡ 这篇论文奠定了 GPT、BERT、Claude 等一切现代大语言模型的基础架构。理解 Transformer,就是理解当代 AI 的起点。
一、背景与动机
1.1 此前主流方法的局限
| 方法 | 代表 | 核心痛点 |
|---|---|---|
| RNN / LSTM / GRU | GNMT, Seq2Seq | 顺序计算 ht = f(ht − 1, xt),训练无法并行;长序列受限于显存 |
| CNN | ByteNet, ConvS2S | 两端之间的信号路径随距离线性或对数增长,远距离依赖难学 |
| RNN + Attention | Bahdanau et al. | Attention 仅作为 RNN 的辅助插件,循环瓶颈依然存在 |
1.2 核心洞察
注意力机制本身就能以 O(1) 的常数操作数建模任意两个位置之间的依赖关系。那么问题来了——
为什么不把 RNN 和 CNN 统统丢掉,只用注意力?
这就是 Transformer 的出发点。
二、模型架构全景
2.1 编码器-解码器总览
Transformer 沿用经典的 Encoder-Decoder 框架:
$$ \text{Input: } (x_1, \dots, x_n) \quad \xrightarrow{\text{Encoder } N\times} \quad \mathbf{z} = (z_1, \dots, z_n) \quad \xrightarrow{\text{Decoder } N\times} \quad (y_1, \dots, y_m) $$
- Encoder:将输入序列映射为连续表示 z
- Decoder:基于 z 自回归地逐 token 生成输出(每步把已生成的 token 作为额外输入)
2.2 编码器
$$ \boxed{\text{Encoder} = N \times \big(\text{Multi-Head Self-Attn} \to \text{Add \& Norm} \to \text{FFN} \to \text{Add \& Norm}\big)} $$
每层两个子层,每个子层后都有 残差连接 + 层归一化:
Output = LayerNorm(x + Sublayer(x))
| 参数 | 值 | 说明 |
|---|---|---|
| 层数 N | 6 | 编码器和解码器各 6 层 |
| 模型维度 dmodel | 512 | 所有子层 + 嵌入层的输出维度 |
| FFN 内部维度 dff | 2048 | FFN(x) = max (0, xW1 + b1)W2 + b2 |
2.3 解码器
$$ \boxed{\text{Decoder} = N \times \big(\text{Masked MHA} \to \text{A\&N} \to \text{Enc-Dec MHA} \to \text{A\&N} \to \text{FFN} \to \text{A\&N}\big)} $$
比编码器多一个子层(三类注意力,见下表):
| 子层 | Q 来源 | K、V 来源 | 功能 |
|---|---|---|---|
| 掩码多头自注意力 | 上一层 Decoder | 上一层 Decoder | 解码器内自注意,掩码防止看到未来位置 |
| 编码器-解码器注意力 | 上一层 Decoder | Encoder 最终输出 | 解码器每个位置关注全部输入 |
| 前馈网络 | — | — | 同编码器 |
🔑 自回归性质:输出嵌入偏移一个位置 + 掩码机制,确保位置 i 的预测只能依赖位置 < i 的已知输出。
三、注意力机制——Transformer 的灵魂
3.1 缩放点积注意力
注意力函数的本质:给定一个 查询(Query),在一组 键值对(Key-Value) 中做软检索,输出值的加权和:
$$ \text{Attention}(Q, K, V) = \text{softmax}\!\left(\frac{QK^T}{\sqrt{d_k}}\right) V $$
| 术语 | 含义 | 维度 |
|---|---|---|
| Q(Query) | “我要找什么” | nq × dk |
| K(Key) | “我有什么可供匹配” | nk × dk |
| V(Value) | “匹配后提取什么内容” | nk × dv |
| $\frac{1}{\sqrt{d_k}}$ | 缩放因子——核心创新 | 标量 |
为什么必须缩放?
假设 q 和 k 的分量是独立随机变量,均值 0,方差 1。则:
$$ q \cdot k = \sum_{i=1}^{d_k} q_i k_i \quad \Rightarrow \quad \mathbb{E}[q \cdot k] = 0,\quad \text{Var}(q \cdot k) = d_k $$
当 dk 很大时,点积值巨大 → softmax 输出趋近于 one-hot → 梯度 ≈ 0,训练停滞。
除以 $\sqrt{d_k}$ 将方差拉回 1,解决了梯度消失问题。
3.2 多头注意力
不做一个大而全的注意力,而是并行做 h 个小型注意力,各自在不同子空间中捕捉信息:
MultiHead(Q, K, V) = Concat(head1, …, headh) WO
headi = Attention(QWiQ, KWiK, VWiV)
| 参数 | 值 | 说明 |
|---|---|---|
| 头数 h | 8 | 并行注意力数 |
| 每头维度 | dk = dv = dmodel/h = 64 | 降维后计算 |
| 投影矩阵 | WiQ, WiK ∈ ℝdmodel × dk,WiV ∈ ℝdmodel × dv,WO ∈ ℝhdv × dmodel | 全部可学习 |
🎯 多头的好处:不同头关注不同表示子空间——有的头看句法,有的头看语义,有的头做指代消解。单头会通过平均抹杀这种多样性。
每头维度降低为原来的 1/h,所以总计算量与全维度单头注意力基本持平。
四、位置编码——赋予序列以”顺序”
4.1 为什么需要?
Transformer 没有循环也没有卷积,本身对 token 顺序无感知。如果只是把词嵌入输进去,“A loves B” 和 “B loves A” 对模型来说一模一样。必须注入位置信息。
4.2 正弦-余弦方案
论文采用的是固定三角函数编码,而非可学习的嵌入:
$$ PE_{(pos,\, 2i)} = \sin\!\left(\frac{pos}{10000^{2i / d_{\text{model}}}}\right) $$
$$ PE_{(pos,\, 2i+1)} = \cos\!\left(\frac{pos}{10000^{2i / d_{\text{model}}}}\right) $$
- pos:token 在序列中的位置
- i:编码向量的维度索引(0, 1, …, dmodel/2 − 1)
- 波长从 2π 到 10000 ⋅ 2π,呈几何级数分布——不同维度对应不同频率
4.3 选正弦的理由
- 相对位置可线性表示:对任意固定偏移 k,PEpos + k 可表示为 PEpos 的线性函数 → 模型容易学到相对位置
- 外推能力:训练时没见过的更长序列,正弦函数也能给出合理编码
- 实验验证:学习式嵌入与正弦编码效果几乎相同(BLEU 差仅 0.1),正弦胜在外推
使用时将位置编码直接加到输入嵌入上:
Input = TokenEmbedding(x) + PE(x)
五、为什么自注意力更优?
论文从三个维度系统对比自注意力、RNN 和 CNN:
| 指标 | 自注意力 | RNN | CNN | 受限自注意力 |
|---|---|---|---|---|
| 每层复杂度 | O(n2 ⋅ d) | O(n ⋅ d2) | O(k ⋅ n ⋅ d2) | O(r ⋅ n ⋅ d) |
| 最少顺序操作 | O(1) ✨ | O(n) ❌ | O(1) | O(1) |
| 最大路径长度 | O(1) ✨ | O(n) ❌ | O(logkn) | O(n/r) |
n — 序列长度;d — 表示维度;k — 卷积核宽度;r — 受限注意力的邻域大小
三条关键结论:
① 并行性碾压 RNN:自注意力只需 O(1) 个顺序操作,RNN 需要 O(n)——这是 Transformer 训练快得多的根本原因。
② 长距离依赖一马平川:任意两个位置之间的信号路径长度为常数 O(1),RNN 需要穿越 O(n) 的长度。
③ 当 n < d 时计算效率也占优:机器翻译中句子大多较短(n 小),自注意力比 RNN 更快。对于超长序列,可通过受限注意力(只看 r 大小的邻域)进一步优化。
六、训练方法
6.1 数据与批次
| 任务 | 数据集 | 规模 | 编码 |
|---|---|---|---|
| EN → DE | WMT 2014 | 450 万句对 | Byte-Pair Encoding(37K 共享词表) |
| EN → FR | WMT 2014 | 3600 万句对 | Word-Piece(32K 词表) |
每个训练 batch 约含 25000 源 token + 25000 目标 token。
6.2 硬件与速度
| 配置 | GPU | 每步耗时 | 总步数 | 总时长 |
|---|---|---|---|---|
| Base | 8 × P100 | 0.4 s | 100K | 12 小时 ⚡ |
| Big | 8 × P100 | 1.0 s | 300K | 3.5 天 |
6.3 优化器策略
使用 Adam(β1 = 0.9,β2 = 0.98,ϵ = 10−9),配合自定义的 warmup + 衰减学习率:
lrate = dmodel−0.5 ⋅ min (step_num−0.5, step_num ⋅ warmup_steps−1.5)
- 前 4000 步:学习率线性增加(warmup)
- 之后:按步数的平方根反比递减
6.4 正则化
| 方法 | 设置 | 说明 |
|---|---|---|
| 残差 Dropout | Pdrop = 0.1 | 施加于每个子层输出、嵌入与位置编码之和 |
| 标签平滑 | ϵls = 0.1 | 将正确标签概率从 1.0 平滑到 (1 − ϵls) + ϵls/|V|,损害困惑度(PPL)但提升 BLEU |
七、实验结果
7.1 机器翻译
| 模型 | EN-DE BLEU | EN-FR BLEU | 训练成本 (FLOPs) |
|---|---|---|---|
| GNMT + RL | 24.6 | 39.92 | 2.3 × 1019 |
| ConvS2S | 25.16 | 40.46 | 9.6 × 1018 |
| MoE | 26.03 | 40.56 | 2.0 × 1019 |
| GNMT + RL Ensemble | 26.30 | 41.16 | 1.8 × 1020 |
| ConvS2S Ensemble | 26.36 | 41.29 | 7.7 × 1019 |
| Transformer (base) | 27.3 | 38.1 | 3.3 × 1018 ⚡ |
| Transformer (big) | 28.4 🏆 | 41.8 🏆 | 2.3 × 1019 |
🔥 三大亮点:
- Big 模型 EN-DE 得分 28.4 BLEU,比之前最好的集成模型还高出 2.0+
- Base 模型训练成本仅为竞品的 1/20 ~ 1/50
- EN-FR 以不到前最佳模型 1/4 的训练成本刷新单模型记录
7.2 消融实验
| 变体 | 关键发现 |
|---|---|
| (A) 头数 | 单头差 0.9 BLEU;头太多也降。8 头最优 |
| (B) 键维度 dk | 减小 dk 显著损害质量 → 点积”兼容性匹配”并不简单,更复杂的匹配函数可能有益 |
| (C/D) 模型规模 & Dropout | 越大越好;Dropout 对防过拟合至关重要 |
| (E) 位置编码 | 学习式嵌入 ≈ 正弦编码(几乎无差异) |
7.3 句法分析(泛化验证)
在 WSJ Penn Treebank 选区句法分析任务中:
| 设置 | 方法 | F1 |
|---|---|---|
| 仅 WSJ 训练集 | Transformer (4层) | 91.3 |
| 仅 WSJ 训练集 | Dyer RNNG | 91.7 |
| 半监督 | Transformer (4层) | 92.7 🏆 |
| 半监督 | Vinyals & Kaiser | 92.1 |
| 多任务 | Luong et al. | 93.0 |
| 生成式 | Dyer RNNG | 93.3 |
🔑 值得一提:仅用 4 万句 WSJ 数据训练,Transformer 就超越了 BerkeleyParser——后者需要大量任务特定调优。
八、注意力可视化——模型”在想什么”
论文附录的可视化是理解 Transformer 内部行为的关键窗口:
8.1 长距离依赖追踪
在 “making…more difficult” 的翻译中,Encoder 第 5
层的多个注意力头准确捕获了动词 making
与其远端补足语之间的依赖——尽管中间隔了十几个 token。
8.2 指代消解
某些注意力头对代词 its
与其先行词(The Law)的连接展现出极其尖锐(sharp)的注意力分布——模型清楚地”知道”它在指什么。
8.3 句法分工
不同注意力头学会了不同的句法角色:
- 有的头专注名词短语的边界
- 有的头追踪动词-宾语的搭配
- 有的头捕捉介词短语的附着关系
💡 这说明多头注意力并非冗余——不同头确实自发地学到了互补的语言学特征。
九、总结与影响
论文核心贡献一览
| 贡献维度 | 具体内容 |
|---|---|
| 架构革命 | 第一个完全基于注意力的序列模型,彻底抛弃 RNN/CNN |
| 并行性突破 | 训练速度飞跃(12 小时 SOTA),根本原因是不再有序列依赖 |
| 长距离建模 | 常数级路径长度 O(1),天然解决长程依赖 |
| 可解释性 | 注意力权重可直接可视化,不同头展现不同语言学行为 |
| 泛化验证 | 翻译 SOTA + 句法分析出色 = 架构的通用性得到证实 |
后续影响
这篇论文开启了 “Attention Is All You Need” 的时代。Transformer 从机器翻译出发,迅速扩展到:
NLP 全线 → 计算机视觉 (ViT) → 语音处理 → 多模态 → 代码生成 → ⋯
GPT、BERT、T5、Claude、LLaMA……几乎所有现代大语言模型的名字背后,都是同一张架构蓝图——那篇 2017 年 NIPS 论文中描绘的 Transformer。
“We are excited about the future of attention-based models.”
——论文结尾的这句话,在此后近十年的 AI 浪潮中得到了最充分的应验。
参考资料
- Vaswani, A., et al. (2017). Attention Is All You Need. NIPS 2017. arXiv:1706.03762
- 官方代码实现:tensorflow/tensor2tensor
