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)
- 发表: NeurIPS 2017
- arXiv: 1706.03762
- 引用量: 10万+ (截至2026年,AI领域最具影响力的论文之一)
一句话总结
Transformer 彻底抛弃了 RNN/CNN,仅用注意力机制构建序列模型,实现了更高性能、更快训练、更强并行化,奠定了 GPT、BERT、Claude 等大语言模型的基础架构。
一、研究动机与问题背景
1.1 时代背景:RNN 的困境
2017年之前,序列建模的王者是 RNN/LSTM/GRU,但它们存在致命缺陷:
| 问题 | 描述 |
|---|---|
| 串行计算 | 必须按时间步顺序处理,无法并行,训练极慢 |
| 长距离依赖 | 信息从位置 1 传到位置 1000 需要经过 999 次变换,梯度消失/爆炸 |
| 内存瓶颈 | 批处理受限于序列长度,长序列训练困难 |
论文原话: "This inherently sequential nature precludes parallelization within training examples, which becomes critical at longer sequence lengths."
1.2 Attention 的崛起
Attention 机制(Bahdanau et al., 2014)已广泛应用于机器翻译,但只是作为 RNN 的附属组件。
核心问题:能否完全抛弃 RNN,只用 Attention?
二、核心创新:Transformer 架构
2.1 架构总览
┌─────────────────────────────────────────────────────────────┐
│ 输出层 │
│ Linear + Softmax │
└─────────────────────────────────────────────────────────────┘
↑
┌─────────────────────────────────────────────────────────────┐
│ Decoder Stack (N=6) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Masked Multi-Head Self-Attention │ │
│ │ Encoder-Decoder Attention │ │
│ │ Feed-Forward Network │ │
│ │ + Residual Connection + LayerNorm │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
↑
┌─────────────────────────────────────────────────────────────┐
│ Encoder Stack (N=6) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Multi-Head Self-Attention │ │
│ │ Feed-Forward Network │ │
│ │ + Residual Connection + LayerNorm │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
↑
┌─────────────────────────────────────────────────────────────┐
│ Input Embedding + Positional Encoding │
└─────────────────────────────────────────────────────────────┘
2.2 核心组件详解
2.2.1 Scaled Dot-Product Attention
公式:
关键设计:
- Q (Query): 查询向量,表示"我要找什么"
- K (Key): 键向量,表示"我是什么"
- V (Value): 值向量,表示"我的内容是什么"
- 缩放: 防止点积过大导致 softmax 梯度消失
为什么要除以 ?
当 很大时,点积 的方差是 (假设元素独立且方差为 1)。过大的点积使 softmax 进入饱和区,梯度接近 0。缩放后可以保持稳定的梯度流。
2.2.2 Multi-Head Attention
公式:
其中
参数配置:
- 头数
- 每头维度
- 总维度
设计直觉: 多头允许模型在不同的表示子空间中并行关注信息,类似 CNN 的多通道。
2.2.3 三种 Attention 应用场景
| 类型 | Query 来源 | Key/Value 来源 | 作用 |
|---|---|---|---|
| Encoder Self-Attention | 上一层编码器输出 | 上一层编码器输出 | 编码器内部信息融合 |
| Decoder Self-Attention | 上一层解码器输出 | 上一层解码器输出 (带 Mask) | 解码器内部信息融合,防止看到未来 |
| Encoder-Decoder Attention | 上一层解码器输出 | 编码器顶层输出 | 解码器关注编码器输出 (类似传统 Attention) |
2.2.4 Position-wise Feed-Forward Network
参数:
- 输入/输出维度:
- 隐藏层维度: (4 倍扩展)
作用: 对每个位置独立应用非线性变换,增强模型表达能力。
2.2.5 Positional Encoding
由于 Transformer 没有循环和卷积,必须显式注入位置信息:
为什么用正弦/余弦?
作者假设这种编码可以让模型学习相对位置关系:对于任意固定偏移 , 可以表示为 的线性函数。
三、为什么 Self-Attention 更好?
3.1 复杂度对比
| 层类型 | 每层复杂度 | 顺序操作数 | 最大路径长度 |
|---|---|---|---|
| Self-Attention | |||
| Recurrent | |||
| Convolutional |
3.2 核心优势
- 并行化: Self-Attention 所有位置可以同时计算,RNN 必须顺序计算
- 长距离依赖: Self-Attention 任意两个位置之间只需 1 步,RNN 需要 步
- 计算效率: 当序列长度 (词向量维度)时,Self-Attention 比 RNN 更快
关键洞察: 在机器翻译中,句子通常编码为 word-piece,长度 往往小于表示维度 ,因此 Self-Attention 更高效。
四、训练细节
4.1 数据集
| 任务 | 数据集 | 规模 | 词汇表 |
|---|---|---|---|
| EN-DE | WMT 2014 | 450 万句对 | 37000 BPE tokens |
| EN-FR | WMT 2014 | 3600 万句对 | 32000 word-piece |
4.2 硬件与时间
| 模型 | GPU | 训练时间 | 每步耗时 |
|---|---|---|---|
| Base | 8 × P100 | 12 小时 | 0.4 秒 |
| Big | 8 × P100 | 3.5 天 | 1.0 秒 |
4.3 优化器
Adam + 学习率预热:
- 前 4000 步线性增加学习率
- 之后按步数倒数平方根衰减
4.4 正则化
| 技术 | 参数 | 作用 |
|---|---|---|
| Residual Dropout | 防止过拟合 | |
| Label Smoothing | 提高泛化,降低困惑度 |
五、实验结果
5.1 机器翻译
| 模型 | EN-DE BLEU | EN-FR BLEU | 训练成本 (FLOPs) |
|---|---|---|---|
| GNMT + RL (RNN) | 24.6 | 39.92 | |
| ConvS2S (CNN) | 25.16 | 40.46 | |
| Transformer (Base) | 27.3 | 38.1 | |
| Transformer (Big) | 28.4 | 41.8 |
关键发现:
- EN-DE: 比 ConvS2S 集成模型高 2+ BLEU,训练成本仅 1/40
- EN-FR: 刷新 SOTA,训练成本仅 1/5
5.2 英语句法分析
Transformer 在英语成分句法分析任务上表现优异:
| 设置 | F1 分数 |
|---|---|
| WSJ only | 91.3 |
| Semi-supervised | 92.7 |
证明 Transformer 具有良好的任务泛化能力。
5.3 消融实验
| 变量 | 最优设置 | 发现 |
|---|---|---|
| 头数 | 8 | 单头差 0.9 BLEU,过多头也下降 |
| 模型深度 | 6 层 | 更深更好,但有边际效应 |
| 模型宽度 | 更宽更好 | |
| Dropout | 0.1 | 对防止过拟合至关重要 |
| 位置编码 | Sinusoid ≈ Learned | 两者效果几乎相同 |
六、影响与遗产
6.1 开启大模型时代
Transformer 架构成为所有现代大语言模型的基础:
| 模型 | 发布时间 | 参数规模 | 基于 Transformer |
|---|---|---|---|
| BERT | 2018 | 340M | Encoder-only |
| GPT | 2018 | 117M | Decoder-only |
| GPT-3 | 2020 | 175B | Decoder-only |
| ChatGPT/GPT-4 | 2022-2023 | 未公开 | Decoder-only |
| Claude | 2023 | 未公开 | Decoder-only |
| LLaMA | 2023 | 7B-70B | Decoder-only |
6.2 架构变体
- Encoder-only: BERT, RoBERTa → 文本理解
- Decoder-only: GPT, LLaMA → 文本生成
- Encoder-Decoder: T5, BART → 序列到序列
6.3 跨领域应用
Transformer 已扩展到:
- 计算机视觉: Vision Transformer (ViT), Swin Transformer
- 语音识别: Whisper, Wav2Vec
- 多模态: CLIP, DALL-E, Stable Diffusion
- 科学计算: AlphaFold 2 (蛋白质结构预测)
七、局限性与后续工作
7.1 论文指出的局限
- 序列长度 复杂度: 长序列计算成本高
- Restricted Self-Attention: 可限制到局部窗口 ,但增加路径长度
7.2 后续改进方向
| 问题 | 解决方案 |
|---|---|
| 长序列复杂度 | Sparse Attention, Longformer, Performer |
| 位置编码 | RoPE (旋转位置编码), ALiBi |
| 注意力效率 | Flash Attention, Multi-Query Attention |
| 参数效率 | LoRA, Adapter |
八、术语解释
| 术语 | 解释 |
|---|---|
| Self-Attention | 自注意力,Query/Key/Value 来自同一序列 |
| Multi-Head | 多头注意力,并行多个注意力函数 |
| Encoder-Decoder Attention | 交叉注意力,解码器关注编码器输出 |
| Positional Encoding | 位置编码,注入序列位置信息 |
| Residual Connection | 残差连接, |
| Layer Normalization | 层归一化,稳定训练 |
| BLEU | 机器翻译评价指标,越高越好 |
| BPE | Byte-Pair Encoding,子词分词算法 |
九、复现与代码
官方代码: https://github.com/tensorflow/tensor2tensor
核心 PyTorch 实现 (简化版):
import torch
import torch.nn as nn
import math
class ScaledDotProductAttention(nn.Module):
def __init__(self, d_k):
super().__init__()
self.scale = math.sqrt(d_k)
def forward(self, Q, K, V, mask=None):
# Q: [batch, heads, seq_len, d_k]
attn = torch.matmul(Q, K.transpose(-2, -1)) / self.scale
if mask is not None:
attn = attn.masked_fill(mask == 0, -1e9)
attn = torch.softmax(attn, dim=-1)
return torch.matmul(attn, V)
class MultiHeadAttention(nn.Module):
def __init__(self, d_model, n_heads):
super().__init__()
self.d_k = d_model // n_heads
self.n_heads = n_heads
self.W_q = nn.Linear(d_model, d_model)
self.W_k = nn.Linear(d_model, d_model)
self.W_v = nn.Linear(d_model, d_model)
self.W_o = nn.Linear(d_model, d_model)
self.attention = ScaledDotProductAttention(self.d_k)
def forward(self, x, mask=None):
batch_size = x.size(0)
Q = self.W_q(x).view(batch_size, -1, self.n_heads, self.d_k).transpose(1, 2)
K = self.W_k(x).view(batch_size, -1, self.n_heads, self.d_k).transpose(1, 2)
V = self.W_v(x).view(batch_size, -1, self.n_heads, self.d_k).transpose(1, 2)
out = self.attention(Q, K, V, mask)
out = out.transpose(1, 2).contiguous().view(batch_size, -1, self.n_heads * self.d_k)
return self.W_o(out)
十、复查记录
| 日期 | 版本 | 更新内容 |
|---|---|---|
| 2026-03-21 | v1.0 | 初稿完成,基于 TeX Source 深度解析 |
参考资料
- Vaswani et al. (2017). Attention Is All You Need. NeurIPS.
- Bahdanau et al. (2014). Neural Machine Translation by Jointly Learning to Align and Translate.
- Hochreiter & Schmidhuber (1997). Long Short-Term Memory.
- He et al. (2016). Deep Residual Learning for Image Recognition.
- 《Attention Is All You Need》论文原文及 TeX Source
诗云
弃循环而不用,唯注意力独行。 八头并行观全局,六层叠加造精英。 BLEU刷新惊四座,训练速成冠群英。 从此模型无边界,GPT起而世界惊。