Transformer 架构深度剖析
Transformer 是大模型时代一切的技术根基。2017 年 Google 发表的《Attention Is All You Need》提出了这个架构,彻底改变了 NLP 乃至整个深度学习领域的技术路线。本章将从数学原理到工程实现,逐层拆解 Transformer 的每一个组件。
Transformer 是大模型时代一切的技术根基。2017 年 Google 发表的《Attention Is All You Need》提出了这个架构,彻底改变了 NLP 乃至整个深度学习领域的技术路线。本章将从数学原理到工程实现,逐层拆解 Transformer 的每一个组件。
建议先阅读第 01 章
Transformer 总体架构、自注意力机制(Self-Attention)深度解析、多头注意力(Multi-Head Attention)
技术地基 · 大模型核心原理
文章导航
- 引言
- 1. Transformer 总体架构
- 1.1 三种变体
- 1.2 解码器 Transformer 的整体结构
- 2. 自注意力机制(Self-Attention)深度解析
- 2.1 直觉理解
- 2.2 Q、K、V 的计算
- 2.3 注意力分数的计算(Scaled Dot-Product Attention)
- 2.4 因果注意力掩码(Causal Mask)
- 3. 多头注意力(Multi-Head Attention)
- 3.1 为什么需要多头
- 3.2 计算过程
- 3.3 GQA 和 MQA:推理优化
- 4. 位置编码(Positional Encoding)
- 4.1 为什么需要位置编码
- 4.2 正弦位置编码(原始 Transformer)
- 4.3 RoPE(Rotary Position Embedding)
- 4.4 ALiBi(Attention with Linear Biases)
- 5. 前馈网络(Feed-Forward Network, FFN)
- 5.1 标准 FFN
- 5.2 SwiGLU(当前主流)
- 6. 层归一化(Layer Normalization)
- 6.1 标准 LayerNorm
- 6.2 Pre-Norm vs Post-Norm
- 6.3 RMSNorm
- 7. KV Cache:推理加速的关键
- 7.1 问题
- 7.2 解决方案
- 7.3 KV Cache 的内存挑战
- 8. 完整的 Transformer Block
- 9. 本章小结
- 相关章节
- 延伸阅读
点击图中节点可定位到对应正文。
引言
Transformer 是大模型时代一切的技术根基。2017 年 Google 发表的《Attention Is All You Need》提出了这个架构,彻底改变了 NLP 乃至整个深度学习领域的技术路线。本章将从数学原理到工程实现,逐层拆解 Transformer 的每一个组件。
1. Transformer 总体架构
1.1 三种变体
Transformer 有三种架构变体,分别适用于不同场景:
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
编码器-解码器(原始 Transformer)
┌────────────┐ ┌────────────┐
│ 编码器 │→│ 解码器 │→ 输出
│ (Encoder) │ │ (Decoder) │
│ 双向注意力 │ │ 因果注意力 │
└────────────┘ └────────────┘
应用:机器翻译、T5根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
纯编码器(BERT 类)
┌────────────┐
│ 编码器 │→ 输出(分类/表示)
│ (Encoder) │
│ 双向注意力 │
└────────────┘
应用:文本分类、NER、语义搜索根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
纯解码器(GPT 类)
┌────────────┐
│ 解码器 │→ 输出(生成)
│ (Decoder) │
│ 因果注意力 │
└────────────┘
应用:文本生成、对话、代码生成(当前主流 LLM)为什么纯解码器成为主流:
- 自回归生成天然适合对话和创作场景
- 训练目标简单统一(next token prediction)
- 随着规模增大,纯解码器模型展现了最强的通用能力
- GPT 系列的成功验证了这一路线
1.2 解码器 Transformer 的整体结构
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
输入文本 "Hello world"
↓
[Tokenizer] → token IDs: [15496, 995]
↓
[Token Embedding] → 向量序列: [[0.12, -0.34, ...], [0.56, 0.78, ...]]
↓
[+ Positional Encoding] → 注入位置信息
↓
┌─ [Transformer Block × N] ─────────────────────┐
│ │
│ ┌── Multi-Head Self-Attention ──┐ │
│ │ Q, K, V 计算 → 注意力权重 │ │
│ │ → 加权求和 → 多头拼接 │ │
│ └───────────────────────────────┘ │
│ ↓ │
│ [+ Residual Connection + LayerNorm] │
│ ↓ │
│ ┌── Feed-Forward Network ──────┐ │
│ │ Linear → GELU/SwiGLU → Linear │ │
│ └───────────────────────────────┘ │
│ ↓ │
│ [+ Residual Connection + LayerNorm] │
│ │
└─────────────────────────────────────────────────┘
↓
[Output Projection] → 词汇表上的概率分布
↓
[Softmax] → 选择下一个 token2. 自注意力机制(Self-Attention)深度解析
2.1 直觉理解
自注意力的核心思想是:在处理序列中的每个位置时,让它能够"看到"并"关注"序列中的所有其他位置。
以句子"The cat sat on the mat"为例,当模型处理"sat"这个词时:
- 它可能需要关注"cat"来理解"谁"坐了
- 关注"on"来理解坐在"什么上面"
- 关注"mat"来理解坐在"哪里"
注意力机制让模型能够自动学习这些依赖关系。
2.2 Q、K、V 的计算
自注意力使用三个矩阵来描述每个 token 的角色:
对于输入序列中的每个 token,计算三个向量:
Q(Query,查询):这个 token 想"问"什么
K(Key,键):这个 token 能"提供"什么
V(Value,值):这个 token 的实际内容
计算方式:
Q = X × Wq (X: 输入向量, Wq: 查询权重矩阵)
K = X × Wk (Wk: 键权重矩阵)
V = X × Wv (Wv: 值权重矩阵)类比理解(图书馆检索):
- Q = 你脑中的问题("我想找关于猫的书")
- K = 每本书的标签/关键词
- V = 每本书的实际内容
- 注意力分数 = Q 和 K 的匹配程度 → 决定你更关注哪些书
2.3 注意力分数的计算(Scaled Dot-Product Attention)
Attention(Q, K, V) = softmax(QK^T / √d_k) × V
步骤分解:
1. 计算原始注意力分数:
Score = Q × K^T
(每个 Q 与所有 K 做点积,得到 n×n 的注意力矩阵)
2. 缩放:
Score = Score / √d_k
(除以 √d_k 防止点积值过大导致 softmax 梯度消失)
3. Softmax 归一化:
Weights = softmax(Score)
(将分数转换为概率分布,每行和为 1)
4. 加权求和:
Output = Weights × V
(用注意力权重对 V 进行加权求和)数学细节:
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
QK^T: [n × n] 矩阵 → 每行是一个 token 对所有 token 的注意力分数
softmax(QK^T/√d_k): [n × n] 矩阵 → 每行是一个概率分布
Output: [n × d_k] 矩阵 → 每个 token 的新表示2.4 因果注意力掩码(Causal Mask)
在纯解码器 Transformer 中,生成是自回归的——预测第 t 个 token 时,只能看到前 t-1 个 token。通过因果掩码实现:
注意力矩阵(4 个 token 的示例):
无掩码: 有因果掩码:
t1 t2 t3 t4 t1 t2 t3 t4
t1 [1 1 1 1] t1 [1 0 0 0]
t2 [1 1 1 1] t2 [1 1 0 0]
t3 [1 1 1 1] t3 [1 1 1 0]
t4 [1 1 1 1] t4 [1 1 1 1]
1 = 可以关注, 0 = 被掩码(设为 -∞,softmax 后变为 0)3. 多头注意力(Multi-Head Attention)
3.1 为什么需要多头
单头注意力只能学习一种关注模式。多头注意力让模型可以同时关注不同方面的信息:
头 1:可能学习关注语法依赖(主语-动词一致性)
头 2:可能学习关注语义关系(代词指代)
头 3:可能学习关注位置相邻的词
头 4:可能学习关注长距离依赖3.2 计算过程
MultiHead(Q, K, V) = Concat(head₁, ..., headₕ) × Wₒ
其中每个 headᵢ = Attention(Q × Wqᵢ, K × Wkᵢ, V × Wvᵢ)
以 GPT-3 为例:
d_model = 12288(模型维度)
h = 96(注意力头数)
d_k = d_model / h = 128(每个头的维度)
过程:
1. 将 Q, K, V 各分成 96 份
2. 每份独立计算注意力
3. 将 96 个结果拼接
4. 通过一个线性层 Wₒ 融合3.3 GQA 和 MQA:推理优化
Multi-Query Attention (MQA):所有头共享同一组 K 和 V,只有 Q 是多头的
- 优势:KV Cache 大幅减小,推理速度更快
- 劣势:模型能力略有下降
Grouped-Query Attention (GQA):将注意力头分组,每组共享 K 和 V
- 是 MHA 和 MQA 的折中方案
- LLaMA 2 (70B)、Mistral 等模型采用
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
MHA: 每个头独立的 Q, K, V → KV Cache 最大
GQA: 每组共享 K, V → KV Cache 中等
MQA: 所有头共享 K, V → KV Cache 最小4. 位置编码(Positional Encoding)
4.1 为什么需要位置编码
自注意力机制是"置换不变"的——它不区分 token 的顺序。"猫追狗"和"狗追猫"在没有位置编码时会被模型视为相同的输入。位置编码为每个位置注入独特的信息。
4.2 正弦位置编码(原始 Transformer)
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))
pos = token 的位置(0, 1, 2, ...)
i = 维度索引(0, 1, 2, ..., d_model/2)
d_model = 模型维度- 不同维度使用不同频率的正弦/余弦函数
- 相对位置可以通过线性变换从绝对位置推导
- 可以外推到训练时未见过的序列长度(但效果会下降)
4.3 RoPE(Rotary Position Embedding)
当前主流 LLM(LLaMA、Mistral、Qwen、DeepSeek 等)普遍采用 RoPE:
核心思想:将位置信息编码为向量的旋转
对于位置 m 的 token:
q_m = R(θ, m) × W_q × x_m
k_n = R(θ, n) × W_k × x_n
其中 R(θ, m) 是旋转矩阵:
R(θ, m) = diag(cos(mθ₁), cos(mθ₁), cos(mθ₂), cos(mθ₂), ...)
+ diag(-sin(mθ₁), sin(mθ₁), -sin(mθ₂), sin(mθ₂), ...) × P
注意力分数 q_m^T × k_n 自然包含了相对位置 (m-n) 的信息RoPE 的优势:
- 自然编码相对位置
- 可以通过 NTK-aware Scaling 等方法外推到更长的上下文
- 与注意力计算完美结合,不增加额外计算量
4.4 ALiBi(Attention with Linear Biases)
另一种位置编码方案,直接修改注意力分数:
Attention_ij = q_i^T × k_j - m × |i - j|
m 是一个与注意力头相关的斜率参数
|i - j| 是位置距离- 不需要显式的位置编码向量
- 对长序列有天然的长度惩罚
- BLOOM 等模型采用
5. 前馈网络(Feed-Forward Network, FFN)
5.1 标准 FFN
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
即:Linear → ReLU → Linear- FFN 通常占据模型参数量的约 2/3(注意力占 1/3)
- 隐藏层维度通常是模型维度的 4 倍(d_ff = 4 × d_model)
5.2 SwiGLU(当前主流)
LLaMA、Mistral 等模型使用 SwiGLU 激活函数:
SwiGLU(x) = (xW₁ ⊙ Swish(xW₁)) W₂
其中 Swish(x) = x × σ(βx),σ 是 sigmoid 函数
⊙ 是逐元素乘法SwiGLU 相比 ReLU/GELU:
- 性能略有提升(约 1-2% 的困惑度改善)
- 计算量略大,但被更好的性能弥补
- 隐藏层维度调整为 8/3 × d_model
6. 层归一化(Layer Normalization)
6.1 标准 LayerNorm
把公式、变量和含义拆开呈现,便于对照阅读。
LayerNorm(x) = γ × (x - μ) / √(σ² + ε) + βμ = mean(x)均值σ² = variance(x)方差γ, β = 可学习参数缩放和偏移ε = 极小常数防止除以零6.2 Pre-Norm vs Post-Norm
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
Post-Norm(原始 Transformer): Pre-Norm(当前主流 LLM):
x → [Attention] → +x → [LN] → out x → [LN] → [Attention] → +x → out
x → [FFN] → +x → [LN] → out x → [LN] → [FFN] → +x → out6.3 RMSNorm
LLaMA、Mistral 等模型使用 RMSNorm 替代 LayerNorm:
把公式、变量和含义拆开呈现,便于对照阅读。
RMSNorm(x) = x / RMS(x) × γRMS(x) = √(1/d × Σxᵢ²)- 去掉了减去均值的步骤,只保留缩放
- 计算更快(减少一次遍历)
- 实验证明效果与 LayerNorm 相当
7. KV Cache:推理加速的关键
7.1 问题
自回归生成时,每一步都需要对所有之前的 token 计算注意力。如果每次从头计算,计算量会随序列长度平方增长。
7.2 解决方案
缓存之前已经计算过的 K 和 V 向量,新 token 只需要计算自己的 Q、K、V,然后与缓存的 K、V 做注意力计算:
Step t=3, 生成第 4 个 token:
缓存:K_cache = [k₁, k₂, k₃]
V_cache = [v₁, v₂, v₃]
新 token:
q₄ = W_q × x₄
k₄ = W_k × x₄
v₄ = W_v × x₄
注意力 = softmax(q₄ × [K_cache; k₄]^T / √d) × [V_cache; v₄]
更新缓存:
K_cache = [k₁, k₂, k₃, k₄]
V_cache = [v₁, v₂, v₃, v₄]7.3 KV Cache 的内存挑战
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
seq_len = 4096 → KV Cache ≈ 10 GB
seq_len = 128K → KV Cache ≈ 320 GB(需要多张 GPU)这就是为什么长上下文和大模型推理需要大量显存,也是 GQA/MQA 和 PagedAttention 等技术被提出的原因。
8. 完整的 Transformer Block
将所有组件组合起来,一个标准的 Transformer Block(Pre-Norm + RMSNorm + SwiGLU + GQA):
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
def transformer_block(x, K_cache, V_cache):
# 1. 自注意力子层
residual = x
x = RMSNorm(x)
Q = x @ W_q # [seq, d_model] → [seq, d_model]
K = x @ W_k # [seq, d_model] → [seq, kv_dim]
V = x @ W_v # [seq, d_model] → [seq, kv_dim]根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
# 2. FFN 子层
residual = x
x = RMSNorm(x)
x = swiglu_ffn(x) # Linear → SwiGLU → Linear
x = residual + x9. 本章小结
| 组件 | 功能 | 当前主流方案 |
|---|---|---|
| 架构 | 整体结构 | Decoder-only |
| 注意力 | 捕获 token 间关系 | Multi-Head / GQA |
| 位置编码 | 注入位置信息 | RoPE |
| FFN | 非线性特征变换 | SwiGLU |
| 归一化 | 稳定训练 | Pre-Norm + RMSNorm |
| 推理优化 | 加速生成 | KV Cache |
核心洞察: Transformer 的成功在于三个关键设计的结合——自注意力提供了全局信息交互能力,并行计算使得大规模训练成为可能,模块化设计使得模型可以简单地通过堆叠层数来扩展规模。这三个特性共同使得 Transformer 成为了大模型时代的"通用架构"。
相关章节
- 什么是大语言模型 — 先建立对 LLM 的整体认知
- Tokenizer 与文本表示 — Transformer 的输入表示从何而来
- 上下文窗口与长文本 — 注意力机制与长文本处理
- 新兴架构与技术 — Mamba、MoE 等 Transformer 的后继探索
延伸阅读
- Vaswani, A. et al. (2017). "Attention Is All You Need". NeurIPS
- Su, J. et al. (2021). "RoFormer: Enhanced Transformer with Rotary Position Embedding". arXiv:2104.09864
- Press, O. et al. (2022). "Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation". ICLR
- Ainslie, J. et al. (2023). "GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints". EMNLP
- Zhang, B. & Sennrich, R. (2019). "Root Mean Square Layer Normalization". NeurIPS