Attention Is All You Need:Transformer 开山之作
2017 年 6 月,八位来自 Google Brain、Google Research 与多伦多大学的作者在 arXiv 上传了一篇 15 页的论文。它没有用当时主流的循环神经网络(RNN),也没有用卷积神经网络(CNN),只保留了一个机制——注意力(Attention),却在机器翻译任务上同时做到了效果更好和训练更便宜。
这篇论文就是 Attention Is All You Need,它提出的 Transformer 后来成为 BERT、GPT、T5 的骨架,也是今天所有大语言模型(LLM)和 Agent 系统的共同底座。想真正理解 Agent,先回到这一步。
| 项目 | 内容 |
|---|---|
| 标题 | 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 |
| 发表 | NeurIPS 2017(arXiv:1706.03762,2017 年 6 月 12 日) |
| 核心贡献 | 提出 Transformer:第一个完全基于注意力、不含循环与卷积的序列转换架构 |
| 任务 | 机器翻译(WMT 2014 英德、英法) |
| 影响 | BERT / GPT / T5 / ViT / 现代 LLM 与 Agent 的架构基础 |
1. 读完这篇论文你会得到什么
Section titled “1. 读完这篇论文你会得到什么”- 弄清 Transformer 的完整数据流:Encoder、Decoder、残差、LayerNorm 各自做什么;
- 理解自注意力与多头注意力的公式、直觉和设计动机;
- 明白为什么需要位置编码,以及它为什么选正弦函数;
- 看到论文如何用消融实验证明每个部件都不是摆设;
- 建立理解后续 LLM、RAG、Agent 上下文机制的地基。
2. 背景:RNN 时代的三个瓶颈
Section titled “2. 背景:RNN 时代的三个瓶颈”2.1 循环网络的「串行诅咒」
Section titled “2.1 循环网络的「串行诅咒」”RNN 把序列信息压缩进一个隐藏状态,第 步的输出依赖第 步:
这带来两个硬伤:
- 无法并行:必须逐步计算,序列多长就要串行多久,GPU 利用率上不去;
- 长距离依赖难学:位置 1 和位置 100 之间的信息,要经过 99 次传递才能相遇,梯度沿路衰减,训练越深越难。
论文原文对此的表述是:循环模型的这种固有顺序性,使得训练样本内部无法并行化,在序列较长时成为关键瓶颈。
2.2 卷积网络的「局部视野」
Section titled “2.2 卷积网络的「局部视野」”ConvS2S、ByteNet 这类模型用卷积核并行提取特征,但单个卷积核只看局部邻域。要让两个相距很远的位置产生联系,只能:
- 堆叠足够多的卷积层(普通卷积约 层,膨胀卷积约 层);
- 付出层数、参数与计算量的代价。
距离越远,路径越长,学习成本越高。
2.3 注意力之前只是「配角」
Section titled “2.3 注意力之前只是「配角」”Bahdanau 等人在 2015 年就把注意力机制接到 RNN 编码器-解码器上,用来对齐源语言和目标语言。但它始终是循环结构的补充件——主干仍然是 RNN。
论文提出的问题很直接:既然注意力能建模任意两个位置的依赖,为什么还要 RNN? 于是有了 Transformer:完全移除循环与卷积,只靠注意力 + 前馈网络堆叠。
3. 整体架构:一座 Encoder-Decoder 塔
Section titled “3. 整体架构:一座 Encoder-Decoder 塔”先看全局数据流:
源序列(如英文) │ ▼Embedding + 位置编码 │ ▼┌──────────────────┐│ Encoder × 6 │ ──── K, V ────┐└──────────────────┘ │ ▼目标序列(已生成部分) ┌──────────────────┐ │ │ Decoder × 6 │ ▼ └──────────────────┘Embedding + 位置编码 │ ▼ Linear + Softmax │ ▼ 下一个词的概率分布- 编码器把源序列编码成一串向量,输出交给解码器的交叉注意力使用;
- 解码器自回归地生成目标序列:每步看已生成的前缀,再结合编码器输出,预测下一个词。
3.1 Encoder:每层两个子层
Section titled “3.1 Encoder:每层两个子层”编码器由 个完全相同的层堆叠而成,每层只有两个子层:
- 多头自注意力(Multi-Head Self-Attention)
- 逐位置前馈网络(Position-wise Feed-Forward Network)
每个子层外面都包一层残差连接 + 层归一化:
也就是说,每层实际计算的是:
残差连接让梯度可以走「高速公路」,LayerNorm 稳定每层的数值分布——这两件套后来成为深度网络的标配。
3.2 Decoder:每层三个子层
Section titled “3.2 Decoder:每层三个子层”解码器同样堆叠 6 层,但每层多了一个子层,顺序是:
- 带掩码的多头自注意力(Masked Multi-Head Self-Attention)
- 多头交叉注意力(Cross-Attention,也叫 Encoder-Decoder Attention)
- 逐位置前馈网络
关键差异在第一个子层:生成第 个词时,模型不能「偷看」第 个词及之后的答案,所以自注意力必须加掩码。而中间的交叉注意力让解码器每一步都能回看整段源序列。
4. 注意力机制:整篇论文的灵魂
Section titled “4. 注意力机制:整篇论文的灵魂”4.1 直觉:一次可微的「软检索」
Section titled “4.1 直觉:一次可微的「软检索」”先把注意力当成一次检索:
- Query(查询):我当前想找什么;
- Key(键):每个位置「标签」是什么;
- Value(值):每个位置实际携带的信息。
用 Query 和每个 Key 算相似度,得到一组权重,再对 Value 加权求和。整个过程可微、可并行,比「硬查找」更适合神经网络。
其中 softmax 把分数变成概率分布:
4.2 缩放点积注意力
Section titled “4.2 缩放点积注意力”论文的核心公式(公式 1):
- : 个查询;
- : 个键;
- : 个值;
- 得到 的相似度矩阵,softmax 按行归一化后与 相乘。
为什么要除以 ? 这是全文最常被考的一个细节。当 较大时,点积的方差随维度增长,数值会变得很大,softmax 被推向两端、梯度趋近于 0,训练不稳定。除以 把方差拉回 1 附近,让梯度保持在健康区间。
4.3 为什么用点积,而不是加性注意力
Section titled “4.3 为什么用点积,而不是加性注意力”当时另一种主流做法是加性注意力(Bahdanau 注意力):
论文的取舍是:两者在 较小时效果接近,但点积注意力可以用高度优化的矩阵乘法实现,速度更快、显存更省。工程效率胜出。
4.4 多头注意力:让模型「多线程」看世界
Section titled “4.4 多头注意力:让模型「多线程」看世界”如果只做一次注意力,模型只能学到一种「关注模式」。Transformer 的做法是把 维切成 份,每份 维,并行做 8 次注意力,再拼接、投影:
其中投影矩阵 ,,。
多头的意义在于:每个头在不同子空间里学习不同关系。论文的注意力可视化显示,有的头盯着句法结构(比如动词与其宾语),有的头负责指代消解,有的头关注相邻位置。多头并不显著增加计算量——因为每头的维度被等比例缩小了。
4.5 三种注意力用法
Section titled “4.5 三种注意力用法”同一个注意力公式,在 Transformer 里被用了三次:
| 所在位置 | Query 来自 | Key / Value 来自 | 掩码 | 作用 |
|---|---|---|---|---|
| Encoder 自注意力 | 编码器上层 | 编码器上层 | 无 | 源序列内部任意位置互相建模 |
| Decoder 掩码自注意力 | 解码器上层 | 解码器上层 | 有 | 只能看已生成的前缀 |
| Decoder 交叉注意力 | 解码器上层 | 编码器输出 | 无 | 生成时对齐源序列 |
掩码的实现非常朴素:把 (未来位置)处的分数加上 ,softmax 后这些位置权重为 0:
4.6 注意力的代价
Section titled “4.6 注意力的代价”是一个 的矩阵,序列越长,计算量和显存都按 增长。这既是 Transformer 强大的来源(任意两位置一步直连),也是后来所有「长上下文」优化的靶子(稀疏注意力、Longformer、FlashAttention 等都从这里出发)。
5. 逐位置前馈网络:每个位置独立做一次 MLP
Section titled “5. 逐位置前馈网络:每个位置独立做一次 MLP”注意力负责「位置之间交流」,FFN 负责「每个位置自己消化」。它逐位置、共享参数地作用:
- 两层线性变换,中间夹一个 ReLU;
- base 模型里 ,内层维度 ,即先升维再降回;
- 从卷积视角看,等价于两个核大小为 1 的卷积。
别小看这个模块:升维到 4 倍再降回的结构占了模型参数的大头,也通常被认为是模型存储「知识」的主要位置。
6. 嵌入与 Softmax:共享权重
Section titled “6. 嵌入与 Softmax:共享权重”- 输入 token 先查嵌入表变成 维向量;
- 输出端用一个线性层 + softmax 得到词表概率;
- 论文让嵌入层与输出线性层共享同一个权重矩阵,并把嵌入乘以 ,让嵌入的尺度与位置编码相匹配。
共享权重在词表很大时显著减少参数量,后来也成为 LLM 的标准做法(weight tying)。
7. 位置编码:把顺序注入模型
Section titled “7. 位置编码:把顺序注入模型”自注意力对输入是置换等变的:把序列打乱,输出只是跟着打乱,模型本身感知不到顺序。但语言是有序的,所以必须显式注入位置信息。
论文用不同频率的正弦、余弦函数生成位置编码,直接加到嵌入上:
其中 是位置, 是维度下标。偶数维用 sin、奇数维用 cos,波长从 到 呈几何级数分布。
为什么选正弦而不是可学习的位置嵌入?
- 论文实验发现两者效果几乎持平;
- 正弦编码可以外推到比训练时更长的序列;
- 一个更漂亮的性质:任意固定偏移 , 都可以表示成 的线性变换,模型更容易学习「相对位置」关系。
8. 为什么自注意力更好:三组复杂度对比
Section titled “8. 为什么自注意力更好:三组复杂度对比”论文用一张表对比了不同层类型(Table 1):
| 层类型 | 每层复杂度 | 顺序操作数 | 最大路径长度 |
|---|---|---|---|
| 自注意力 | |||
| 循环层 | |||
| 卷积层 | |||
| 受限自注意力 |
这张表要这么读:
- 最大路径长度决定「两个远距离位置要经过多少步才能交互」。自注意力是常数 1,循环层是 ,卷积层是 ——路径越短,长距离依赖越容易学。
- 顺序操作数决定并行度。自注意力与卷积都是 ,循环是 。
- 每层复杂度是代价:自注意力是 ,当序列长度 小于表示维度 时,反而比循环层更省算力——这正是论文强调自注意力在机器翻译里划算的原因。
9. 训练配置:好结果也是调出来的
Section titled “9. 训练配置:好结果也是调出来的”9.1 数据与硬件
Section titled “9.1 数据与硬件”| 项目 | 英德(EN-DE) | 英法(EN-FR) |
|---|---|---|
| 数据集 | WMT 2014,约 450 万句对 | WMT 2014,约 3600 万句对 |
| 分词 | 字节对编码(BPE),共享词表约 3.7 万 | word-piece,词表 3.2 万 |
| Batch | 每批约 2.5 万源 token + 2.5 万目标 token | 同左 |
- 硬件:8 块 NVIDIA P100;
- base 模型训练约 12 小时;
- big 模型训练约 3.5 天。
9.2 优化器与学习率预热
Section titled “9.2 优化器与学习率预热”使用 Adam(,,),学习率按步数动态调整:
其中 warmup 步数取 4000。前 4000 步线性上升,之后按步数平方根的倒数衰减。这个 warmup + 逆平方根衰减 的调度后来几乎成为 Transformer 训练的标准配方。
9.3 正则化三件套
Section titled “9.3 正则化三件套”- Dropout:base 用 0.1,big 用 0.3。施加在三个位置:每个子层输出(残差相加前)、嵌入与位置编码之和、注意力权重矩阵。
- Label Smoothing:标签平滑系数 。它让模型的困惑度(perplexity)变差,但 BLEU 反而更高——因为模型变得更「不自信」,泛化更好。
- Checkpoint 平均:对训练后期的多个检查点取平均权重,几乎没有额外成本地稳定涨点。
10. 实验结果:更快、更好、更简单
Section titled “10. 实验结果:更快、更好、更简单”10.1 WMT 2014 机器翻译
Section titled “10.1 WMT 2014 机器翻译”| 模型 | EN-DE BLEU | EN-FR BLEU | 训练成本(FLOPs) |
|---|---|---|---|
| ByteNet | 23.75 | — | — |
| ConvS2S | 25.16 | 40.46 | |
| GNMT + RL | 24.6 | 39.92 | |
| ConvS2S Ensemble | 26.36 | 41.29 | |
| GNMT + RL Ensemble | 26.30 | 41.16 | |
| Transformer (base) | 27.3 | 38.1 | |
| Transformer (big) | 28.4 | 41.0 |
- big 模型在英德上比此前最好结果(含集成模型)高 2.0 BLEU 以上;
- 在英法上以单个模型刷新 SOTA,训练成本却不到此前最好模型的四分之一;
- base 模型只用 12 小时 8 卡 P100 就超过了所有已有单模型。
10.2 消融实验:每个设计都值钱
Section titled “10.2 消融实验:每个设计都值钱”论文的模型变体实验(Table 3)给出几个重要结论:
- 多头明显优于单头:单头注意力在英德上掉约 0.9 BLEU;
- 不能太小也不能太大:太小会削弱每个头的表达能力,太大则多头退化为单头的效果且收益递减;
- Dropout 对大模型至关重要:big 模型去掉 dropout 会明显过拟合;
- 正弦位置编码 vs 可学习位置编码:效果基本持平,选择正弦更多是出于外推性的考虑。
10.3 泛化能力:不只做翻译
Section titled “10.3 泛化能力:不只做翻译”论文还把 Transformer 用到英语成分句法分析(WSJ 数据集):
- 仅用 4 万句训练:91.3 F1;
- 半监督设置(1700 万句):92.7 F1。
这证明纯注意力架构的适用性不止于翻译任务。
10.4 注意力可视化
Section titled “10.4 注意力可视化”论文把不同注意力头的权重画了出来,可以看到清晰的结构:有的头关注相邻词,有的头把动词与远距离的宾语连起来,有的头负责指代关系。这给「多头到底学到了什么」提供了直观证据。
11. 结论:它真正改变了什么
Section titled “11. 结论:它真正改变了什么”- 架构上:Transformer 是第一个完全依赖注意力的序列转换模型,训练更快、并行度更高,在翻译任务上同时拿到效果和成本优势;
- 生态上:BERT(只用 Encoder)、GPT(只用 Decoder)、T5、ViT、以及今天几乎所有 LLM 都是它的变体;
- Agent 语境下:LLM 是 Agent 的「大脑」,而 LLM 的上下文窗口、工具调用格式、推理链,本质上都是 Transformer 在序列上做条件概率建模的能力延伸。读懂注意力,才知道 Agent 的能力边界从哪来。
12. 术语中英对照
Section titled “12. 术语中英对照”| 英文 | 中文 | 说明 |
|---|---|---|
| Attention | 注意力 | 按相关性加权聚合信息 |
| Self-Attention | 自注意力 | Q、K、V 来自同一序列 |
| Scaled Dot-Product Attention | 缩放点积注意力 | 除以 的点积注意力 |
| Multi-Head Attention | 多头注意力 | 多个子空间并行注意力 |
| Query / Key / Value | 查询 / 键 / 值 | 检索三要素 |
| Position-wise FFN | 逐位置前馈网络 | 对每个位置独立的两层 MLP |
| Positional Encoding | 位置编码 | 注入序列顺序信息 |
| Residual Connection | 残差连接 | |
| Layer Normalization | 层归一化 | 稳定数值分布 |
| Masked Attention | 掩码注意力 | 遮蔽未来位置,保证自回归 |
| Label Smoothing | 标签平滑 | 软标签正则化 |
| Warmup | 学习率预热 | 训练初期逐步提升学习率 |
| Beam Search | 束搜索 | 解码时保留 top-k 候选 |
| Ablation Study | 消融实验 | 逐个去掉部件验证贡献 |
13. 参考资料
Section titled “13. 参考资料”- Vaswani et al., Attention Is All You Need, NeurIPS 2017. arXiv: 1706.03762
- 官方实现:
tensor2tensor中的transformer模型 - 延伸阅读:The Illustrated Transformer(图解版)、The Annotated Transformer(逐行代码版)