2025年7月13日

Transformer 架构详解

Transformer 是一种完全基于注意力机制的序列到序列模型架构,通过自注意力、前馈网络、残差连接和层归一化的堆叠组合,实现了高效并行训练和强大的长距离依赖建模能力。

知识库大模型基础原理llmmodeltransformerarchitecture

先说结论

Transformer 是一种完全基于注意力机制的序列到序列模型架构,通过自注意力、前馈网络、残差连接和层归一化的堆叠组合,实现了高效并行训练和强大的长距离依赖建模能力。

为什么我会单独记这一篇

2017 年之前,序列到序列任务(如机器翻译)的主流方法是 RNN+Attention 或 CNN+Attention。这些方法的核心瓶颈:

  1. 训练速度:RNN 的串行性使得训练无法有效并行化,即使使用大量 GPU,训练时间仍然受限于序列长度。
  2. 长距离依赖:尽管有 LSTM 的门控机制和注意力机制的帮助,RNN 仍然难以在超长序列中有效传递信息。
  3. 模型深度受限:随着层数增加,RNN/CNN 的训练变得越来越不稳定,梯度消失/爆炸问题加剧。

Transformer 的目标是:设计一种架构,能够完全抛弃递归和卷积,仅依靠注意力机制实现序列建模,同时获得更好的并行性、更强的长距离依赖建模能力和更稳定的深层训练。

先把核心脉络捋清楚

整体架构:Encoder-Decoder

原始 Transformer 由两个部分组成:

编码器(Encoder):处理输入序列,为每个 token 生成一个上下文感知的表示。由 N=6 个相同的编码器层堆叠而成。

解码器(Decoder):接收编码器的输出,自回归地生成目标序列。由 N=6 个相同的解码器层堆叠而成。

编码器和解码器之间通过 Cross-Attention 连接:解码器在每个层中通过交叉注意力从编码器输出中提取相关信息。

编码器层(Encoder Block)

每个编码器层包含两个子层:

  1. Multi-Head Self-Attention:每个 token 与序列中所有其他 token 计算注意力,捕捉全局依赖关系。
  2. 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)

每个解码器层包含三个子层:

  1. Masked Multi-Head Self-Attention:与编码器的自注意力相同,但加入因果掩码,确保位置 i 只能关注位置 1 到 i 的信息(不能看到未来)。这是自回归生成的关键约束。
  2. Multi-Head Cross-Attention:Query 来自解码器,Key 和 Value 来自编码器输出。这是解码器"查看"输入序列的通道。
  3. 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 中有两种重要的掩码:

  1. Padding Mask:在同一个 batch 中,不同序列的长度不同,短序列需要用 padding token 填充。padding 位置不应参与注意力计算,将其注意力分数设为负无穷。
  2. Causal Mask(因果掩码):在解码器中,确保位置 i 不能关注位置 i+1 到 n 的信息。这是一个下三角矩阵,上三角部分设为负无穷。

放到工程里怎么落

训练流程

  1. 数据准备:将输入序列和目标序列(右移一位)配对。
  2. 前向传播:输入序列经过编码器得到编码表示;目标序列经过解码器(带因果掩码),结合编码器输出,预测每个位置的下一个 token。
  3. 损失计算:使用交叉熵损失比较预测概率与真实 token。
  4. 反向传播:由于没有递归结构,梯度可以高效计算。
  5. 学习率调度:原始 Transformer 使用 warmup + inverse square root 调度:先线性增加学习率,然后按步数的平方根倒数衰减。

推理流程(自回归)

  1. 编码器一次性处理完整输入序列。
  2. 解码器从起始 token()开始。
  3. 每一步:将当前已生成的 token 序列输入解码器,预测下一个 token 的概率分布。
  4. 选择概率最高的 token(或使用 beam search、top-k、top-p 等采样策略)。
  5. 将新 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 训练更不稳定

容易踩的坑

  1. 学习率 warmup 不足:Post-Norm Transformer 对学习率极其敏感,没有 proper warmup 会导致训练早期梯度爆炸。
  2. 掩码错误:混淆 padding mask 和 causal mask,或在错误的位置应用掩码。
  3. 梯度裁剪缺失:深层 Transformer 在训练初期可能出现梯度尖峰,需要梯度裁剪(通常 clip norm = 1.0)。
  4. 标签平滑过度:标签平滑(label smoothing,原始论文用 0.1)有助于正则化,但值过大会降低模型信心。
  5. 序列长度超出预期:位置编码可能无法处理训练时未见过的更长序列。

工程落地时我会怎么做

  1. 使用 Pre-Norm 而非 Post-Norm,训练更稳定(参见 归一化与残差连接)。
  2. 使用 Flash Attention 加速注意力计算并节省显存。
  3. 训练时使用混合精度(fp16/bf16),注意 loss scaling。
  4. 推理时实现 KV Cache,避免重复计算。
  5. 对于大规模训练,使用张量并行(Tensor Parallelism)和流水线并行(Pipeline Parallelism)。

如果要对外讲,可以怎么概括

建议结构:

  1. 从动机出发:RNN 的并行性差和长距离依赖问题。
  2. 画出 Encoder-Decoder 架构草图,标注每个组件。
  3. 逐层讲解编码器:Self-Attention -> Add & Norm -> FFN -> Add & Norm。
  4. 讲解解码器与编码器的区别:因果掩码、交叉注意力。
  5. 解释残差连接和层归一化的作用。
  6. 讨论训练和推理流程的差异(teacher forcing vs 自回归)。

常见面试追问:

  • 为什么 FFN 的中间维度是模型维度的 4 倍?(增加非线性容量)
  • 推理时如何加速?(KV Cache、MQA/GQA、量化、推测解码)
  • Transformer 为什么比 RNN 更容易并行化?(没有时序依赖)

最后记几条

  1. 核心创新:完全抛弃 RNN/CNN,仅用注意力机制建模序列——"Attention Is All You Need"。
  2. Encoder-Decoder 分工:编码器双向理解输入,解码器自回归生成输出。
  3. 残差连接 + 层归一化:使深层 Transformer 的训练成为可能。
  4. 位置编码的必要性:注意力本身不编码顺序,必须显式注入位置信息。
  5. O(n^2) 复杂度:这是 Transformer 的核心瓶颈,催生了大量优化工作。

面试高频题

QUESTION Transformer 中 Self-Attention 的复杂度是多少? 时间复杂度 O(n2d)O(n^2 \cdot d),空间复杂度 O(n2)O(n^2),其中 nn 为序列长度,dd 为模型维度。原因是需要计算 n×nn \times n 的注意力矩阵 QKTQK^T。这是 Transformer 处理超长序列时的主要瓶颈。

QUESTION Transformer 为什么比 RNN 更适合并行化? RNN 的每个时间步依赖前一步的隐状态输出,形成严格的时序依赖链,无法并行。Transformer 中 Self-Attention 的所有 QKTQK^T 计算是一次矩阵乘法,所有位置的输出可以同时计算,无需等待其他位置完成。这使得 Transformer 可以充分利用 GPU 的并行计算能力。

QUESTION Transformer 的三个核心组件是什么?

  1. 多头自注意力:token 间的全局信息交互(横向)
  2. 前馈网络 (FFN):每个 token 内部的非线性特征变换(纵向)
  3. 残差连接 + 层归一化:使深层网络可训练的基础设施

QUESTION Transformer 中为什么用 Adam 而非 SGD? Adam 自带自适应学习率(对每个参数维护一阶和二阶矩估计),能更好地处理 Transformer 中不同层梯度量级差异大的问题。SGD 需要更精细的学习率调优,在 Transformer 上训练不稳定。原始 Transformer 使用 Adam + warmup + inverse sqrt 调度。

QUESTION 训练 Transformer 时学习率调度策略是什么? Warmup + Inverse Square Root 调度:前 warmup_steps 步线性增加学习率至峰值 dmodel0.5step0.5d_{model}^{-0.5} \cdot step^{-0.5},之后按步数平方根倒数衰减。公式:lr=dmodel0.5min(step0.5,stepwarmup_steps1.5)lr = d_{model}^{-0.5} \cdot \min(step^{-0.5}, step \cdot warmup\_steps^{-1.5})。warmup 阶段防止初期梯度爆炸,尤其在 Post-Norm 配置下至关重要。

QUESTION Label Smoothing 在 Transformer 中起什么作用? 原始 Transformer 使用 ϵ=0.1\epsilon=0.1 的标签平滑:将目标分布从 one-hot 变为 (1ϵ)(1-\epsilon) 给正确类别,ϵ\epsilon 均匀分配给其他类别。好处:(1) 防止模型过度自信,提高泛化性;(2) 鼓励注意力权重更均匀分布。代价是会略微降低训练 perplexity(因为模型永远无法达到 log(1)=0 的理想 loss)。

QUESTION Transformer 推理时如何加速?

  1. KV Cache:缓存已计算的 Key/Value,避免重复计算
  2. GQA/MQA:减少 KV Cache 大小,降低内存带宽压力
  3. Flash Attention:优化 GPU 内存访问模式
  4. 量化(Quantization):FP16/INT8/INT4 降低计算和存储开销
  5. 推测解码(Speculative Decoding):用小模型并行预测多个 token
  6. 批量推理(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

延伸阅读

延伸阅读

参考资料