先说结论
Transformer 是一种完全基于注意力机制的序列到序列模型架构,通过自注意力、前馈网络、残差连接和层归一化的堆叠组合,实现了高效并行训练和强大的长距离依赖建模能力。
为什么我会单独记这一篇
2017 年之前,序列到序列任务(如机器翻译)的主流方法是 RNN+Attention 或 CNN+Attention。这些方法的核心瓶颈:
- 训练速度:RNN 的串行性使得训练无法有效并行化,即使使用大量 GPU,训练时间仍然受限于序列长度。
- 长距离依赖:尽管有 LSTM 的门控机制和注意力机制的帮助,RNN 仍然难以在超长序列中有效传递信息。
- 模型深度受限:随着层数增加,RNN/CNN 的训练变得越来越不稳定,梯度消失/爆炸问题加剧。
Transformer 的目标是:设计一种架构,能够完全抛弃递归和卷积,仅依靠注意力机制实现序列建模,同时获得更好的并行性、更强的长距离依赖建模能力和更稳定的深层训练。
先把核心脉络捋清楚
整体架构:Encoder-Decoder
原始 Transformer 由两个部分组成:
编码器(Encoder):处理输入序列,为每个 token 生成一个上下文感知的表示。由 N=6 个相同的编码器层堆叠而成。
解码器(Decoder):接收编码器的输出,自回归地生成目标序列。由 N=6 个相同的解码器层堆叠而成。
编码器和解码器之间通过 Cross-Attention 连接:解码器在每个层中通过交叉注意力从编码器输出中提取相关信息。
编码器层(Encoder Block)
每个编码器层包含两个子层:
- Multi-Head Self-Attention:每个 token 与序列中所有其他 token 计算注意力,捕捉全局依赖关系。
- Position-wise Feed-Forward Network (FFN):对每个位置独立应用相同的两层全连接网络,引入非线性变换能力。公式为 FFN(x) = max(0, xW_1 + b_1)W_2 + b_2。
每个子层都使用残差连接和层归一化:output = LayerNorm(x + Sublayer(x))。
解码器层(Decoder Block)
每个解码器层包含三个子层:
- Masked Multi-Head Self-Attention:与编码器的自注意力相同,但加入因果掩码,确保位置 i 只能关注位置 1 到 i 的信息(不能看到未来)。这是自回归生成的关键约束。
- Multi-Head Cross-Attention:Query 来自解码器,Key 和 Value 来自编码器输出。这是解码器"查看"输入序列的通道。
- Position-wise FFN:与编码器相同。
同样,每个子层都有残差连接和层归一化。
嵌入层与位置编码
输入 token 首先通过 Token Embedding 转换为向量,然后加上位置编码(Positional Encoding)。这是因为自注意力机制本身不包含任何位置信息——对它来说,"猫追狗"和"狗追猫"是完全相同的输入集合。位置编码通过在嵌入向量中加入位置信息来解决这个问题。
最终输出层
解码器的输出经过一个线性投影(将 d_model 维映射到词表大小 V 维),然后通过 softmax 得到每个词的生成概率。
原理拆开看
为什么 Self-Attention 可以替代 RNN
在 RNN 中,信息从位置 1 传递到位置 n 需要经过 n-1 步,路径长度为 O(n)。在 Self-Attention 中,任意两个位置之间的信息传递只需要 1 步——直接通过注意力权重——路径长度为 O(1)。这意味着:
- 梯度可以直接在任意两个位置之间流动,不存在长路径上的梯度消失。
- 所有位置的计算是独立的,可以完全并行化。
- 模型可以"同等容易"地学习短距离和长距离的依赖。
残差连接的作用
output = LayerNorm(x + Sublayer(x))
残差连接让梯度可以直接"跳过"子层,沿着 x 的路径直接回传。在深层网络中,这是训练成功的关键——没有残差连接,6 层以上的 Transformer 就很难训练。
直觉上,残差连接让每一层只需要学习"增量修改"(residual),而非从零开始学习完整的映射。这让优化变得更容易。
层归一化的作用
层归一化将每个 token 的特征向量归一化到均值为 0、方差为 1 的分布,然后用可学习的参数 gamma 和 beta 进行缩放和平移。这有助于:
- 稳定训练过程中的激活值分布。
- 减少内部协变量偏移(Internal Covariate Shift)。
- 与 BatchNorm 不同,LayerNorm 不依赖 batch 统计量,因此对 batch size 不敏感,也适用于变长序列。
FFN 的角色
FFN 看似简单,但它承担了重要的角色:如果说 Self-Attention 是信息在 token 之间的"横向"流动,那么 FFN 就是信息在每个 token 内部的"纵向"变换。FFN 为模型引入了非线性和容量。
FFN 的中间维度通常是模型维度的 4 倍(原始 Transformer 中 d_model=512,d_ff=2048)。这种"先升维再降维"的结构让模型在更高维的空间中进行非线性变换。
注意力掩码
Transformer 中有两种重要的掩码:
- Padding Mask:在同一个 batch 中,不同序列的长度不同,短序列需要用 padding token 填充。padding 位置不应参与注意力计算,将其注意力分数设为负无穷。
- Causal Mask(因果掩码):在解码器中,确保位置 i 不能关注位置 i+1 到 n 的信息。这是一个下三角矩阵,上三角部分设为负无穷。
放到工程里怎么落
训练流程
- 数据准备:将输入序列和目标序列(右移一位)配对。
- 前向传播:输入序列经过编码器得到编码表示;目标序列经过解码器(带因果掩码),结合编码器输出,预测每个位置的下一个 token。
- 损失计算:使用交叉熵损失比较预测概率与真实 token。
- 反向传播:由于没有递归结构,梯度可以高效计算。
- 学习率调度:原始 Transformer 使用 warmup + inverse square root 调度:先线性增加学习率,然后按步数的平方根倒数衰减。
推理流程(自回归)
- 编码器一次性处理完整输入序列。
- 解码器从起始 token()开始。
- 每一步:将当前已生成的 token 序列输入解码器,预测下一个 token 的概率分布。
- 选择概率最高的 token(或使用 beam search、top-k、top-p 等采样策略)。
- 将新 token 加入已生成序列,重复直到生成结束 token()或达到最大长度。
注意:推理时解码器是串行的,每步生成一个 token。KV Cache 可以避免重复计算之前 token 的 Key 和 Value。
关键超参数
| 超参数 | 原始 Transformer | 典型现代值 |
|---|---|---|
| 层数 N | 6 | 12-96 |
| 模型维度 d_model | 512 | 768-8192 |
| 注意力头数 h | 8 | 12-128 |
| FFN 中间维度 d_ff | 2048 | 2048-32768 |
| Dropout | 0.1 | 0-0.1 |
与相邻概念的区别
- Transformer vs RNN:Transformer 完全并行化,信息路径 O(1);RNN 串行,信息路径 O(n)。
- Transformer vs CNN:CNN 是局部感受野,需要堆叠多层才能看到全局;Transformer 天然全局感受野。
- Encoder-Decoder vs Encoder-Only vs Decoder-Only:原始 Transformer 是完整的 Encoder-Decoder;BERT 只用 Encoder,GPT 只用 Decoder。参见 编码器与解码器。
设计时真正要权衡什么
| 设计选择 | 优势 | 代价 |
|---|---|---|
| Self-Attention vs RNN | 并行化、O(1)信息路径 | O(n^2)复杂度 |
| 堆叠层数增加 | 更强的模型容量 | 训练难度增加、推理延迟 |
| 大 FFN 中间维度 | 更强的非线性表达能力 | 参数量增大 |
| Post-Norm(原始)vs Pre-Norm(现代) | Post-Norm 可能上限更高 | Post-Norm 训练更不稳定 |
容易踩的坑
- 学习率 warmup 不足:Post-Norm Transformer 对学习率极其敏感,没有 proper warmup 会导致训练早期梯度爆炸。
- 掩码错误:混淆 padding mask 和 causal mask,或在错误的位置应用掩码。
- 梯度裁剪缺失:深层 Transformer 在训练初期可能出现梯度尖峰,需要梯度裁剪(通常 clip norm = 1.0)。
- 标签平滑过度:标签平滑(label smoothing,原始论文用 0.1)有助于正则化,但值过大会降低模型信心。
- 序列长度超出预期:位置编码可能无法处理训练时未见过的更长序列。
工程落地时我会怎么做
- 使用 Pre-Norm 而非 Post-Norm,训练更稳定(参见 归一化与残差连接)。
- 使用 Flash Attention 加速注意力计算并节省显存。
- 训练时使用混合精度(fp16/bf16),注意 loss scaling。
- 推理时实现 KV Cache,避免重复计算。
- 对于大规模训练,使用张量并行(Tensor Parallelism)和流水线并行(Pipeline Parallelism)。
如果要对外讲,可以怎么概括
建议结构:
- 从动机出发:RNN 的并行性差和长距离依赖问题。
- 画出 Encoder-Decoder 架构草图,标注每个组件。
- 逐层讲解编码器:Self-Attention -> Add & Norm -> FFN -> Add & Norm。
- 讲解解码器与编码器的区别:因果掩码、交叉注意力。
- 解释残差连接和层归一化的作用。
- 讨论训练和推理流程的差异(teacher forcing vs 自回归)。
常见面试追问:
- 为什么 FFN 的中间维度是模型维度的 4 倍?(增加非线性容量)
- 推理时如何加速?(KV Cache、MQA/GQA、量化、推测解码)
- Transformer 为什么比 RNN 更容易并行化?(没有时序依赖)
最后记几条
- 核心创新:完全抛弃 RNN/CNN,仅用注意力机制建模序列——"Attention Is All You Need"。
- Encoder-Decoder 分工:编码器双向理解输入,解码器自回归生成输出。
- 残差连接 + 层归一化:使深层 Transformer 的训练成为可能。
- 位置编码的必要性:注意力本身不编码顺序,必须显式注入位置信息。
- O(n^2) 复杂度:这是 Transformer 的核心瓶颈,催生了大量优化工作。
面试高频题
QUESTION Transformer 中 Self-Attention 的复杂度是多少? 时间复杂度 ,空间复杂度 ,其中 为序列长度, 为模型维度。原因是需要计算 的注意力矩阵 。这是 Transformer 处理超长序列时的主要瓶颈。
QUESTION Transformer 为什么比 RNN 更适合并行化? RNN 的每个时间步依赖前一步的隐状态输出,形成严格的时序依赖链,无法并行。Transformer 中 Self-Attention 的所有 计算是一次矩阵乘法,所有位置的输出可以同时计算,无需等待其他位置完成。这使得 Transformer 可以充分利用 GPU 的并行计算能力。
QUESTION Transformer 的三个核心组件是什么?
- 多头自注意力:token 间的全局信息交互(横向)
- 前馈网络 (FFN):每个 token 内部的非线性特征变换(纵向)
- 残差连接 + 层归一化:使深层网络可训练的基础设施
QUESTION Transformer 中为什么用 Adam 而非 SGD? Adam 自带自适应学习率(对每个参数维护一阶和二阶矩估计),能更好地处理 Transformer 中不同层梯度量级差异大的问题。SGD 需要更精细的学习率调优,在 Transformer 上训练不稳定。原始 Transformer 使用 Adam + warmup + inverse sqrt 调度。
QUESTION 训练 Transformer 时学习率调度策略是什么? Warmup + Inverse Square Root 调度:前 warmup_steps 步线性增加学习率至峰值 ,之后按步数平方根倒数衰减。公式:。warmup 阶段防止初期梯度爆炸,尤其在 Post-Norm 配置下至关重要。
QUESTION Label Smoothing 在 Transformer 中起什么作用? 原始 Transformer 使用 的标签平滑:将目标分布从 one-hot 变为 给正确类别, 均匀分配给其他类别。好处:(1) 防止模型过度自信,提高泛化性;(2) 鼓励注意力权重更均匀分布。代价是会略微降低训练 perplexity(因为模型永远无法达到 log(1)=0 的理想 loss)。
QUESTION Transformer 推理时如何加速?
- KV Cache:缓存已计算的 Key/Value,避免重复计算
- GQA/MQA:减少 KV Cache 大小,降低内存带宽压力
- Flash Attention:优化 GPU 内存访问模式
- 量化(Quantization):FP16/INT8/INT4 降低计算和存储开销
- 推测解码(Speculative Decoding):用小模型并行预测多个 token
- 批量推理(Continuous Batching):提高 GPU 利用率
Transformer 架构演进对比
| 版本 | 年份 | 核心改进 | 代表模型 |
|---|---|---|---|
| 原始 Transformer | 2017 | Encoder-Decoder + Post-Norm | Vaswani |
| BERT | 2018 | Encoder-Only + MLM | BERT/RoBERTa |
| GPT-2 | 2019 | Decoder-Only + Pre-Norm | GPT 系列 |
| LLaMA | 2023 | Pre-Norm + RMSNorm + SwiGLU + RoPE + GQA | LLaMA 2/3 |
| DeepSeek-V2 | 2024 | MLA + MoE + 无辅助损失 | DeepSeek-V2/V3 |
延伸阅读
- 大模型总索引
- 深度学习现代架构概览 — Transformer 在 DL 架构谱系中的位置
- 序列建模演进 — 从 RNN/LSTM/GRU 到 Transformer 的演进路径
延伸阅读
- 注意力机制 — 注意力机制的详细数学原理
- 位置编码 — 各种位置编码方法
- 编码器与解码器 — BERT、GPT、T5 如何取舍编码器和解码器
- FFN与激活函数 — 前馈网络的激活函数演进
- 归一化与残差连接 — Pre-Norm vs Post-Norm、RMSNorm
- 注意力优化前沿 — GQA、MLA、Flash Attention 等优化
参考资料
- Vaswani, A. et al. (2017). "Attention Is All You Need." NeurIPS 2017. arXiv:1706.03762
- "The Illustrated Transformer" by Jay Alammar — https://jalammar.github.io/illustrated-transformer/
- HuggingFace Transformers Documentation — https://huggingface.co/docs/transformers/