为什么需要 Transformer?
2017 年之前,NLP 的主流方案是 RNN/LSTM 和 CNN,但它们在处理长文本时都有明显瓶颈:必须按顺序读取、难以并行、长距离信息容易丢失。
核心痛点:RNN 是串行的,第 t 个词必须等 t-1 算完;CNN 能并行,但对长距离依赖建模弱;Attention 虽好,之前只是 RNN 的外挂。
《Attention Is All You Need》的标题是一种挑衅:能不能彻底去掉 RNN 和 CNN,只靠注意力完成序列建模? Transformer 给出了肯定答案。
自注意力机制
自注意力的核心不是"找关联",而是为每个词动态加权融合全局信息。同一个词在不同上下文里,权重分布会完全不同。
从 RNN 到 Attention
RNN 的隐藏状态是逐词传递的:$h_t = f(h_{t-1}, x_t)$。这意味着开头的信息要经过很多步才能传到结尾,而且会衰减。Self-Attention 则让每个词直接与全句所有词交互,不再依赖步进传递。
QKV 机制
Self-Attention 用三组向量工作:Query 表示"我现在想找什么",Key 表示"我身上有什么标签",Value 表示"我实际承载什么内容"。最终输出是 Value 的加权和,权重由 Query 和 Key 的相似度决定。
注意,Q、K、V 都来自同一个输入 $X$,只是经过不同的线性投影。这也是它叫 Self-Attention 的原因。
通俗拆解:这堆符号到底在说什么?
假设输入句子是"猫坐垫子上睡觉",我们拿"坐"这个词来理解整个过程:
- 生成 Query:"坐"先看看自己,整理出一个问题:"我想知道句子中哪些词和我的关系最强?"
- 生成 Key:句子里的每个词都把自己的特征整理成一个"标签",比如"猫"的标签是"主语/动物","垫子"的标签是"地点/家具"。
- 匹配打分:"坐"拿着自己的 Query,去和每个词的 Key 比对相似度。和"猫"最像,给高分;和"睡觉"也有关系,给中高分;和某个停用词关系弱,给低分。
- 缩放:原始分数可能差距太大,先压一压,让 Softmax 不要"一极化"。
- Softmax:把分数变成概率,所有分数加起来等于 1。此时"坐"就知道自己该关注谁、忽略谁。
- 加权求和:把每个词的 Value 按这些概率加权加起来,得到"坐"的最终表示。这个新表示已经融合了全句信息,不只是原来孤零零的"坐"。
核心直觉:不是人工定义"坐"应该关注"猫",而是模型通过 Q 和 K 的匹配,自动学会"坐"应该更关注"猫"。不同的上下文里,同一个词的关注对象也会变化。
缩放点积注意力
为什么要点积后除以 $\sqrt{d_k}$?因为当 $d_k$ 较大时,Q 和 K 的点积方差会变大,导致 Softmax 进入饱和区,梯度接近 0。
$\mathbb{E}[q \cdot k] = 0$
$\text{Var}[q \cdot k] = d_k = 512$
不缩放时点积分布在较大区间,Softmax 会把几乎全部概率集中到少数几个最大值上。除以 $\sqrt{512} \approx 22.6$ 后,方差被压回 1,Softmax 分布更平滑。
简单理解:不缩放就像老师只盯学霸;缩放后,分数被压缩到合理范围,普通人也能分到蛋糕。
多头注意力
单头注意力只能学到一种关系模式。Multi-Head Attention 把 Q、K、V 投影到 $h$ 个子空间,每个头独立做 Attention,最后拼接结果:
约束:$h \times d_k = d_{\text{model}}$,$h \times d_v = d_{\text{model}}$。论文中 $h=8$,$d_{\text{model}}=512$,每个头 $d_k=d_v=64$。多头的好处是不同头可以学到不同的依赖:有的关注语法,有的关注语义,有的关注长距离关系。
整体架构
原始 Transformer 是 Encoder-Decoder 结构。Encoder 负责把输入序列编码成一系列隐藏表示;Decoder 则基于这些表示自回归地生成输出。
位置编码
Attention 本身是位置无关的:它只看内容相似度,不看顺序。为了让模型感知顺序,Transformer 给每个位置加了一个正弦/余弦编码。
这种设计的好处是:相对位置可以通过 PE 的线性变换推导出来。也就是说,模型不仅能知道"这是第 5 个词",还能知道"第 5 个词和第 2 个词之间隔了 3 个位置"。
残差连接与层归一化
每个子层都用了残差连接:$\text{Output} = \text{LayerNorm}(x + \text{Sublayer}(x))$。残差连接让梯度更容易回传,缓解深层网络的退化问题;LayerNorm 稳定内部分布,允许更大学习率。
前馈网络
每个 Encoder/Decoder Layer 里还有一个 Position-wise Feed-Forward Network:
注意,FFN 对每个位置独立作用,不跨 token 交互。它的职责不是建模词间关系,而是对 Attention 输出的每个向量做非线性变换,提升表示能力。原始论文里 $W_1$ 把维度从 512 扩到 2048,$W_2$ 再压回 512。
Masked Attention
Decoder 的自注意力加了 Mask,防止当前位置看到后面的词。生成第 t 个词时,只能 attend to $1..t-1$。这是自回归生成能保持因果性的关键。
| 组件 | 作用 |
|---|---|
| 自注意力 | 每个词 attend to 全句所有词 |
| 前馈网络 | 对每个 token 独立做非线性变换 |
| 残差连接 | 保留原始信息,缓解梯度消失 |
| 层归一化 | 稳定训练,允许更大学习率 |
| 位置编码 | 注入顺序信息 |
| Mask | Decoder 保持因果性 |
训练细节与工程选择
优化器
原始 Transformer 用了 Adam,但做了定制化的参数设置:$\beta_1=0.9$,$\beta_2=0.98$,$\varepsilon=1e-9$。$\beta_2$ 接近 1 意味着对历史梯度的衰减很慢,适合稀疏梯度场景。
学习率调度
用了 Warmup + 衰减策略:前 4000 步线性升温,之后按步数的 $-0.5$ 次方衰减。Warmup 防止训练初期大步长破坏稳定性;衰减保证后期精细收敛。
正则化
用了三种正则手段:Dropout 加在 Attention 和 FFN 的输出上;Label Smoothing 把硬标签改成软标签,防止模型过度自信;残差连接本身就是一种正则,让网络更偏向恒等映射。
复杂度权衡
Self-Attention 的计算量是 $O(n^2 \cdot d)$,序列很长时会成为瓶颈。不过论文时代 $n$ 还不大,这个代价被并行收益覆盖。现在长上下文场景下,业界用稀疏注意力、FlashAttention、线性注意力等方法继续压缩这个成本。
为什么 Transformer 统治了 AI?
2017 年的论文只做机器翻译,BLEU 28.4,训练 3.5 天用 8 块 P100。但 Transformer 的架构具备三个可扩展特性:
1. 并行性。 所有 token 同时计算,GPU 利用率远高于 RNN。这直接让训练大规模模型成为可能。
2. 长距离建模。 任意两个词之间只有一层 Attention,不管相隔多远,信息路径长度都是 1。
3. 模块化堆叠。 增加层数、头数、维度,性能持续提升。GPT-3 的 1750 亿参数、GPT-4 的多模态架构,本质上都是这个思想的延伸。
从文本到图像,从语音到蛋白质结构,Transformer 已经成为事实上的通用表示架构。
| 模型 | 公司 | 说明 |
|---|---|---|
| GPT 系列 | OpenAI | Decoder-only 自回归语言模型 |
| BERT | Encoder-only,双向预训练 | |
| T5 | Encoder-Decoder,统一文本到文本框架 | |
| ViT | 把图像切成 patch 用 Transformer 处理 | |
| Whisper | OpenAI | 多语言语音识别 |
面试常考:几个关键判断
Q: 为什么不用 CNN?
CNN 能并行,但感受野有限,长距离依赖需要很多层才能传过去。Transformer 的 Attention 让任意两个词之间都是直接连接,路径长度为 1。
Q: 为什么不用 RNN?
RNN 串行,无法利用 GPU 并行;梯度回传路径长,容易梯度消失/爆炸。Transformer 用残差连接和层归一化缓解了深层训练问题。
Q: Self-Attention 复杂度不是 $O(n^2)$ 吗?
是的,长序列确实贵。但实际场景中,$n$ 通常在几百到几千,且现代硬件对矩阵乘法高度优化,总体仍比 RNN 快。
Q: 位置编码有没有可能被模型忽略?
有可能。所以也有相对位置编码、旋转位置编码 RoPE 等改进方案,让位置信息更鲁棒。
Transformer 用 Self-Attention 让每个词直接与全句交互,用位置编码恢复顺序,用残差和归一化稳定深层训练,最终实现了并行、长距离、可扩展的序列建模。
彩蛋
论文标题《Attention Is All You Need》是一句挑衅式玩笑。当时主流观点是做机器翻译需要 RNN + CNN + Attention 三者结合,这 8 个 Google 研究员说:"不,我们只需要 Attention,其他都是浮云。"
结果证明:他们是对的。