Transformer 由 Encoder 栈(原始论文 6 层)和 Decoder 栈(6 层)组成。
Encoder 每层包含:
- 多头自注意力(Multi-Head Self-Attention)
- 前馈神经网络(FFN,两层线性 + ReLU/GeLU)
- 残差连接 + Layer Normalization
Decoder 每层多一个 Cross-Attention 子层,额外关注 Encoder 输出;自注意力使用 Causal Mask(下三角掩码)防止"偷看未来"。
现代主流变体:GPT/LLaMA 是 Decoder-Only(去掉 Encoder 和 Cross-Attention);T5/BART 保留完整 Encoder-Decoder。
为什么除以 √d_k?
QK 点积结果的方差约为 d_k(若 Q、K 各分量均值 0、方差 1),随 d_k 增大,点积绝对值变大,softmax 进入极度饱和区(梯度消失)。除以 √d_k 将方差归一化为 1,使 softmax 在可训练区间工作。
多头注意力将 d_model 维度划分为 h 个子空间,每个 head 独立计算注意力后拼接:
优点:
- 多空间建模:不同 head 捕获不同类型的依赖(语法/语义/位置)
- 打破对称性:单头 attention 矩阵可能退化为近对称,泛化差
- 计算量相当:每个 head 的 d_k = d_model/h,总计算量与单头相同
| 方案 | 原理 | 代表模型 |
|---|---|---|
| 绝对正弦位置编码 | sin/cos 固定公式叠加到 Embedding | 原版 Transformer |
| 可学习绝对位置编码 | Embedding 表可训练 | BERT、GPT-2 |
| 相对位置编码(ALiBi) | 在 attention score 上加线性偏置 | BLOOM |
| RoPE | 旋转矩阵编码相对位置,作用于 Q/K | LLaMA、GPT-NeoX |
RoPE 原理:对位置 m 的 query 向量分量 (x_{2i}, x_{2i+1}) 进行旋转变换:
两个位置 m、n 的内积只与相对位置 m−n 有关,天然建模相对位置,且可外推到更长上下文(配合 YaRN/NTK 插值)。
Post-LN(原始 Transformer):残差后才 normalize,梯度在深层容易爆炸,训练不稳定。
Pre-LN(GPT-2/LLaMA):每个子层输入先 normalize,梯度路径稳定,可直接训练深层模型,无需 warm-up 也能收敛。
RMSNorm(进一步简化):去掉均值项,只做方差归一化,更快,LLaMA 使用。
标准自注意力时间复杂度为 O(n²·d),n 为序列长度,空间也是 O(n²)(存储 Attention 矩阵)。
| 方法 | 复杂度 | 思路 |
|---|---|---|
| Sparse Attention | O(n√n) | 只关注局部+全局少数 token |
| Linear Attention | O(n·d) | 核函数近似,不存完整矩阵 |
| FlashAttention | O(n²·d) 计算,O(n) IO | 分块计算,减少 HBM 访问 |
| GQA(Group Query Attn) | - | 多个 Q head 共享 K/V head,减显存 |
| MLA(Multi-head Latent) | - | 低秩压缩 KV,DeepSeek 使用 |
MoE 在 FFN 层用多个"专家网络"替代单一 FFN,通过 Router(门控网络)为每个 token 选 Top-K 个专家激活:
优点:参数量大但计算量可控(每 token 只激活部分专家),如 Mixtral-8×7B 有 47B 参数但每 token 激活 12B。
训练挑战:
- 负载不均衡:部分专家被频繁选择(热门专家),需加辅助损失均衡负载
- 通信开销:分布式训练中专家分散在不同设备,all-to-all 通信昂贵
推理挑战:需要将所有专家权重加载到显存或频繁 IO。DeepSeek-V3 使用 Expert Parallelism 缓解。
1. 标准 FFN(原始 Transformer)
由两层全连接 + 激活函数组成:
其中 $W_1 \in \mathbb{R}^{d_{ff} \times d}$,$W_2 \in \mathbb{R}^{d \times d_{ff}}$,典型设置 $d_{ff} = 4d$。
2. GLU(Gated Linear Unit)变体
引入门控机制,让网络自适应选择信息通道:
其中 $\odot$ 为逐元素乘法,$\sigma$ 为 sigmoid 门控。
3. SwiGLU(LLaMA / PaLM 使用)
将 sigmoid 门替换为 Swish 激活($\text{Swish}(x) = x \cdot \sigma(x)$):
4. GeGLU
将门控函数换为 GELU:
5. 参数量对比
| 变体 | 参数矩阵 | 参数量 | 说明 |
|---|---|---|---|
| 标准 FFN | $W_1, W_2$ | $2 \times d \times 4d = 8d^2$ | 两层全连接 |
| GLU/SwiGLU/GeGLU | $W_1, W_{\text{gate}}, W_2$ | $3 \times d \times \frac{8d}{3} \approx 8d^2$ | 三个矩阵,用 $\frac{8d}{3}$ 作中间维度 |
6. 为什么 GLU 变体更好?
- 门控机制增强特征选择能力:gate 分支学习"哪些特征应该通过"
- 更好的梯度流:相比单一 ReLU,门控可避免 dying neuron
- 实验验证:Noam Shazeer (2020) 论文 "GLU Variants Improve Transformer" 证明 SwiGLU 在几乎所有任务上优于标准 FFN
# PyTorch 实现 SwiGLU FFN
class SwiGLU_FFN(nn.Module):
def __init__(self, d_model, d_ff):
super().__init__()
self.w1 = nn.Linear(d_model, d_ff, bias=False)
self.w_gate = nn.Linear(d_model, d_ff, bias=False)
self.w2 = nn.Linear(d_ff, d_model, bias=False)
def forward(self, x):
return self.w2(F.silu(self.w_gate(x)) * self.w1(x))
F.silu()。1. MHA(Multi-Head Attention)— 基线
$h$ 个独立的 Q/K/V head,每个 head 有独立的投影矩阵:
2. MQA(Multi-Query Attention)
$h$ 个 Q head,但 只有 1 组 K/V(所有 Q head 共享同一组 K 和 V):
优点:KV Cache 缩小 $h$ 倍。缺点:表达能力下降。
3. GQA(Grouped Query Attention)
$h$ 个 Q head,$g$ 组 K/V(每 $h/g$ 个 Q head 共享一组 K/V):
GQA 是 MHA($g = h$)和 MQA($g = 1$)的泛化。
4. KV Cache 大小对比
| 方法 | KV Cache 大小(每层) | 典型模型 |
|---|---|---|
| MHA | $2 \times h \times d_{\text{head}} \times \text{seq}$ | GPT-3, LLaMA-1 |
| MQA | $2 \times 1 \times d_{\text{head}} \times \text{seq}$ | Falcon, PaLM |
| GQA | $2 \times g \times d_{\text{head}} \times \text{seq}$ | LLaMA-2 70B (g=8) |
总 KV Cache = 上述值 × $L$(层数)× batch_size × bytes_per_element
5. 具体例子
| 模型 | 头数 h | KV 组数 g | 方法 | KV Cache 压缩比 |
|---|---|---|---|---|
| LLaMA-2 7B | 32 | 32 | MHA | 1× |
| LLaMA-2 70B | 64 | 8 | GQA | 8× |
| Falcon-40B | 64 | 1 | MQA | 64× |
| Mistral-7B | 32 | 8 | GQA | 4× |
6. 从 MHA 转换到 GQA 的方法
训练好的 MHA 模型可以通过 mean pooling 将多个 KV head 合并为一组:
合并后继续 fine-tune 一小段即可恢复性能(LLaMA-2 论文方法)。
1. 动机
即使使用 GQA,KV Cache 仍然很大。以 LLaMA-2 70B 为例:
MLA 的目标:将 KV Cache 压缩到更小的隐变量,不受 head 数量限制。
2. 核心思想:低秩压缩
将每个 token 的 KV 压缩到一个低维隐变量 $c_t$:
推理时只需缓存 $c_t$,需要时再解压回完整的 K 和 V:
3. 完整流程(DeepSeek-V2)
- 压缩:$c_t^{KV} = W^{DKV} h_t$($d_c = 512$,原始 KV 维度可能是 $n_h \times d_h = 128 \times 128 = 16384$)
- 缓存:推理时只存 $c_t^{KV}$,大小仅 $d_c$ 维
- 解压:Attention 计算时 $K = W^{UK} c_t^{KV}$,$V = W^{UV} c_t^{KV}$
- Q 侧也压缩:$c_t^Q = W^{DQ} h_t$,$Q = W^{UQ} c_t^Q$(但 Q 不需要缓存)
4. RoPE 兼容问题与 Decoupled RoPE
RoPE 需要作用在 K 上,但压缩后的 $c_t$ 无法直接应用 RoPE。DeepSeek 的解决方案:
即额外学习一个小的 $W^{KR}$ 投影(维度很小,如 64),专门承载位置信息。缓存时额外存储这个 RoPE 部分。
5. 对比 GQA vs MLA
| 维度 | GQA | MLA |
|---|---|---|
| 压缩方式 | 共享 KV head(离散分组) | 低秩投影(连续压缩) |
| 压缩比灵活性 | 受 $g$ 限制(g=1,2,4,8...) | $d_c$ 可连续调节 |
| 缓存大小/token/层 | $2 \times g \times d_h$ | $d_c + d_{\text{rope}}$ |
| DeepSeek-V2 实际 | — | $512 + 64 = 576$(vs MHA 的 16384) |
| 表达能力 | 受限于 group 粒度 | 更高(低秩近似全 KV) |
1. Full Attention(标准自注意力)
每个 token 关注序列中所有其他 token。适合短序列,但长序列成本极高。
2. Sliding Window Attention(Mistral/Longformer)
每个 token 只关注其前后 $W$ 个 token:
信息可通过多层传播:$L$ 层后的有效感受野 = $L \times W$。
3. Dilated Attention
间隔采样关注位置(类似空洞卷积),扩大感受野而不增加计算:
可与 sliding window 组合使用(Longformer 策略)。
4. Cross Attention
Q 来自一个序列(decoder),K/V 来自另一个序列(encoder):
用途:Encoder-Decoder 架构(T5、BART)、多模态(图像 token → 文本 decoder)。
5. Prefix Attention(Prefix Tuning)
前 $p$ 个 prefix token 可被所有位置看到(不受 causal mask 限制),实现 soft prompt:
6. 全面对比
| Attention 类型 | 复杂度 | 感受野 | 典型模型 | 适用场景 |
|---|---|---|---|---|
| Full | $O(n^2)$ | 全局 | GPT-3, LLaMA | 短/中等序列 |
| Sliding Window | $O(n \cdot W)$ | 局部 $W$ | Mistral, Longformer | 长序列 |
| Dilated | $O(n \cdot W/d)$ | $W \times d$ | Longformer (global+local) | 超长文档 |
| Cross | $O(n \cdot m)$ | 全局跨序列 | T5, Flamingo | Enc-Dec / 多模态 |
| Prefix | $O(n^2)$ | prefix 全局 | Prefix Tuning | 高效微调 |
| Sparse (BigBird) | $O(n \cdot \sqrt{n})$ | 局部+全局+随机 | BigBird | 长文档理解 |
1. ReLU(Rectified Linear Unit)
- 优点:计算简单,无梯度消失(正区间)
- 缺点:dying neuron 问题 — 一旦输入为负,梯度永远为 0,神经元"死亡"
2. GELU(Gaussian Error Linear Unit)
近似公式(实际使用):
直觉:用概率(标准正态 CDF)来"软性截断"输入,越大的输入越可能通过。
3. Swish / SiLU(Sigmoid Linear Unit)
自门控(self-gating):输入本身决定自己的通过程度。
4. 性质对比
| 性质 | ReLU | GELU | SiLU/Swish |
|---|---|---|---|
| 平滑性 | 不平滑(0 处不可导) | 平滑 | 平滑 |
| 负区间输出 | 恒为 0 | 接近 0(非零) | 接近 0(可为负) |
| 梯度 | 阶跃函数 | 连续 | 连续 |
| 计算成本 | 最低 | 中等 | 中等 |
| Dying neuron | 有 | 无 | 无 |
5. 为什么 GELU/SiLU 更好?
- 平滑非零梯度:负输入区域仍有微小梯度,避免 dying neuron
- 概率化截断:不是硬截断(ReLU),而是软性选择
- 自门控特性(SiLU):自动根据输入大小调整通过率
- 实验验证:在大规模预训练中始终优于 ReLU
6. 各模型使用情况
| 模型 | 激活函数 | 位置 |
|---|---|---|
| 原始 Transformer | ReLU | FFN |
| BERT / GPT-2 | GELU | FFN |
| GPT-3 | GELU | FFN |
| LLaMA / LLaMA-2/3 | SiLU (in SwiGLU) | FFN gate |
| PaLM | SiLU (in SwiGLU) | FFN gate |
| Mistral / Mixtral | SiLU (in SwiGLU) | FFN gate |
| Gemma | GELU (in GeGLU) | FFN gate |
1. 参数量公式(Decoder-Only,如 LLaMA)
Embedding 层:
其中 $V$ 为词表大小,$d$ 为隐藏维度。
每层 Attention:
若使用 GQA($g$ 组 KV),则:$P_{\text{attn}} = d^2 + 2 \times g \times d_h \times d + d^2 = 2d^2 + 2gd_h d$
每层 FFN(SwiGLU):
每层 RMSNorm:
总参数量(简化,$d_{ff} = 4d$,标准 FFN):
对于大模型,Embedding 占比很小,总参数 ≈ $12Ld^2$。
2. FLOPs 公式
每 token 前向 FLOPs:
直觉:每个参数做一次乘法和一次加法 ≈ 2 FLOPs。
训练总 FLOPs(前向 + 反向 + 激活重计算):
其中 $N$ = 参数量,$D$ = 训练 token 数。系数 6 = 前向(2) + 反向(4)。
3. 具体例子:LLaMA 系列
| 模型 | $d$ | $L$ | $h$ | $d_{ff}$ | 总参数量 | 训练 token | 训练 FLOPs |
|---|---|---|---|---|---|---|---|
| LLaMA-7B | 4096 | 32 | 32 | 11008 | 6.7B | 1T | ~4×10²² |
| LLaMA-13B | 5120 | 40 | 40 | 13824 | 13B | 1T | ~7.8×10²² |
| LLaMA-70B | 8192 | 80 | 64 | 28672 | 70B | 2T | ~8.4×10²³ |
4. 参数分布(以 LLaMA-7B 为例)
| 组件 | 参数量 | 占比 |
|---|---|---|
| Token Embedding | 32000 × 4096 = 131M | ~2% |
| Attention (所有层) | 32 × 4 × 4096² = 2.1B | ~32% |
| FFN (所有层) | 32 × 3 × 4096 × 11008 = 4.3B | ~65% |
| RMSNorm + lm_head | ~131M | ~2% |
1. Word Embedding + Position Embedding
原始 Transformer 使用加法组合:
其中 Word Embedding 为可学习的 $V \times d$ 矩阵,Position Embedding 有两种:
- 绝对位置编码(正弦/余弦 或 可学习):加到 input embedding 上
- 相对位置编码(RoPE、ALiBi):注入到 attention 计算中
2. Tied Embeddings(权重绑定)
输入 Token Embedding($W_E$)和输出 lm_head($W_{LM}$)共享权重:
为什么 Tie?
- $W_E$:token → 向量空间(编码语义)
- $W_{LM}$:向量空间 → token 概率(解码语义)
- 两者本质都是 token ↔ 向量空间的映射,共享可减少参数且正则化
节省参数量:$V \times d$(如 32000 × 4096 = 131M)。
3. LLaMA 为什么不 Tie?
- vocab 扩展时输入/输出可能需要不同维度
- Untied 给予两端独立学习能力,可能提升性能
- 大模型中 embedding 参数占比很小(~2%),节省不明显
- 部分实验表明 untied 在大规模预训练中效果更好
| 模型 | 是否 Tied | 说明 |
|---|---|---|
| BERT / GPT-2 | ✅ Tied | 经典做法,节省参数 |
| T5 | ✅ Tied | Encoder-Decoder 共享 |
| LLaMA 1/2/3 | ❌ Untied | 独立 lm_head |
| Mistral | ❌ Untied | 同 LLaMA |
| Qwen-2 | ✅ Tied | 节省参数 |
| Gemma | ✅ Tied | Google 风格 |
4. RoPE 的应用位置
RoPE 不作用在 embedding 层,而是在每层 attention 的 Q 和 K 上:
这样 $Q_m'^T K_n' = Q_m^T R_m^T R_n K_n = Q_m^T R_{n-m} K_n$,自动编码相对位置 $n-m$。
5. Token Embedding 的初始化策略
- 标准正态 $\mathcal{N}(0, 0.02^2)$(GPT-2 style)
- 均匀分布 $U(-\sqrt{1/d}, \sqrt{1/d})$(PyTorch 默认)
- 截断正态(避免极端值)
1. Warmup + Cosine Decay(最主流)
2. Warmup + Linear Decay
简单但效果略逊于 cosine。GPT-3 论文使用此方案。
3. WSD(Warmup-Stable-Decay)— DeepSeek-V3
三阶段策略:
优势:Stable 阶段可灵活延长训练而无需预先确定总步数。
4. Warmup 的必要性
- 初始阶段参数随机,梯度方向不稳定且范数大
- 大 lr + 不稳定梯度 → loss spike → 训练崩溃
- Warmup 让模型先"热身",参数进入合理区域后再用全力学习
- Adam 优化器的二阶矩估计需要几步才能稳定
5. 典型超参数
| 超参 | 典型值 | 说明 |
|---|---|---|
| Warmup steps | 2000 | 约为总步数的 0.1%-1% |
| Peak lr | 3×10⁻⁴ | AdamW,取决于模型大小 |
| Min lr | peak/10 = 3×10⁻⁵ | Cosine 最低点 |
| Weight decay | 0.1 | LLaMA 标配 |
| Adam β | (0.9, 0.95) | LLM 常用 |
6. Batch Size Warmup 与 LR Warmup 的关系
- 有些训练先用小 batch 再逐步增大(batch size warmup)
- 效果类似 lr warmup:初期低有效学习率 = 小 batch × 低 lr
- 可以减少初期浪费的计算(小 batch 少算 token,但梯度方差大)
- DeepSeek-V3 使用 batch size 从 3072 → 15360 逐步增加
# PyTorch CosineAnnealingWarmRestarts with Warmup
from torch.optim.lr_scheduler import LambdaLR
import math
def get_cosine_schedule_with_warmup(optimizer, warmup_steps, total_steps, min_lr_ratio=0.1):
def lr_lambda(step):
if step < warmup_steps:
return step / warmup_steps
progress = (step - warmup_steps) / (total_steps - warmup_steps)
return min_lr_ratio + (1 - min_lr_ratio) * 0.5 * (1 + math.cos(math.pi * progress))
return LambdaLR(optimizer, lr_lambda)
1. 原始 Transformer 中的 Dropout
Vaswani et al. (2017) 在三个位置使用 dropout(rate = 0.1):
- Attention dropout:softmax 后的注意力权重
- FFN dropout:FFN 隐藏层激活后
- Residual dropout:残差连接中子层输出加回前
2. 现代大模型为什么去掉 Dropout?
| 原因 | 解释 |
|---|---|
| 数据量极大 | 训练数据 1-15T tokens,模型只见过一次,过拟合风险极低 |
| BF16 数值问题 | Dropout mask 的随机性与混合精度训练的数值精度冲突 |
| 训练不稳定 | 大模型 + dropout 的随机性组合导致梯度方差过大 |
| 正则化需求减少 | 模型参数量极大时,本身就有隐式正则化效果 |
| 确定性更好 | 去掉后前向计算确定,便于 debug 和复现 |
3. 不使用 Dropout 的主流模型
| 模型 | Dropout | 正则化替代 |
|---|---|---|
| GPT-3 (175B) | ❌ 0.0 | Weight decay |
| LLaMA 1/2/3 | ❌ 0.0 | Weight decay 0.1 |
| Mistral/Mixtral | ❌ 0.0 | Weight decay |
| DeepSeek-V2/V3 | ❌ 0.0 | Weight decay + z-loss |
| PaLM | ❌ 0.0 | Weight decay + z-loss |
4. 何时仍然需要 Dropout?
- 小模型(<1B):参数有限,数据可能复用多次
- 数据有限的 fine-tuning:如只有几千条数据的 SFT,需要防过拟合
- 分类/NLU 微调:BERT-style 任务,数据远少于模型容量
- 推荐在 LoRA fine-tuning 中使用 dropout(LoRA 论文建议 0.05)
5. 替代正则化方法
- Weight Decay:$L_2$ 正则,惩罚大权重,LLM 标配(通常 0.1)
- Data Augmentation:更多/更好的数据本身就是最好的正则化
- Z-loss:$\lambda \cdot \log^2 Z$,稳定 softmax 的 log partition function
- Gradient Clipping:限制梯度范数(间接防止过拟合不稳定)
1. 基本原理
梯度直接从输出流向输入,不经过 $F$:
即使 $\frac{\partial F}{\partial x} \to 0$,梯度仍有 $I$(恒等项),不会消失。
2. 深度分析
(a)指数多子网络的集成
$L$ 层残差网络等价于 $2^L$ 个不同深度子网络的集成(Veit et al., 2016):
这使得网络对单层删除具有鲁棒性。
(b)Pre-LN + Residual 使各层贡献近似独立
由于 LN 将输入归一化,各层的 $F_l$ 接收的输入量级相似,贡献近似独立。
(c)Identity shortcut 保证梯度下限
展开后每一项都包含直连的 $I$ 路径。
3. Post-LN vs Pre-LN
| 结构 | 公式 | 特点 |
|---|---|---|
| Post-LN | $\text{LN}(x + F(x))$ | 原始 Transformer;训练不稳定但收敛精度可能更高 |
| Pre-LN | $x + F(\text{LN}(x))$ | LLaMA 等现代模型;训练更稳定,梯度范数更均匀 |
4. DeepNet — 训练超深网络(微软,2022)
引入 $\alpha$ 缩放因子使 1000 层训练成为可能:
其中 $\alpha > 1$(如 $(2L)^{1/4}$),让残差路径占主导,子层贡献被缩小。
同时配合 $\beta$-初始化:子层输出权重初始化为 $\beta \cdot \mathcal{N}(0, \sigma^2)$,$\beta < 1$。
5. 残差在 Transformer 中的应用位置
- Attention 子层:$x + \text{Attn}(\text{LN}(x))$
- FFN 子层:$x + \text{FFN}(\text{LN}(x))$
- 每层两次残差连接,$L$ 层共 $2L$ 次
1. 问题:数值溢出
朴素 softmax:
当 $x_i$ 较大时,$e^{x_i}$ 会溢出:
- FP16:$e^{11.09} = 65504$(最大值),$x > 11$ 即 overflow → Inf
- BF16:$e^{88.7}$ 即 overflow
- FP32:$e^{88.7}$ 即 overflow
2. Safe Softmax(标准解决方案)
利用 softmax 的平移不变性:$\text{softmax}(x) = \text{softmax}(x - c)$
减去最大值后,最大指数为 $e^0 = 1$,永远不会 overflow。
# Safe softmax 实现
def safe_softmax(x):
x_max = x.max(dim=-1, keepdim=True).values
exp_x = torch.exp(x - x_max)
return exp_x / exp_x.sum(dim=-1, keepdim=True)
3. Online Softmax(FlashAttention 核心算法)
传统方法需要三遍扫描:
- 第一遍:计算 $m = \max(x)$
- 第二遍:计算 $\sum e^{x_i - m}$
- 第三遍:计算 $\frac{e^{x_i - m}}{\sum e^{x_j - m}}$
Online Softmax 实现一遍扫描(Milakov & Gimelshein, 2018):
当新块到来时,需要修正之前的结果:
FlashAttention 利用 Online Softmax 实现分块计算:
# FlashAttention 伪代码(核心循环)
m_i = -inf # running max
l_i = 0 # running sum
O_i = 0 # running output
for block_j in K_blocks:
S_ij = Q_i @ K_j.T / sqrt(d)
m_new = max(m_i, S_ij.max())
# 修正之前的结果
correction = exp(m_i - m_new)
l_new = l_i * correction + exp(S_ij - m_new).sum()
O_i = O_i * (l_i * correction / l_new) + (exp(S_ij - m_new) / l_new) @ V_j
m_i = m_new
l_i = l_new
4. Log-Sum-Exp Trick(loss 计算)
计算 $\log \sum e^{x_i}$(如 cross-entropy loss 中的 log-partition):
避免先算 $\sum e^{x_i}$(可能 overflow)再取 log。
1. Xavier / Glorot 初始化(2010)
目标:保持前向和反向传播中信号方差不变。
适用于线性激活 / tanh / sigmoid。
2. Kaiming / He 初始化(2015)
针对 ReLU 修正(ReLU 会将一半输出置零):
保证每层输出方差 = 输入方差(考虑 ReLU 的因子 2)。
3. GPT-2 的残差层缩放
问题:$L$ 层残差累加后方差增长为 $L$ 倍。解决:
对每层 Attention 和 FFN 的输出投影层($W_O$ 和 $W_2$)做缩放,使残差路径方差增长被控制。
4. muP(Maximal Update Parameterization)
核心目标:使超参数(尤其学习率)可以从小模型迁移到大模型。
| 参数类型 | 标准参数化 (SP) | muP |
|---|---|---|
| Embedding | $\mathcal{N}(0, 1)$ | $\mathcal{N}(0, 1)$(不变) |
| Hidden layers | $\mathcal{N}(0, 1/d)$ | $\mathcal{N}(0, 1/d)$,lr × $1/d$ |
| Output layer | $\mathcal{N}(0, 1/d)$ | $\mathcal{N}(0, 1/d)$,lr × $1/d$ |
| 学习率缩放 | 所有层相同 lr | 不同层 lr ∝ $1/\text{width}$ |
关键洞察:SP 下最优 lr 随宽度变化;muP 下最优 lr 与宽度无关。
5. 为什么 Attention 输出层需要特殊初始化?
- Attention 输出 + FFN 输出通过残差累加 $2L$ 次
- 如果每次加入的方差都是 $O(1)$,输出方差 = $O(L)$,导致后面层的梯度不稳定
- 解决:输出投影初始化方差 ∝ $1/L$(或 $1/\sqrt{2L}$)
6. DeepSeek 的 Zero Init for Output Projection
效果:训练初始时每层贡献为 0($F(x) = 0$),网络退化为恒等映射 $y = x$。随着训练逐渐学习有意义的变换。
优势:
- 初始 loss = 纯 embedding 的 loss(可预测的起点)
- 训练极稳定,不需要复杂的 warmup
- 与 Pre-LN 配合效果最好
7. 实践总结
| 模型 | 初始化策略 |
|---|---|
| GPT-2 | $\mathcal{N}(0, 0.02)$,输出层 $/\sqrt{2L}$ |
| LLaMA | $\mathcal{N}(0, 0.02)$,RMSNorm 初始化为 1 |
| DeepSeek-V2 | 部分层 zero init |
| Cerebras-GPT (muP) | 宽度自适应初始化 + 自适应 lr |
1. 并行性
Transformer 在训练时可以对序列内所有位置同时计算,GPU 利用率极高。
2. 长距离依赖
- RNN:信息需要通过 $O(n)$ 步传递,梯度指数衰减(vanishing gradient)
- LSTM:通过 cell state 缓解,但仍是 $O(n)$ 路径
- Transformer:Attention 直接连接任意两个位置,路径长度 $O(1)$
3. 训练效率
| 维度 | RNN/LSTM | Transformer |
|---|---|---|
| 前向传播 | 顺序 $O(n)$ 步 | 并行一次完成 |
| 反向传播 | BPTT 顺序展开 | 完全并行 |
| GPU 利用率 | 低(顺序瓶颈) | 高(矩阵乘法) |
| 训练吞吐 | 慢 10-100× | 基准 |
4. 推理效率(Transformer 的弱点)
| 维度 | RNN/LSTM | Transformer |
|---|---|---|
| 每步推理计算 | $O(d^2)$(恒定) | $O(n \cdot d)$(随序列增长) |
| 状态大小 | $O(d)$(固定 hidden state) | $O(n \cdot d)$(KV Cache 线性增长) |
| 生成第 n 个 token | $O(1)$ 额外成本 | $O(n)$ 额外成本 |
5. 新一代架构:试图结合两者优势
Mamba (S4/SSM 系列):
- 训练时可以展开为卷积(并行)
- 推理时用递推($O(1)$ per step,像 RNN)
- 选择性机制(input-dependent $\bar{A}, \bar{B}$)模拟 attention 的动态性
RWKV:
- 线性 attention 变体 + time decay
- 训练并行(矩阵形式),推理递推(RNN 形式)
6. 全面对比表
| 特性 | Transformer | RNN/LSTM | SSM (Mamba) |
|---|---|---|---|
| 训练并行度 | ✅ 完全并行 | ❌ 顺序 | ✅ 卷积并行 |
| 训练复杂度 | $O(n^2 d)$ | $O(n d^2)$ | $O(n d)$ |
| 推理每步 | $O(n d)$ | $O(d^2)$ | $O(d^2)$ (状态固定) |
| 长距离建模 | ✅ 强($O(1)$ 路径) | ❌ 弱(梯度衰减) | ⚡ 中等(选择性) |
| 状态/内存 | $O(n)$ KV Cache | $O(1)$ hidden state | $O(1)$ 状态 |
| GPU 友好度 | ✅ 矩阵乘法 | ❌ 循环依赖 | ✅ scan/conv |
| In-context learning | ✅ 强 | ❌ 弱 | ⚡ 有限 |
| 可解释性 | 中(attention map) | 低 | 低 |
| 代表模型 | GPT-4, LLaMA | ELMo, 旧 NMT | Mamba-2, Jamba |
7. 为什么 Transformer 最终胜出?
- GPU 硬件适配:矩阵乘法是 GPU 最擅长的操作
- Scaling Law:Transformer 的性能随规模可预测地提升
- In-context Learning:注意力机制天然支持 few-shot
- 工程生态:FlashAttention、vLLM 等优化使 Transformer 推理也越来越快
Causal LM(自回归,GPT 系列):给定前 t−1 个 token,预测第 t 个 token。损失为交叉熵:
Masked LM(BERT):随机 mask 15% token,预测被 mask 的词;双向注意力,不能直接做生成。
| Causal LM | Masked LM | |
|---|---|---|
| 注意力方向 | 单向(左到右) | 双向 |
| 适合任务 | 文本生成、对话 | 理解、分类、NER |
| 代表模型 | GPT、LLaMA、Qwen | BERT、RoBERTa |
OpenAI Scaling Law(Kaplan et al.):模型 Loss 与模型参数量 N、数据量 D、计算量 C 之间满足幂律关系。
Chinchilla Scaling Law(Hoffmann et al.):在固定计算预算 C 下,最优分配是 N ≈ D(参数量约等于 token 数),即 1B 参数需约 20B tokens。
实践指导:不要一味扩大模型,同等算力下同比增加数据和参数更优。LLaMA 系列有意"欠训练参数"但"过训练数据",以获得更强推理效率比。
主要流程:
- 语言检测:fastText 识别语种,过滤低质量混合语言
- 规则过滤:去除广告、乱码、重复符号;过滤极短/极长文档
- MinHash 去重:局部敏感哈希(LSH)+Jaccard 相似度,去除近重复文档(n-gram 级别)
- 质量打分:用小型分类器(如 fastText 训练)筛选高质量内容(Wikipedia 风格)
- 毒性过滤:基于关键词词典或分类器去除有害内容
| 算法 | 核心思路 | 代表模型 |
|---|---|---|
| BPE(Byte Pair Encoding) | 迭代合并最高频字节对,自底向上构建词表 | GPT-2、Qwen、Llama |
| WordPiece | 类 BPE,但合并标准是最大化语言模型似然 | BERT |
| SentencePiece + Unigram | 基于 Unigram 语言模型的统计分词,与语言无关 | T5、mBART |
中文特点:字粒度 tokenize 词表小但序列长;子词方案更灵活,现代模型通常混合 Byte-level BPE,将任意字节都能编码(无 UNK)。
| 策略 | 解决问题 | 通信量 |
|---|---|---|
| 数据并行(DP) | 吞吐量不够,单卡能放下整个模型 | 梯度 AllReduce |
| 张量并行(TP) | 单层参数太大单卡放不下(如 FFN、Attn 分列并行) | 每层 AllReduce |
| 流水线并行(PP) | 层数太多,按层切分到不同设备 | micro-batch P2P |
| 序列并行(SP) | 超长序列,Attention 的 N² 显存 | 按序列切分 |
| ZeRO(DeepSpeed) | 优化器状态/梯度/参数显存 | Stage 1/2/3 可选 |
实际大规模训练(如 GPT-4)通常是 DP × TP × PP 三维混合并行。
SFT 流程:在预训练基座上,用指令-回答对继续训练,教模型"遵从指令"。
- 构建高质量指令数据:<System><Human><Assistant> 三元组格式
- 只对 Assistant 回答部分计算 loss,System/Human 部分 mask 掉
- 通常训练 1~3 个 epoch,学习率 1e-5 ~ 2e-5,防止过拟合
数据质量 > 数量:InstructGPT 仅用 1.3 万条高质量人工标注,效果远超低质量百万条数据。
三阶段流程:
- SFT:基座 → 指令微调模型
- RM(奖励模型)训练:收集同一 prompt 下多个回答的人类偏好排序,用 BradleyTerry 模型训练:
$$\mathcal{L}_\text{RM}=-\log\sigma\!\left(r(y_w)-r(y_l)\right)$$y_w 为人类更偏好的回答,y_l 为较差回答
- PPO 强化学习优化:用 RM 打分作为 reward,用 PPO 更新策略模型,同时加 KL 散度惩罚防止偏离 SFT 模型:
$$R=r_\theta(x,y)-\beta\cdot\mathrm{KL}(\pi_\theta\|\pi_\text{ref})$$
DPO 绕过了显式奖励模型和 PPO,直接用偏好数据优化策略模型:
| RLHF+PPO | DPO | |
|---|---|---|
| 是否需要 RM | 是 | 否 |
| 训练稳定性 | 较难,超参多 | 简单,类 SFT |
| 效果 | 灵活性更高 | 略逊但工程简单 |
| 计算成本 | 高(4 个模型同时在线) | 低(2 个模型) |
LoRA(Low-Rank Adaptation):冻结原始权重 W₀,在其旁边并联两个低秩矩阵 A(d×r)和 B(r×d):
推理时合并 ΔW,无额外延迟。训练参数量仅为原始的 0.1%~1%。
QLoRA:将基础模型用 NF4(4-bit Normal Float)量化存储,LoRA 权重用 BF16 训练,通过双重量化和分页优化器实现在单卡 48GB 上微调 65B 模型。
| LoRA | QLoRA | |
|---|---|---|
| 基础模型精度 | FP16/BF16 | NF4 量化 |
| 显存需求 | ~2×基础 | 比 LoRA 少 50%+ |
| 精度损失 | 极小 | 略有损失 |
CoT 通过在 prompt 中提供逐步推理示例,引导模型输出中间推理步骤,显著提升复杂推理任务(数学、逻辑)的准确率。
- Few-shot CoT:在 prompt 中给几个"问题+思维链+答案"示例
- Zero-shot CoT:直接在 prompt 后加"Let's think step by step"
- Self-Consistency:对同一问题采样多条推理路径,多数票选结果
- 训练时蒸馏:用 CoT 数据做 SFT,让模型内化推理能力(o1 / R1 路线)
自回归推理中,每步生成新 token 时,旧 token 的 Key 和 Value 计算结果不变,KV Cache 缓存这些结果,避免重复计算。
无 KV Cache:生成第 t 个 token 需对前 t 个 token 重新计算 attention,总复杂度 O(n²)。
有 KV Cache:每步只计算新 token 的 Q,用缓存的 K/V,每步 O(n),总复杂度 O(n²) → 每步 O(n)。
显存代价:KV Cache 大小 = 2 × layers × n_heads × d_head × seq_len × precision,长序列时可能超过模型本身显存。
问题:标准 Attention 需要将 n×n 的注意力矩阵写入 HBM(GPU 高带宽内存),IO 成为瓶颈。
FlashAttention 思想:分块计算 + Online Softmax
- 将 Q/K/V 按行分块,每块加载到 SRAM(片上缓存)
- 用 Online Softmax 算法(Milakov & Gimelshein)逐块更新 softmax,无需存完整矩阵
- 计算完整 Attention 但 只写回最终输出 O,中间矩阵不写 HBM
效果:计算量不变(仍 O(n²)),但 IO 降到 O(n),实测 2~4× 加速,显存从 O(n²) 降到 O(n)。
问题:传统 LLM 服务为每个请求预分配最大长度的 KV Cache,造成大量显存碎片和浪费(利用率 <20%)。
PagedAttention:借鉴操作系统虚拟内存分页思想:
- KV Cache 按固定大小 Block(如 16 tokens)分配
- 通过 Block Table 映射逻辑块→物理块(类似页表)
- Block 支持多请求写时复制(CoW)共享(prefix sharing)
效果:显存碎片几乎为 0,支持 Continuous Batching(不同长度请求动态合并),吞吐量提升 2~24×。
量化原理:将浮点权重/激活映射到低精度整数:
| INT8 | INT4 | |
|---|---|---|
| 显存压缩 | ~4×(vs FP32) | ~8× |
| 精度损失 | 极小 | 中等,需仔细校准 |
| 硬件支持 | 广泛 | 需 A100/H100 Tensor Core |
PTQ(Post-Training Quantization):训练后直接量化,不需重新训练,速度快但精度可能有损。代表:GPTQ、AWQ。
QAT(Quantization-Aware Training):训练时模拟量化误差,精度更高,但需要训练成本。
用小模型(草稿模型)快速生成 k 个候选 token,再用大模型并行验证,接受/拒绝每个 token:
- 小模型(草稿模型)自回归生成 k 个 token(快)
- 大模型对 k+1 个位置并行 forward(一次)
- 按接受率公式(rejection sampling)决定接受哪些 token
- 拒绝的位置重采样,从该位置继续
效果:大模型的期望加速比取决于小模型与大模型的对齐程度,通常 2~3×,且不改变输出分布(与大模型完全一致)。
前向过程(加噪):逐步向数据 x₀ 添加高斯噪声,经 T 步后趋近标准高斯分布:
任意时刻可直接采样:
反向过程(去噪):学习神经网络 ε_θ(x_t, t) 预测噪声,逐步去噪恢复 x₀:
LDM 核心思想:在 VAE 的隐空间(Latent Space)而非像素空间做扩散,大幅减少计算量。
SD 主要组件:
- VAE Encoder/Decoder:图像 → 4×64×64 latent(压缩因子 8)
- U-Net(去噪网络):在 latent 空间预测噪声,backbone 含 ResBlock + Cross-Attention
- CLIP Text Encoder:文本提示 → 条件向量,通过 Cross-Attention 注入 U-Net
- Scheduler:控制去噪步数和采样策略(DDIM、DPM-Solver)
VAE 用 Encoder 将输入 x 编码为隐变量 z 的概率分布(均值 μ 和方差 σ²),再用 Decoder 从 z 重建 x,通过重参数化技巧实现可微分采样。
ELBO 损失:
- 重建项:−E[log p(x|z)],使 Decoder 重建准确
- KL 散度项:使编码分布接近先验 N(0,I),保证隐空间结构性
重参数化技巧:z = μ + σ·ε(ε ~ N(0,I)),使梯度可以流过采样步骤。
GAN 包含 生成器 G 和 判别器 D,博弈训练:
训练不稳定原因:
- 模式崩溃:G 只生成少数样本以骗过 D
- 梯度消失:D 太强时,G 的梯度接近 0
- 非收敛振荡:G/D 交替更新可能循环震荡
改进:
- WGAN:用 Wasserstein 距离替代 JS 散度,Lipschitz 约束(梯度裁剪/梯度惩罚)
- StyleGAN:映射网络 + AdaIN,控制不同层次的风格
- 渐进式训练:从低分辨率逐渐增大,稳定训练
Flow Matching 直接学习从噪声到数据的确定性速度场(ODE),而非 SDE(扩散模型):
训练目标:让模型预测的速度场与简单插值路径(如线性路径)的速度一致:
优势:
- 训练目标更简单直接,无需复杂噪声调度
- 可用更少步数(8~16 步)生成高质量图像
- Stable Diffusion 3、FLUX、字节 Wan 等均使用
DDPM 的马尔科夫链定义了展开后验概率 q(x₁:T|x₀),采样是随机的。DDIM 将前向过程重定义为一类非马尔科夫零方差过程:
当 η=0 时采样过程完全确定性,同一初始噪声 x_T 永远得到相同输出。
优势:
- 采样步数可从 1000 降至 20~50 步,速度提升 20-50×
- 确定性采样利于图像编辑(interpolation):在 latent 空间线性插值即可得到语义过渡
- 共享训练好的 DDPM 权重,无需重训练
CFG 公式:
w 为 Guidance Scale,等价于在条件方向上拉长梯度。
训练方式:随机以 10%~20% 概率丢弃 condition(设为空字符串),训练同一个 U-Net 同时学有条件/无条件两种路径。
过饱和原因:w 过大时,梯度方向被过度放大,模型强行生成与 condition 最相关且概率最高的像素,导致颜色饱和、细节丢失、artifact 增加。
| 调度 | 公式/特点 | 适用场景 |
|---|---|---|
| Linear (DDPM) | β_t 线性从 1e-4 到 0.02 | 基础实验 |
| Cosine (improved DDPM) | ᾱ_t = cos²(πt/2T),低 t 整流冠写效果更轻对称 | 高分辨率图像 |
| EDM (逸收编方) | 用 σ 直接描述噪声级别,去掉 T 离散概念 | SD3/FLUX |
| Linear Flow | Flow Matching 的线性路径,最简单直接 | Wan、Sora 类 |
调度影响信噪比分布:Cosine 调度在中间时间步保留更多信号,对高分辨率细节生成更友好;过早进入纯噪声会浪费训练容量。
| 指标 | 计算方式 | 局限性 |
|---|---|---|
| FID(Fréchet Inception Distance) | InceptionV3 提取真实/生成集的特征,计算两模态高斯分布的 Fréchet 距离 | 依赖 ImageNet 特征空间,对文本-图对齐不敏感 |
| IS(Inception Score) | E[KL(p(y|x) || p(y))],高 IS 要求类别明确且多样 | 不衡量图文对齐;弹模式时 IS 也可能很高 |
| CLIP Score | CLIP 图像-文本余弦相似度 | 对细小细节/属性绑定较弱 |
| DINO/LPIPS | 真实性/感知相似度 | 需要参考图像 |
ControlNet 为平行复制原始 U-Net 的编码器半部(副本),功能:
- 原始 U-Net 权重冻结,保留预训练涌现能力
- 副本编码器接受额外条件(边缘图/深度图/骨架),通过Zero Convolution(初始化为 0 的 1×1 卷积)将特征逐层加进解码器
- Zero Conv 保证训练初期不引入噪声,梯度平稳
为何只训练副本?
- 可训练参数量仅为全模型的 50%,显存减少
- 冻结原始 U-Net 防止灾失性遗忘,不危害已有文本生成能力
- 支持多个 ControlNet 叠加使用
DreamBooth 目标:用 3~20 张特定主题图片,让扩散模型学会生成该主题内容。
+ LoRA 流程:
- 准备 3~20 张目标图像 + 认罪图像(prior preservation loss 防止过拟合)
- 在 U-Net 的 Attention 层插入 LoRA,秩 <rank=4~32>
- 训练 loss = diffusion MSE loss + λ · prior loss
- 训练 200~500 steps,lr 约 1e-4
常见问题:
- 语言漂移:过多训练后模型只会生成特定主题而失去泛化 → 加大 prior loss 权重
- 过拟合:图像并不多时应及时停止 → 评估 validation loss
- LoRA Rank 选择:写实水平用 r=8;风格过渡用 r=16~32
图像 VAE:仅在空间维压缩(H×W ÷ 8);视频 VAE 额外在时间维压缩(T ÷ 4),进一步降低扩散过程的计算量:
时序连贯性保证方法:
- 3D卷积:在 Encoder/Decoder 里使用 3D Conv 捕捉时空联合特征
- Temporal Attention:在 latent 序列上做时间轴注意力,支持跨帧建模
- 帧间光流监督:加入光流一致性损失,强制相邻帧 latent 运动可推)
IP-Adapter 实现图片内容作为提示,控制生成图的风格/内容:
- CLIP 图像编码器提取图片特征(使用 patch-level embedding,非仅 CLS token)
- 新增一个平行的跨注意力子层(Decoupled Cross-Attention):
$$\text{Attn}=\text{Attn}_\text{text}+\lambda\cdot\text{Attn}_\text{image}$$文本 Cross-Attention 和图片 Cross-Attention 分开进行,控制权重 λ 平衡内容/文本影响力
- 冻结原始 U-Net,只训练新增 Attention 层和图像投影
训练:收集 4 亿图文对,用对比学习训练图像编码器和文本编码器:最大化正样本对(配对图文)的余弦相似度,最小化负样本对的相似度。
零样本分类:将类别名称格式化为 "a photo of a {class}",用文本编码器生成所有类别 embedding,对输入图像计算最近邻,即可在未见过类别上分类。
局限:对细粒度视觉理解(计数、空间关系)弱;对 OCR 文字识别差。
LLaVA 架构:
- 视觉编码器:CLIP ViT 提取图像 patch 特征(如 256 tokens)
- 投影层(MLP/Linear):将视觉特征映射到 LLM 的 token embedding 维度(模态对齐)
- LLM(Vicuna/LLaMA):将图像 token 与文本 token 拼接后统一处理
训练策略(两阶段):
- 阶段一:冻结视觉编码器和 LLM,仅训练投影层(图文特征对齐)
- 阶段二:释放 LLM 进行 SFT,用图文对话数据微调
DiT(Peebles & Xie, 2022)用 Transformer 替代 U-Net 作为扩散模型的去噪网络:
- 图像分块(patchify)为序列,类似 ViT
- 时间步 t 和条件通过 Adaptive LayerNorm(adaLN-Zero) 注入每层
- 无 U-Net 的跳连接,结构更简洁
优势:Transformer 的 Scaling Law 更好(计算量→质量),SD3、Flux、Sora 均采用 DiT 架构。
3D DiT(视频生成):对时间+空间维度的 patch 建模,处理时序一致性,用于 Sora/OpenSora 等视频生成。
主要挑战:
- 时序一致性:同一物体在不同帧的外观/运动连贯
- 物理合理性:液体、碰撞等物理现象是否真实
- 长视频:注意力复杂度 O(T×H×W × …),计算量极大
- 训练数据:高质量带文字描述的视频数据稀缺
时序一致性技术:
- 3D 时空注意力(Temporal + Spatial Attention 交错)
- 视频 VAE 在时序维度压缩(4×空间 + 4×时间)
- 运动先验:用光流监督或动作条件(ControlNet-like)
关键设计点:
- 批处理:Continuous Batching(请求动态合并),不等最长序列完成
- KV Cache 管理:PagedAttention 消除碎片,Prefix Caching 共享公共前缀
- 模型并行:TP(Tensor Parallel)拆分 Attention/FFN 到多卡
- 调度策略:优先级队列(SLA)、抢占式调度(preemption)
- 流式输出:SSE 或 WebSocket 逐 token 推流
- 负载均衡:多副本路由,基于 KV Cache 命中率的亲和路由
基础 RAG 流程:Query → Retriever(向量检索/BM25)→ 召回 Top-K 文档 → LLM 生成答案
优化方向:
- 检索端:混合检索(Dense+Sparse),HyDE(用 LLM 生成假设文档做检索),Query 改写
- 索引端:分层切块(Hierarchical Chunking),元数据过滤,Summary 索引
- 生成端:Rerank(Cross-Encoder 精排),Long Context 压缩,引用标注
评估指标:RAGAS 框架(Faithfulness 忠实度、Answer Relevancy 答案相关性、Context Precision 上下文精度)。
| Benchmark | 考察能力 |
|---|---|
| MMLU | 多学科知识理解(57 个学科) |
| GSM8K / MATH | 数学推理(小学/竞赛级) |
| HumanEval / LiveCodeBench | 代码生成 |
| MT-Bench / AlpacaEval | 指令遵循和对话质量 |
| HELM / BIG-bench | 综合能力评估 |
| SimpleQA | 事实性(OpenAI 提出) |
- Tool Use:通过 Function Calling 让 LLM 输出结构化 JSON 调用工具(搜索、代码执行、数据库);工具结果注入上下文后继续生成
- Memory:短期(上下文窗口内)+ 长期(外部向量库/KG);遗忘机制:摘要压缩旧对话
- Planning:ReAct(推理+行动循环)、Tree-of-Thought(多路径探索)、Self-Refine(自我批评迭代)
- 多 Agent:AutoGen/CrewAI 等框架,不同角色 Agent 协作(规划者+执行者+评审)
scaled_dot_product_attention(Q, K, V, mask=None),包含 softmax 和可选的 causal mask
MDP 五元组:(S, A, P, R, γ)
- S:状态空间
- A:动作空间
- P(s'|s,a):状态转移概率
- R(s,a):奖励函数
- γ ∈ [0,1):折扣因子
贝尔曼方程(状态价值函数):
贝尔曼最优方程:
Q-Learning(off-policy):
TD 目标用 max Q(s',·),与行为策略无关,直接估计最优策略价值 → off-policy。
SARSA(on-policy):
TD 目标用实际执行的下一动作 a'(由当前策略决定)→ on-policy,更保守,学习的是执行策略的价值。
| Q-Learning | SARSA | |
|---|---|---|
| 策略类型 | off-policy(学最优) | on-policy(学当前策略) |
| 悬崖行走 | 走悬崖边缘(最优但危险) | 走安全路线 |
| 收敛性 | 收敛到 Q* | 收敛到 Q_π |
目标:最大化期望回报 J(θ) = E_τ[R(τ)]。
策略梯度定理:
REINFORCE(Monte Carlo 策略梯度):用完整轨迹的折扣回报 G_t 估计 Q 值:
Baseline 减方差:引入基线 b(通常为状态价值 V(s_t)),减少梯度方差:
Actor-Critic 同时维护:
- Actor(策略网络 π_θ):负责选动作
- Critic(价值网络 V_φ):负责评估当前策略的价值,提供 TD 误差作为梯度信号
优势函数(Advantage):
Actor 更新:∇_θ log π_θ(a|s) · A(s,a)
| A2C(Advantage Actor-Critic) | A3C(Asynchronous A3C) | |
|---|---|---|
| 执行方式 | 同步,等所有并行 worker | 异步,各 worker 独立更新全局网络 |
| 硬件需求 | 单机多线程/GPU | 多 CPU 核心 |
| 稳定性 | 更稳定 | 异步噪声大但探索多 |
PPO 限制每次策略更新的幅度,防止过大更新破坏策略:
重要性权重: r_t(θ) = π_θ(a_t|s_t) / π_θ_old(a_t|s_t)
Clip 目标函数:
ε 通常取 0.1~0.2。当 r_t > 1+ε(新策略比旧策略提升过多)时,clip 截断不再获益;当 A_t < 0 时,若 r_t < 1-ε 也被截断,防止过度惩罚。
完整 PPO 损失:
其中 L_VF 是 Critic 均方误差,S 是熵正则防止策略过早收敛。
经典 Q-Learning 用表格存 Q 值,无法处理高维状态。DQN 用神经网络近似 Q 函数,并引入两大技巧:
1. Experience Replay(经验回放):
- 维护 Replay Buffer 存储历史转换 (s, a, r, s')
- 每次随机采样 mini-batch 训练,打破样本时序相关性
- 提高样本利用率,稳定训练
2. Target Network(目标网络):
- 用独立的旧网络 θ⁻ 计算 TD 目标:y = r + γ·max_a' Q(s',a'; θ⁻)
- 每隔 C 步将主网络参数复制给目标网络
- 防止"追逐移动目标"导致训练发散
核心矛盾:利用当前已知最优动作 vs 探索未知动作以发现更好策略。
| 策略 | 原理 | 适用场景 |
|---|---|---|
| ε-greedy | 以概率 ε 随机探索,1-ε 贪心利用;ε 随训练衰减 | 离散动作(DQN) |
| UCB(上置信界) | 选择 Q(a) + c·√(ln t / N(a)) 最大的动作,未探索动作 bonus 高 | Bandit 问题 |
| Boltzmann/Softmax | 按 exp(Q/τ) 概率采样,温度 τ 控制随机度 | 连续/概率动作 |
| 内在奖励 | 好奇心驱动(预测误差/新颖性)作为额外奖励 | 稀疏奖励环境 |
GAE 是多步 TD 优势的指数加权平均:
其中 δ_t = r_t + γ·V(s_{t+1}) − V(s_t) 为单步 TD 误差。
| λ 取值 | 等价形式 | 偏差/方差 |
|---|---|---|
| λ=0 | A = δ_t(纯 1-step TD) | 低方差,高偏差 |
| λ=1 | A = G_t − V(s_t)(Monte Carlo) | 无偏差,高方差 |
| λ∈(0,1) | 折中 | 平衡偏差-方差 |
LLM RLHF 中,奖励来自 RM 模型(只在序列末尾给分),属于典型稀疏奖励。
解决方案:
- 逐 token 分配奖励:将终态奖励均匀或按重要性分摊到每个 token
- KL 散度惩罚:每步加 −β·KL(π_θ(·|s) || π_ref(·|s)),防止策略偏离 SFT 基准太远
KL 惩罚的三重作用:
- 防止 reward hacking(模型发现漏洞刷 RM 高分但输出质量差)
- 保持语言流畅度(SFT 模型已有好的语言生成能力)
- 稳定训练(避免策略更新过大)
GRPO 去掉了 PPO 中的 Critic 网络,改用组内相对奖励估计优势:
- 对同一 prompt 采样 G 条回答 {y₁,...,y_G}
- 用奖励模型打分 {r₁,...,r_G}
- 组内归一化:A_i = (r_i − mean(r)) / std(r)
- 用 A_i 代替 PPO 中 Critic 估计的优势
| PPO | GRPO | |
|---|---|---|
| Critic 网络 | 需要(同 Actor 大小) | 不需要 |
| 显存需求 | 高(同时加载 4 个模型) | 低(2 个模型) |
| 优势估计 | GAE + Critic | 组内相对排名 |
DeepSeek-R1 选择 GRPO 的原因:训练超大模型时省去 Critic 可节省约 50% 显存,同时对数学/代码等有客观验证标准的任务,组内相对奖励信号足够稳定。
二分类(Binary Cross-Entropy / BCE):
多分类(Categorical Cross-Entropy):
其中 $y_{i,c}$ 为 one-hot 标签,$\hat{y}_{i,c}$ 为 softmax 输出的第 c 类概率。
MSE(L2 Loss):
MAE(L1 Loss):
Smooth L1 / Huber Loss(结合两者优点):
| 损失 | 对异常值 | 梯度特点 | 适用场景 |
|---|---|---|---|
| MSE | 敏感(平方放大) | 误差大时梯度大 | 一般回归、扩散模型噪声预测 |
| MAE | 鲁棒 | 恒定梯度(±1) | 需要稳健回归的场景 |
| Huber | 折中 | 小误差平滑,大误差截断 | 目标检测(Faster R-CNN) |
连续形式:
性质:
- 非对称:$D_{\text{KL}}(P\|Q) \neq D_{\text{KL}}(Q\|P)$
- 非负:$D_{\text{KL}} \geq 0$,等号当且仅当 P=Q
- 不是真正的距离(不满足对称性和三角不等式)
应用:VAE 的正则项、RLHF/PPO 中的策略约束、知识蒸馏。
InfoNCE(CLIP / SimCLR 使用):
其中 $z_i^+$ 为正样本对,$\tau$ 为温度参数,$\mathrm{sim}$ 通常为余弦相似度。
Triplet Loss:
其中 a=anchor, p=positive, n=negative, d 为欧氏距离。
NT-Xent(Normalized Temperature-scaled Cross Entropy,SimCLR):
其中 $p_t$ 为模型对正确类的预测概率,$\alpha_t$ 为类别权重,$\gamma$ 为聚焦参数(通常取 2)。
核心思想:$(1-p_t)^\gamma$ 调制因子使得易分类样本($p_t$ 接近 1)的损失被大幅衰减,模型更聚焦于难分类样本。
| γ 值 | 效果 |
|---|---|
| γ = 0 | 退化为标准交叉熵 |
| γ = 2 | 当 $p_t=0.9$ 时,loss 衰减 100× |
| γ = 5 | 更激进的难样本聚焦 |
其中:
- $z_t$ = Teacher logits,$z_s$ = Student logits
- $T$ = 温度(通常 2~20),使输出分布更平滑,暴露更多"暗知识"
- $\sigma$ = softmax 函数
- $\alpha$ = 平衡软标签与硬标签的权重
- $T^2$ 因子用于补偿温度升高导致的梯度缩放
DDPM 简化损失(ε-prediction):
v-prediction 变体(Imagen / SD 2.x):
Flow Matching 损失:
| 预测目标 | 优势 | 代表 |
|---|---|---|
| ε(噪声) | 原始 DDPM 方式,实现简单 | SD 1.x, DALL·E 2 |
| v(velocity) | 高信噪比时更稳定 | Imagen, SD 2.x |
| x₀(数据) | 直接预测去噪结果 | 部分加速采样方法 |
| v_θ(速度场) | Flow Matching,最简洁 | SD3, FLUX, Wan |
原始 GAN(minimax):
WGAN(Wasserstein 距离):
WGAN-GP(梯度惩罚):
其中 $\hat{x}$ 为真假样本的随机插值点,$\lambda=10$。
Hinge Loss(SAGAN / BigGAN):
其中 $\phi_l$ 为预训练网络(VGG/DINO)第 $l$ 层的特征图。
LPIPS(Learned Perceptual Image Patch Similarity):
$\hat\phi_l$ 为 channel-wise 归一化后的特征,$w_l$ 为学习权重。
用途:VAE decoder 训练、超分辨率、图像修复 —— 比 MSE 更符合人类感知。
奖励模型(Bradley-Terry):
DPO 损失:
PPO Clip 目标:
其中 $r_t(\theta)=\frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)}$,$A_t$ 为优势函数(GAE 估计)。
其中 $\mathcal{B}^{-1}(y)$ 为所有映射到标签序列 y 的合法对齐路径集合(collapse blank + 重复)。
核心思想:允许模型在输入长度 > 输出长度时,自由选择对齐方式,用动态规划(前向-后向算法)高效求和。
应用场景:语音识别(ASR)、OCR 文字识别、手写体识别。
IoU Loss:
GIoU(Generalized IoU):
$C$ 为包围两个框的最小闭合区域。
CIoU(Complete IoU):
额外考虑中心距离 $\rho$、对角线 $c$、宽高比一致性 $v$。
| 变体 | 额外考虑 | 代表模型 |
|---|---|---|
| IoU | — | 基础 |
| GIoU | 非重叠区域 | YOLO v3+ |
| DIoU | 中心点距离 | — |
| CIoU | 中心距离+宽高比 | YOLO v5/v8 |
将 one-hot 标签 $y$ 替换为平滑标签:
等价于在交叉熵中混合均匀分布:
其中 $u$ 为均匀分布,$\epsilon$ 通常取 0.1。
作用:防止模型对预测过度自信,提升泛化能力,减少过拟合;原始 Transformer 论文中即使用 label smoothing (ε=0.1)。
Dice Loss:
其中 $p_i$ 为预测概率,$g_i$ 为 ground truth(0/1)。
Tversky Loss(广义 Dice):
$\alpha$ 控制假阳性权重,$\beta$ 控制假阴性权重。当 $\alpha=\beta=0.5$ 时退化为 Dice Loss。
应用:医学图像分割(处理前景极小的情况),语义分割中与 CE 联合使用。
Self-Instruct(Wang et al. 2023):
- 从种子指令集(175 条)出发
- 用 LLM 生成新指令 → 生成对应输入/输出
- 过滤低质量/重复数据,扩充指令池
- 循环迭代,最终得到数万条指令数据
Evol-Instruct(WizardLM):
- 对已有指令做“进化”操作:加深(更复杂推理)、加宽(更多约束条件)、改写(换领域/场景)
- 每轮进化后用 LLM 筛选质量,淘汰退化样本
- 逐轮迭代,生成从简单到复杂的梯度数据
| Self-Instruct | Evol-Instruct | |
|---|---|---|
| 核心思路 | 从种子扩展新指令 | 对已有指令做复杂度进化 |
| 数据多样性 | 高(广度优先) | 中(深度优先) |
| 数据难度 | 随机 | 渐进式提升 |
| 代表 | Alpaca | WizardLM、WizardCoder |
核心原则:数据配比直接影响模型能力分布,需要根据目标能力精心设计。
典型配比(参考 LLaMA/Qwen 技术报告):
| 数据源 | 占比 | 作用 |
|---|---|---|
| 网页文本(CC) | 60~70% | 通用语言能力 |
| 代码 | 10~15% | 推理能力、结构化输出 |
| 学术论文/书籍 | 5~10% | 知识密度 |
| 百科/知识库 | 5% | 事实性 |
| 对话/社交 | 3~5% | 对话能力 |
| 数学 | 3~5% | 数学推理 |
多语言配比策略:
- 按比例采样:按各语言语料量的 α 次方重采样(α=0.3~0.7),平衡大语种和小语种
- 温度采样:$P(l) \propto n_l^{1/T}$,T 越大分布越均匀
- 多阶段:先大量英文训练,后期增加目标语言比例(annealing)
核心思想:按“从易到难”或“从通用到专精”的顺序安排训练数据,模拟人类学习过程。
在 LLM 中的应用形式:
- 数据质量递进:前期用大量低质量数据学通用模式,后期用高质量数据精炼(LLaMA 3 的“annealing”阶段上采样高质数据)
- 难度递进:先短序列后长序列(节省计算);先简单任务后复杂任务
- 领域递进:先通用 → 后专业领域 → 最后指令数据
- 数据重放:周期性回放早期数据防止灾难性遗忘
实践案例:
- GPT-4 使用多阶段训练(不同阶段数据质量和难度递增)
- DeepSeek-V3 在预训练末期用 1.5T 高质量 token 做 annealing
- 代码模型先学自然语言再学代码(Codex 路线)
什么是数据污染:测试集(benchmark)的数据出现在预训练语料中,导致评估结果虚高。
检测方法:
- N-gram 匹配:检查训练语料中是否包含 benchmark 的 8-gram 或更长连续片段
- Perplexity 分析:对 benchmark 样本计算困惑度,异常低的说明可能见过
- Membership Inference:用模型自身判断是否“记住”了某个样本
- Canary 方法:在训练集中插入特殊标记,检查模型是否能复现
处理方法:
- 训练前:对所有已知 benchmark 做去重清洗(LLaMA 3 报告了完整去污流程)
- 评估时:使用动态/私有测试集(如 LiveCodeBench、SimpleQA)
- 发布时:明确报告去污方法和残留污染比例
挑战:
- alt-text 质量差:网络图片的 alt 描述往往很短或不准确
- 图文相关性低:很多网页图文只是共现,并非真正描述关系
- 细粒度描述缺失:缺少空间关系、计数、属性等详细描述
解决方案:
- CLIP score 过滤:用 CLIP 计算图文相似度,过滤低分样本(DataComp)
- 重新标注(Recaptioning):用大模型(如 LLaVA/CogVLM)为图片生成高质量长描述
- 分层数据策略:
- 阶段一:大量粗粒度图文对(LAION-5B 级别)学基础对齐
- 阶段二:精细图文对(ShareGPT4V、ALLaVA)学细粒度理解 - 合成数据:用渲染引擎/扩散模型生成带精确标注的图像
Section 12 — 长上下文与记忆机制
Q1: 长上下文外推技术有哪些?YaRN/NTK-Aware/ABF 的原理?
位置编码外推问题:基于 RoPE 的模型在训练长度 L 内学习了位置编码,当推理序列长度 L' > L 时,超出训练分布的位置编码会导致注意力分数异常,模型性能急剧下降。核心挑战是如何让模型在不重新训练的情况下处理更长序列。
NTK-Aware Scaling
核心思想:不直接对位置进行线性插值(会损失高频信息),而是修改 RoPE 的 base frequency,使得高频维度几乎不变、低频维度被压缩。
其中 α = (L'/L)^(d/(d-2)),base' = base · α
💡 NTK-Aware 的优势在于无需微调即可获得一定外推能力,是 "free lunch" 方案的代表。
YaRN(Yet another RoPE extensioN)
分频段处理策略,将 RoPE 的频率维度分为三个区间:
- 低频维度(波长 > 训练长度):线性插值(Position Interpolation)
- 高频维度(波长 << 训练长度):保持不变,无需外推
- 中频维度:NTK 混合插值,平滑过渡
同时引入温度缩放因子 √(1/t) 修正注意力熵的增大问题。
ABF(Adjusted Base Frequency)
DeepSeek 采用的动态调整方案:根据目标长度直接调整 RoPE 的 base 参数,配合少量长序列数据微调。
Position Interpolation(PI)基础公式
将位置 m 线性缩放到训练长度范围内:m' = m · (L / L')
⚠️ 纯线性插值(PI)会压缩所有频率维度,导致高频位置信息丢失,近距离 token 的区分度下降。这正是 NTK/YaRN 改进的出发点。
| 方法 | 核心策略 | 是否需要微调 | 外推倍数 |
|---|---|---|---|
| Position Interpolation | 位置线性缩放 | 需少量微调 | 2-4× |
| NTK-Aware | 修改 base frequency | 无需微调 | 2-4× |
| YaRN | 分频段 + 温度修正 | 少量微调效果更好 | 4-64× |
| ABF | 动态 base 调整 | 需配合长序列训练 | 4-128× |
Q2: Ring Attention 和 Striped Attention 的原理?如何实现分布式长序列训练?
序列并行的核心挑战
标准 Self-Attention 需要每个 token 与所有其他 token 交互,当序列长度 N 极大时,单设备无法容纳完整的 KV 矩阵。序列并行(Sequence Parallelism)需要解决:
- 内存瓶颈:KV cache 随序列长度线性增长
- 计算依赖:注意力计算需全局 KV 信息
- 通信开销:设备间传输 KV 块的带宽成本
Ring Attention
核心思想:将序列分为 P 个块(P = 设备数),每个设备持有一个 Q 块,KV 块在设备间以环形拓扑(Ring)传递。
- 每个设备固定存储自己的 Q 块(Query)
- KV 块沿环形方向逐步传递,每步计算当前 Q 与收到的 KV 块的局部注意力
- 使用 Online Softmax(Flash Attention 思路)逐步累积注意力结果
- 经过 P-1 步传递后,每个设备获得完整注意力输出
Attention_partial(Q_i, K_{(i+t)%P}, V_{(i+t)%P})
通过 log-sum-exp 合并所有 partial results
Striped Attention
Ring Attention 的改进方案,解决因果注意力(Causal Mask)下的负载不均衡问题:
- 问题:在 causal mask 下,靠前的 Q 块只能看到很少的 KV,靠后的 Q 块要看全部 KV,导致计算量不均
- 解决:将序列按 striped(条纹)方式分片 — token i 分配到设备 i % P
- 这样每个设备持有的 token 在序列中均匀分布,保证每个设备的有效计算量接近相等
通信与计算重叠
关键优化:在计算当前 KV 块的注意力时,同时异步发送/接收下一个 KV 块(double buffering),使通信延迟被计算掩盖。
当 T_compute ≥ T_communicate 时,通信完全被掩盖
💡 Ring Attention + Flash Attention 的组合使得理论上可以训练任意长序列,内存开销与设备数成反比:O(N/P) per device。
Q3: 稀疏注意力的主流模式?Sliding Window + Global tokens 如何工作?
Longformer / BigBird 模式
经典稀疏注意力的三种组合模式:
- Local Window:每个 token 只关注周围 w 个 token(滑动窗口)
- Global Tokens:指定若干 token(如 [CLS])可关注/被关注所有位置
- Random Attention(BigBird):每个 token 额外随机关注 r 个位置,增加远程连接
相比 Full Attention O(N²),当 w+g+r ≪ N 时显著降低
Mistral 的 Sliding Window Attention(SWA)
Mistral 7B 采用的简洁方案:
- 窗口大小 W=4096,每层只关注最近 W 个 token
- 多层堆叠后,感受野随层数线性增长:第 k 层理论感受野 = k × W
- 32 层 × 4096 窗口 = 131K 有效感受野
- KV Cache 大小固定为 W,不随序列增长
StreamingLLM 与 Attention Sink
Attention Sink 现象:即使在超长序列中,模型对最前面几个 token(尤其是第一个 token)始终分配较高注意力权重,无论这些 token 的语义内容如何。
- 原因:Softmax 需要一个"垃圾桶"来放置不需要的注意力概率质量
- StreamingLLM 策略:保留前 k 个 Sink Tokens + 最近的 Window Tokens
- 支持无限长度流式推理,KV Cache 大小恒定
总缓存大小固定为 4 + W,与输入长度无关
| 方法 | 复杂度 | 有效感受野 | 适用场景 |
|---|---|---|---|
| Full Attention | O(N²) | N | 短序列 |
| Sliding Window | O(N·W) | k·W(多层) | 通用长文本 |
| Longformer | O(N·(W+G)) | N(通过 Global) | 文档理解 |
| StreamingLLM | O(N·W) | W + Sink | 无限流式推理 |
⚠️ 稀疏注意力模式可能丢失关键的远程依赖信息。对于需要全局推理的任务(如数学证明、长距离共指消解),纯稀疏方案效果有限。
Q4: 外部记忆增强 vs 长上下文:各自的优劣?
RAG vs 长上下文的 Trade-off
| 维度 | RAG(外部记忆) | 长上下文窗口 |
|---|---|---|
| 信息容量 | 理论无限(外部存储) | 受窗口大小限制(128K-1M) |
| 检索精度 | 依赖检索器质量,可能遗漏 | 全部信息在上下文内,无遗漏 |
| 推理成本 | 低(只送相关片段) | 高(长序列 O(N²) 或 O(N·W)) |
| 实时性 | 可随时更新外部库 | 需重新构建上下文 |
| 多跳推理 | 困难(需多轮检索) | 天然支持(信息共存) |
| 部署复杂度 | 需向量数据库 + 检索管线 | 简单,只需长窗口模型 |
长期记忆方案
- MemoryBank:为每个用户/对话维护动态记忆库,通过遗忘曲线模拟人类记忆衰减,定期整合与遗忘
- MemWalker:将长文本构建为树状记忆结构,通过 LLM 自主导航(walk)在记忆树中检索相关信息
- Memorizing Transformers:引入 kNN 检索层,在注意力计算中融合外部记忆库的 KV 对
上下文压缩技术
- Gisting:将长 prompt 压缩为少量 "gist tokens",通过训练让模型学会从 gist tokens 恢复原始信息
- AutoCompressor:递归压缩 — 将前文压缩为 summary vectors,与新文本拼接后再次压缩,支持无限长度
- ICAE(In-Context Autoencoder):用 LoRA 微调将长上下文编码为固定数量的 memory tokens
Gisting 典型压缩比: 10-26×
AutoCompressor: 每段压缩为固定 k 个 summary tokens
何时选 RAG vs 长窗口?
💡 决策框架:
• 知识库 > 1M tokens 且频繁更新 → RAG
• 单文档/对话 < 128K 且需要精确推理 → 长窗口
• 需要多跳推理 + 大量背景知识 → 长窗口 + RAG 混合
• 成本敏感场景 → RAG(只检索相关片段,省 tokens)
Q5: KV Cache 压缩技术有哪些?如何在不损失精度的情况下减少缓存?
Token Eviction(淘汰策略)
- H2O(Heavy-Hitter Oracle):基于累积注意力分数识别"重要 token",只保留 Heavy Hitters + 最近的 Local tokens,淘汰中间低分 token
- ScissorHands:观察到"重要 token 在不同层/头中保持一致"(Persistence of Importance),据此做跨层联合淘汰决策
- FastGen:针对不同注意力头采用不同压缩策略(有的头需要全局,有的只需局部)
保留比例典型值:20%-40% 即可保持 95%+ 精度
KV Quantization(量化)
- 对 KV Cache 中的 Key/Value 矩阵进行低精度量化(FP16 → INT8/INT4)
- KIVI:Key 用 per-channel 量化(沿 head_dim 维度),Value 用 per-token 量化(沿 seq_len 维度)
- KVQuant:结合 Non-Uniform Quantization + 残差异常值处理
- 内存节省:INT4 量化可节省 75% KV Cache 内存
KV Merge / Pooling(合并)
- 将相邻或相似 token 的 KV 向量合并(average pooling / weighted merge)
- D2O(Dynamic Token Pruning with Merging):淘汰低分 token 前先将其信息合并到邻近保留 token 中
- CaM(Cache Merging):基于 token 相似度做聚类合并
- 优势:比单纯淘汰更好地保留全局信息
Shared KV(结构层面的 KV 压缩)
| 方法 | KV Head 数 | 参数量 | KV Cache 大小 | 效果 |
|---|---|---|---|---|
| MHA(Multi-Head) | h 个独立 KV Head | 最大 | O(h·d·N) | 基线 |
| MQA(Multi-Query) | 1 个共享 KV Head | 最小 | O(d·N) | 速度快,质量略降 |
| GQA(Grouped-Query) | g 组(1<g<h) | 中等 | O(g·d·N) | 速度与质量平衡 |
| MLA(Multi-head Latent) | 压缩为低秩 latent | 中等 | O(c·N), c≪h·d | DeepSeek-V2 方案 |
c_t = W_DKV · x_t (下投影,c_t 维度远小于 K+V 拼接维度)
K_t, V_t = W_UK · c_t, W_UV · c_t (上投影恢复)
缓存只需存 c_t,压缩比 = (d_k + d_v) / d_c ≈ 4-8×
💡 实践建议:多种技术可组合使用。例如 GQA(结构)+ INT4 量化 + H2O 淘汰 三管齐下,可将 KV Cache 压缩 10-20× 而精度损失 < 1%。
⚠️ Token Eviction 策略在需要"回看"早期信息的任务(如长文档 QA、代码补全引用远处定义)中可能导致关键信息被淘汰。建议结合任务特性选择压缩方案。
13. 多模态模型深入
展开答案
VQVAE 核心流程:Encoder → 量化到码本(codebook)→ Decoder 重建图像
💡 量化操作是离散的(argmin),不可微分。训练时使用 Straight-Through Estimator (STE):前向走量化路径,反向直接将梯度复制给 encoder 输出。
VQGAN 改进:
- 在 VQVAE 基础上加入 PatchGAN 判别器(对抗训练)
- 引入 感知损失(Perceptual Loss,基于 VGG 特征距离)
- 重建质量显著提升,生成图像更锐利、细节更丰富
应用:
- LlamaGen:用离散视觉 token 做自回归图像生成,与文本 token 统一建模
- Chameleon (Meta):统一图文 token 空间,实现真正的 any-to-any 生成
| 特性 | VQVAE | VQGAN | dVAE (DALL·E) |
|---|---|---|---|
| 量化方式 | 最近邻码本查找 | 最近邻码本查找 | Gumbel-Softmax 松弛 |
| 判别器 | ❌ 无 | ✅ PatchGAN | ❌ 无 |
| 感知损失 | ❌ 无 | ✅ VGG-based | ❌ 无 |
| 重建质量 | 中等(模糊) | 高(锐利) | 中等 |
| 梯度处理 | STE | STE | Gumbel-Softmax(可微) |
| 典型应用 | 特征学习 | LlamaGen / Parti | DALL·E 1 |
⚠️ 码本坍塌(Codebook Collapse)是常见问题:只有少数 code 被使用。缓解方法包括 EMA 更新、码本重置、更大码本 + 分组量化。
展开答案
拼接式架构(LLaVA 类):
- 独立的 Vision Encoder(如 CLIP ViT)提取视觉特征
- Projection Layer(MLP / Q-Former)将视觉特征映射到 LLM 的 embedding 空间
- LLM 接收文本 + 投影后的视觉 token 做序列建模
- 各模块可独立预训练,组装灵活
原生多模态架构(Gemini):
- 从预训练阶段就混合所有模态(文本、图像、音频、视频)
- 模型内部天然理解跨模态关系,无需额外对齐阶段
- 训练成本极高,但跨模态推理能力更强
| 维度 | 拼接式(LLaVA / InternVL) | 原生多模态(Gemini / GPT-4o) |
|---|---|---|
| 训练成本 | 较低(复用已有模型) | 极高(从头混合训练) |
| 跨模态推理 | 受限于投影层瓶颈 | 深度融合,推理更自然 |
| 模态扩展 | 加 encoder 即可扩展 | 需重新预训练 |
| 信息损失 | 投影时可能丢失细节 | 端到端保留 |
| 开源友好 | ✅ 容易复现 | ❌ 难以复现 |
Any-to-Any 生成(GPT-4o):
- 单一模型同时支持文本、图像、音频的输入和输出
- 实时语音对话(无需 ASR → LLM → TTS 管线)
- 可感知语气、情感、环境音,响应延迟极低(~320ms)
💡 趋势:学术界倾向拼接式(低成本迭代),工业界顶级模型走向原生多模态(性能上限更高)。
展开答案
Whisper 架构:
- 结构:标准 Encoder-Decoder Transformer
- 输入:80-channel Mel spectrogram(30s 音频窗口)
- 多任务训练:语音识别、语种检测、时间戳预测、翻译,通过特殊 token 切换任务
- 数据:68 万小时弱监督数据,覆盖 99 种语言
音频离散化(Neural Audio Codec):
- SoundStream / EnCodec:将连续音频波形编码为离散 token 序列
- 核心技术 — 残差向量量化(RVQ):
每层量化残差,多层叠加逼近原始信号
- EnCodec:8 层 RVQ,每层 1024 码本 → 1.5kbps~24kbps 可变码率
- 第 1 层捕获语义/内容信息,后续层补充声学细节(音色、韵律)
TTS Pipeline(现代方案):
- 文本 → 语义 Token(如 HuBERT 提取) → 声学 Token(EnCodec RVQ)→ 波形(Codec Decoder)
- 语言模型在 token 层做生成,避免直接预测连续波形
代表工作:
- VALL-E (Microsoft):3 秒语音 prompt → 零样本语音克隆;AR 生成第 1 层 + NAR 并行生成后续层
- CosyVoice (阿里):Flow Matching + LLM,支持零样本、跨语言、情感控制
- ChatTTS:细粒度韵律控制,支持笑声、停顿等副语言特征
💡 音频 token 化使得语音/音乐生成可以复用 LLM 的自回归框架,是多模态统一建模的关键一步。
展开答案
核心挑战:
- Token 数爆炸:1 帧 = 256+ token,1 分钟视频(30fps)= 460K+ token,远超 LLM 上下文窗口
- 时序依赖跨度大:需要关联几分钟甚至几小时前的事件
- 信息冗余:相邻帧高度相似,大量 token 是重复信息
时空压缩方案:
- 视频 VAE:空间压缩 8×(H/8 × W/8)+ 时间压缩 4×(每 4 帧→1 个 latent)
- 关键帧采样:均匀采样 / 场景变化检测 / 动态帧率(信息密度自适应)
- Token 合并:相邻帧的相似 token 做 average pooling 或 attention pooling
时空注意力设计:
| 方案 | 计算方式 | 优势 | 劣势 |
|---|---|---|---|
| 分离式 (Divided) | 先空间 Attention → 再时间 Attention | 计算高效,O(T·N + T²) | 时空交互不够充分 |
| 联合式 (Joint 3D) | 所有帧的所有 token 做全局 Attention | 时空交互最充分 | 计算量 O((T·N)²) 爆炸 |
| 窗口式 (Local) | 时空局部窗口内做 Attention | 平衡效率与交互 | 长程依赖受限 |
Memory-Augmented 方法:
- MovieChat:维护短期记忆(最近帧)+ 长期记忆(合并历史帧为压缩表示),突破上下文限制
- MA-LMM (Memory-Augmented LMM):用可学习的 memory bank 存储历史视频信息,在线流式处理长视频
- LLaMA-VID:每帧仅用 2 个 token 表示(context token + content token),支持 1 小时视频
⚠️ 长视频理解仍是开放问题:现有 benchmark(如 Video-MME Long)显示,即使顶级模型在 >30min 视频上准确率也大幅下降。
展开答案
三阶段训练范式(以 LLaVA 1.5 为例):
阶段一:模态对齐预训练
- 🔒 冻结 Vision Encoder + LLM
- 🔓 只训练 Projector(MLP / Cross-Attention)
- 数据:~600K 图文对(粗粒度 caption 数据)
- 目标:让 projector 学会将视觉特征映射到 LLM 能理解的语义空间
阶段二:视觉指令微调
- 🔓 解冻 LLM(全参数或 LoRA)
- 🔒/🔓 Vision Encoder 可选解冻(InternVL 解冻效果更好)
- 数据:~150K~1.2M 高质量指令数据(VQA、对话、推理)
- 目标:LLM 学会基于视觉信息进行推理和对话
阶段三:高质量 SFT / RLHF
- 精选高质量数据做最终对齐
- RLHF / DPO 减少幻觉、提升指令跟随能力
- 数据:~10K-50K 精标数据
随机初始化的 Projector → 输出噪声特征 → 若同时更新 LLM → 噪声梯度破坏 LLM 已有语言能力
∴ 先固定 LLM,让 Projector 收敛到有意义的映射 → 再解冻 LLM 做细粒度适配
数据量级对比:
| 阶段 | 数据量 | 数据质量 | 训练目标 |
|---|---|---|---|
| 阶段一(对齐) | 百万级(558K~5M) | 粗粒度(短 caption) | 学映射关系 |
| 阶段二(指令微调) | 十万级(150K~1.2M) | 高质量(多轮对话、推理) | 学视觉推理 |
| 阶段三(RLHF) | 万级(10K~50K) | 精标(人工标注偏好) | 减少幻觉、对齐人类偏好 |
💡 InternVL-2 / Qwen-VL 等最新模型验证:阶段二解冻 Vision Encoder 可进一步提升细粒度视觉理解(OCR、小物体检测),但需要更大 batch size 避免训练不稳定。
⚠️ 常见坑:阶段一数据质量太差(如纯 alt-text)会导致 projector 学到错误映射,后续阶段难以修复 → 建议用 ShareGPT4V 等高质量 caption 数据。
14. 安全与对齐前沿
显示答案
Constitutional AI(Anthropic):让 AI 用一组"宪法原则"自我评判和修改回答,无需人类逐条标注。
RLAIF:用 AI 生成偏好标注替代人类标注,实现全自动化对齐流程。
| 阶段 | 说明 |
|---|---|
| 生成 | 模型针对 prompt 生成初始回答 |
| 自我批评 | 模型依据宪法原则评估回答是否违规 |
| 修改 | 模型根据批评意见重写回答 |
| AI 标注偏好 | AI 对 (原始, 修改) 对进行偏好排序 |
| RL 训练 | 用 AI 偏好数据训练 Reward Model,再做 RLHF |
优势:可扩展性强,不受人工标注瓶颈限制;可覆盖大量场景。
显示答案
常见越狱方式:
- 角色扮演("假装你是 DAN")
- 编码绕过(base64 / ROT13 编码恶意指令)
- 多轮诱导(逐步引导模型突破边界)
- 对抗前缀 / 后缀
GCG 攻击(Greedy Coordinate Gradient):自动在 prompt 末尾搜索对抗后缀,使模型以 "Sure, here is..." 开头回答有害请求。
| 攻击类型 | 原理 | 自动化程度 | 迁移性 |
|---|---|---|---|
| 角色扮演 | 上下文劫持 | 手动 | 低 |
| 编码绕过 | 输入预处理盲区 | 手动 | 中 |
| 多轮诱导 | 逐步上下文污染 | 半自动 | 中 |
| GCG 对抗后缀 | 梯度优化 token 序列 | 全自动 | 高(可跨模型) |
| 对抗前缀注入 | 覆盖 system prompt | 手动 | 中 |
防御手段:
- 输入过滤(Perplexity Detector):对抗后缀通常 perplexity 极高,检测异常输入
- 安全 RLHF:加强模型拒绝能力,提升 refusal boundary
- Circuit Breaker:监控模型内部激活异常,发现有害生成前中断
- System Prompt 强化:加入明确安全约束和角色锁定
显示答案
幻觉类型:
- 事实性幻觉:生成与世界事实不符的内容(如编造论文、虚假数据)
- 忠实性幻觉:生成与给定上下文不符的内容(摘要偏离原文)
检测方法:
| 方法 | 原理 | 适用场景 |
|---|---|---|
| 自洽性检测 | 多次采样同一问题,检查答案一致性 | 开放域 QA |
| 外部知识验证 | RAG 检索 + NLI Entailment 验证 | 事实核查 |
| 不确定性估计 | Logit entropy / token 概率分布分析 | 实时检测 |
缓解方法:
- 训练时:加入 factuality reward(FActScore — 将生成文本拆为原子事实逐条验证)
- 推理时:DoLa(Decoding by Contrasting Layers)— 对比高层与低层 logits,抑制幻觉 token
- 架构层面:RAG 接入实时知识库,减少模型依赖参数记忆
显示答案
文本水印(Kirchenbauer et al., 2023):
- 每步用上一个 token 作为种子(seed),通过哈希将词表分为 green list 和 red list
- 采样时给 green list token 的 logit 加上偏置 δ,使模型倾向选 green token
- 检测:统计输出中 green token 比例,进行 z-test
图像水印:
- 隐写术:在像素 LSB 中嵌入信息
- 频域嵌入:在 DCT/DWT 系数中嵌入水印,抗压缩
- Stable Signature:训练图像生成模型的 decoder 直接嵌入水印,生成即带标记
| Trade-off 维度 | 说明 |
|---|---|
| 不可见性 | 水印不应影响文本/图像质量 |
| 鲁棒性 | 水印应在编辑、压缩、paraphrase 后仍可检测 |
| 容量 | 可嵌入信息的比特数 |
显示答案
Reward Hacking 典型案例:
- 冗长空洞:模型学会生成又长又空的回答(RM 偏好长回答 → 长度即分数)
- 格式/关键词投机:过度使用特定格式(markdown 表格、编号列表)或关键词骗取 RM 高分
- 谄媚(Sycophancy):迎合用户观点而非给出正确答案,甚至在用户质疑时放弃正确立场
解决方案:
| 方法 | 原理 |
|---|---|
| 多奖励模型集成 | 多个 RM 投票,降低单个 RM 被利用的风险 |
| 过程奖励(PRM) | 对推理每一步打分,而非只看最终结果 |
| 加强 KL 约束 | 限制 policy 偏离 base model 的程度,防止极端优化 |
| 对抗训练 RM | 用 RL 模型的输出持续更新 RM,堵住已知漏洞 |
Alignment Tax:
- 定义:对齐训练(RLHF/安全微调)导致模型部分原始能力下降的现象
- 典型表现:创造性写作能力下降、少数语言能力退化、代码生成多样性降低
- 本质:安全与能力的 trade-off — 过度安全限制了模型的表达空间
15. 推理时计算(Test-time Compute)
显示答案 ▼
训练时 Scaling Law
- 核心思想:增加模型参数量 N、数据量 D、计算量 C 可持续降低 loss
- Kaplan et al. (2020) / Chinchilla (2022):给定计算预算,最优分配 N 和 D
- 关系为幂律:
L(N,D) ∝ N-α + D-β + const
推理时 Scaling Law
- 核心思想:固定模型权重不变,通过增加推理时的计算量来提升任务正确率
- 增加推理计算的方式:
- 更多采样(Best-of-N)
- 更长的思维链(Chain-of-Thought)
- 迭代修正(Self-Refinement)
- 树搜索(MCTS / Beam Search)
更一般地:Performance ∝ log(test-time compute) (在一定范围内近似 log-linear)
OpenAI "Let's Verify Step by Step" 结论
- Process-based supervision(逐步验证)显著优于 Outcome-based supervision
- 在数学推理任务中,PRM + Best-of-N 可将正确率从 ~50% 提升至 ~78%
- 验证每一步比只看最终答案更有效地利用推理时计算
计算分配决策
| 策略 | 适用场景 | 优势 |
|---|---|---|
| 用更大模型 | 广泛任务、知识密集型 | 一次推理即可得到好结果 |
| 用更多推理计算 | 推理密集型、可验证任务 | 小模型 + 多次计算可超越大模型单次推理 |
显示答案 ▼
核心区别
| 维度 | ORM(Outcome RM) | PRM(Process RM) |
|---|---|---|
| 评分粒度 | 仅对最终答案打分 | 对推理的每一步打分 |
| 信号类型 | 稀疏信号(只有终点) | 密集信号(每步反馈) |
| Credit Assignment | 差(无法定位错误步骤) | 好(精确定位出错位置) |
| 训练数据成本 | 低(只需判断答案对错) | 高(需标注每步正确性) |
| 搜索效率 | 低(必须走完整条路径) | 高(可提前剪枝错误分支) |
| 典型应用 | 简单 Best-of-N 筛选 | Beam Search / MCTS 引导 |
ORM 详解
- 训练方式:给定问题 + 完整解题过程 + 最终答案,标注答案是否正确
- 使用方式:生成多个完整解答,用 ORM 对最终答案打分,选分数最高的
- 局限:即使答案正确,中间推理过程可能有错("凑对答案")
PRM 详解
- 训练方式:对推理链的每一步标注 {正确, 中性, 错误}
- 使用方式:在推理过程中逐步评估,可在任何一步发现错误并回溯
- 最终得分:所有步骤分数的聚合(如最小值或乘积)
PRM score: R(x, y₁, y₂, ..., yₜ) → r₁, r₂, ..., rₜ
最终分数 = min(r₁, ..., rₜ) 或 ∏ rᵢ
PRM 训练数据:Math-Shepherd 方法
- 问题:人工标注每步正确性成本极高
- Math-Shepherd 解决方案:
- 对每一步,从该步开始继续采样多条完整解答
- 统计这些续写中最终答案正确的比例
- 比例高 → 该步大概率正确;比例低 → 该步可能有错
- 本质:用 Monte Carlo 估计代替人工标注,自动化 PRM 数据构建
PRM 的核心优势
- 更好的 Credit Assignment:能精确定位推理链中第几步出错
- 更高效的搜索:不需要走完整条路径就能判断方向是否正确
- 更好的泛化:学会评估推理步骤的质量,而非记忆答案模式
显示答案 ▼
一、Best-of-N(Rejection Sampling)
- 流程:独立采样 N 条完整推理路径 → 用 Reward Model / Verifier 对每条打分 → 选得分最高的作为最终答案
- 计算量:N 倍推理成本(线性增长)
- 效果:
- 随 N 增大,正确率近似 log-linear 增长
- 但存在饱和效应:N 超过某个阈值后提升边际递减
- 原因:采样多样性有限,模型 policy 覆盖不到正确答案时 N 再大也无用
- 优点:实现简单、易并行、无需修改模型
- 缺点:计算效率低(大量重复无用计算)、无法利用中间步骤信息
实际效果:Accuracy ≈ a · log(N) + b (log-linear regime)
二、MCTS(蒙特卡洛树搜索)
- 核心思想:将推理步骤建模为树的节点,每个节点是一个推理步骤,边是可能的下一步
- 四个阶段:
- Selection:从根节点出发,用 UCB 公式选择子节点,平衡探索与利用
- Expansion:到达叶子节点时,用 LLM 生成新的推理步骤扩展
- Simulation:从新节点出发,快速模拟(rollout)到最终答案
- Backpropagation:将模拟结果反向传播,更新路径上所有节点的价值估计
- UCB 公式:
- 从 AlphaGo 到 o1 的迁移:
- AlphaGo:Policy Network + Value Network + MCTS 在围棋中超越人类
- o1 推测:LLM Policy + PRM Value + 树搜索在推理任务中增强
- 关键差异:LLM 的动作空间远大于围棋,需要 policy 做有效剪枝
- 优点:理论上计算效率最高,能发现最优推理路径
- 缺点:实现复杂、需要可靠的 value function、延迟高
三、Beam Search with Verifier
- 流程:
- 维护 beam_size 条候选推理路径
- 每步对所有候选生成下一步的多种延续
- 用 PRM 对每个新步骤打分
- 保留得分最高的 beam_size 条路径,剪枝其余
- 重复直至所有路径到达终点
- 与标准 Beam Search 的区别:
- 标准 Beam Search:用 token-level log-prob 打分
- Verifier-guided:用 step-level PRM 分数打分
- 优点:比 Best-of-N 高效(提前剪枝),比 MCTS 简单
- 缺点:贪心策略可能错过全局最优,PRM 偏差会累积
| 方法 | 计算效率 | 实现复杂度 | 需要的组件 | 适合场景 |
|---|---|---|---|---|
| Best-of-N | 低 | 低 | ORM/Verifier | 简单任务、快速部署 |
| Beam Search | 中 | 中 | PRM | 多步推理、可验证任务 |
| MCTS | 高 | 高 | Policy + Value | 复杂推理、计算预算充足 |
显示答案 ▼
内在自纠正(Intrinsic Self-Correction)
- 定义:模型仅依赖自身能力发现错误并修正,无外部反馈
- 典型做法:生成答案 → 提示"请检查你的答案" → 模型自行修改
- Huang et al. (2023) "Large Language Models Cannot Self-Correct Reasoning Yet" 核心结论:
- 在没有外部反馈时,Self-Correction 往往降低正确率
- 模型可能把对的答案"改错"(over-correction)
- 模型无法可靠区分自己的输出是对是错
- 根本原因:
- 如果模型第一次就能判断答案对错,为什么第一次不直接给出对的?
- 自纠正本质上需要一个比生成能力更强的"验证能力"——但同一个模型难以兼具
- "用同一个有缺陷的推理器来验证自己"是逻辑上的困境
外在自纠正(Extrinsic Self-Correction)
- 定义:借助外部工具或验证器提供反馈信号
- 有效的外部信号来源:
- 代码执行:运行代码,报错信息明确指出问题
- 单元测试:测试通过/失败是无歧义的二进制信号
- 搜索引擎:fact-check 事实性陈述
- 数学验证器:形式化证明检查
- 编译器:语法/类型错误的确定性反馈
- 关键区别:外部反馈提供了模型自身无法获得的"ground truth"信号
代表性框架
| 框架 | 机制 | 外部信号 | 效果 |
|---|---|---|---|
| Self-Refine | 生成 → 自我反馈 → 修改(迭代) | 无(纯内在) | 开放生成任务有效,推理任务效果存疑 |
| Reflexion | 执行 → 环境反馈 → 反思 → 重试 | 环境反馈(测试结果等) | 编程任务显著提升 |
| CRITIC | 生成 → 工具验证 → 修改 | 搜索/代码执行 | 事实性任务明显改善 |
| Self-Debug | 生成代码 → 执行 → 根据报错修改 | 代码执行结果 | 编程任务有效 |
何时 Self-Correction 有效?
- ✅ 有效场景:
- 有明确、自动化的验证信号(代码能跑 / 数学可验证 / 测试能通过)
- "验证比生成容易"的任务(P ≠ NP 的类比)
- 错误类型是可定位的(语法错误、类型错误、格式问题)
- ❌ 无效场景:
- 开放性推理(没有标准答案可对照)
- 模型置信度高但答案错误(幻觉)
- 需要新知识才能修正的错误
显示答案 ▼
两条技术路线
| 路线 | 方法 | 优点 | 缺点 |
|---|---|---|---|
| 蒸馏路线 | 用强模型(如 GPT-4/o1)生成 CoT 数据 → SFT 训练 | 简单、快速、稳定 | 天花板受限于教师模型、无法超越数据分布 |
| RL 路线 | RL(GRPO/PPO)+ Verifier/Reward → 模型自发涌现推理 | 天花板高、可超越训练数据 | 训练不稳定、成本高、需要好的 reward 设计 |
DeepSeek-R1 训练流程
阶段 1:R1-Zero(纯 RL 实验)
- 从 DeepSeek-V3-Base 出发,不做任何 SFT
- 直接用 GRPO 强化学习训练,奖励信号来自 Rule-based Verifier(数学答案对错)
- 惊人发现:模型自发涌现了 CoT 行为!
- 学会了分步推理
- 学会了自我验证("让我检查一下")
- 学会了回溯("等等,这步有问题")
- 思维链长度随训练自动增长
- 问题:语言混杂(中英混搭)、格式混乱、可读性差
阶段 2:R1 完整训练流程
- 冷启动 SFT:用少量高质量 CoT 数据做 SFT
- 目的:建立基本的推理格式和语言规范
- 数据量:数千条精标 CoT 样本
- GRPO 强化学习:
- 奖励信号:正确性(Rule-based)+ 格式规范性
- 模型学会产生更长、更深入的思维链
- 关键:不限制 CoT 长度,让模型自由探索
- Rejection Sampling + SFT 迭代:
- 用 RL 训练后的模型采样大量推理数据
- 筛选正确的作为新 SFT 数据
- 对模型做进一步 SFT 以提升通用能力
其中 r(θ) = π_θ(a|s) / π_old(a|s),A(s,a) 由组内相对排名计算(无需单独的 Critic)
关键发现与涌现能力
- RL 让模型学会"思考更久":
- 面对更难的问题,模型自动生成更长的思维链
- 这是自适应计算的涌现——模型学会了分配更多计算给更难的问题
- 思维链长度与问题难度正相关:
- 简单问题:几十个 token 的 CoT
- 困难问题:数千甚至上万 token 的 CoT
- 这不是人为设定的,是 RL 训练自然涌现的
- 涌现的推理能力:
- 🔄 反思(Reflection):"我觉得这个方法不太对,换一种思路"
- ↩️ 回溯(Backtracking):"第3步有问题,回到第2步重新推导"
- ✅ 验证(Verification):"让我代入原方程验证一下答案"
- 📐 多角度尝试:先试方法A,不行再试方法B
16. 训练稳定性与工程实战
查看答案
常见原因
- 数据质量问题:某个 batch 含异常样本(损坏、标注错误、极端值)
- 学习率过大:导致梯度爆炸,参数更新幅度过大
- 数值溢出:FP16 下出现 inf/nan,超出表示范围
- 数据分布突变:不同领域数据边界处分布剧变
处理方法
- 梯度裁剪:clip grad norm,通常设为 1.0
- 数据回溯:检查 spike 前后的训练数据,定位问题样本
- Checkpoint 回滚:从最近 checkpoint 恢复,跳过问题数据
- 降低学习率重启:减小 lr 后从 checkpoint 继续训练
- z-loss 正则化(PaLM 使用):抑制 logits 过大
z-loss 正则化
查看答案
三种低精度格式
- FP16:指数位 5,尾数位 10,范围 ±65504
- BF16:指数位 8,尾数位 7,范围同 FP32,但精度较低
- FP8(E4M3 / E5M2):H100+ 支持,分别用于前向计算和梯度
精度格式对比
| 格式 | 指数位 | 尾数位 | 动态范围 | 需要 Loss Scaling | 典型用途 |
|---|---|---|---|---|---|
| FP16 | 5 | 10 | ±65504 | ✅ 必须 | V100/A100 训练 |
| BF16 | 8 | 7 | 同 FP32 | ❌ 不需要 | A100/H100 训练(推荐) |
| FP8 E4M3 | 4 | 3 | ±448 | 需要 per-tensor scaling | H100 前向计算 |
| FP8 E5M2 | 5 | 2 | ±57344 | 需要 per-tensor scaling | H100 梯度 |
Loss Scaling(FP16 必须)
- 前向时将 loss 乘以 scale factor(放大梯度,避免 underflow)
- 反向传播后将梯度除以 scale factor(还原真实梯度)
- Dynamic Loss Scaling:遇到 overflow 则减半 scale,连续 N 步无 overflow 则加倍
grads = backward(scaled_loss)
true_grads = grads / S
查看答案
Checkpoint 频率
- 通常每 1000~5000 steps 保存一次
- 权衡:太频繁浪费 I/O 和存储;太稀疏则故障后回退代价大
Async Checkpoint
- 异步写入,不阻塞训练(Megatron-LM 实现)
- 将模型状态拷贝到 CPU/pinned memory,后台线程写入存储
- 训练继续前进,写入与计算重叠
分布式 Checkpoint
- 每个 rank 独立保存自己的 shard(避免汇聚到单节点)
- 支持 resharding:改变并行度后仍可恢复训练(如从 TP=8 变为 TP=4)
故障恢复流程
- 检测故障:NCCL timeout / GPU ECC error / 进程崩溃
- 从最近 checkpoint 加载:恢复模型参数、优化器状态、scheduler
- 快进 data loader:使用确定性 shuffle,跳到正确的数据位置
- 跳过或标记问题节点:将故障 GPU/节点从集群中移除
Elastic Training
- 支持动态增减节点,不中断训练
- 节点故障时自动缩容继续训练,修复后扩容回来
- 代表框架:TorchElastic、Varuna
查看答案
核心指标
| 指标 | 健康状态 | 异常信号 |
|---|---|---|
| Loss 曲线 | 平滑下降 | 持续 spike 或上升 |
| Gradient Norm | 稳定在某个范围 | 突然增大 → 不稳定 |
| Learning Rate | 与 scheduler 一致 | 偏离预期曲线 |
| Token Throughput (tokens/s/GPU) | 稳定 | 下降 → 有 straggler |
| GPU Utilization / MFU | MFU > 40% | MFU 骤降 → 通信瓶颈/慢节点 |
高级指标
- 参数 norm(各层权重大小):异常增长说明训练发散
- 激活值范围:检测 nan/inf,尤其关注最后几层
- 梯度中 zero 比例:过高说明 dead neurons(ReLU 死亡)
告警规则
grad_norm > 10× 历史均值→ 立即告警loss 连续 100 步上升→ 自动暂停训练MFU < 阈值→ 检查慢节点、网络问题
查看答案
GPU 互联层级
- NVLink / NVSwitch:单机内 GPU 互联(H100: 900GB/s per GPU)
- InfiniBand / RoCE:机间网络(400Gbps NDR IB)
- 以太网:跨机架/跨机房(带宽最低,延迟最高)
互联技术对比
| 技术 | 带宽 | 延迟 | 范围 | 典型用途 |
|---|---|---|---|---|
| NVLink (H100) | 900 GB/s | ~μs | 单机内 | Tensor Parallelism |
| InfiniBand NDR | 400 Gbps (50 GB/s) | ~1-2 μs | 机间 | Data Parallelism AllReduce |
| RoCE v2 | 100-400 Gbps | ~2-5 μs | 机间 | IB 替代(以太网上 RDMA) |
| 以太网 | 25-100 Gbps | ~10-50 μs | 跨机架 | 管理面 / 非关键通信 |
通信瓶颈分析
- TP 通信在 NVLink 内完成(低延迟、高带宽,AllReduce 频繁)
- PP 通信为点对点 P2P(少量激活值数据,延迟敏感)
- DP 的 AllReduce 走 InfiniBand(大数据量梯度同步,带宽敏感)
拓扑感知并行策略
- 同一节点内做 TP(需要最高带宽,NVLink 满足)
- 跨节点做 DP 和 PP(通信量相对较少,IB 可承载)
- DeepSeek-V3 的 Expert Parallelism 需要大量 All-to-All 通信,对网络拓扑要求极高
网络故障处理
- 链路闪断:自动重试 + 备用路径切换(多 rail 网络)
- NCCL timeout:检测超时后标记故障节点,触发 checkpoint 恢复
- 慢节点检测:监控各节点 AllReduce 完成时间,stragglers 会拖慢整体训练
17. 端侧与高效部署
显示答案 ▾
非结构化剪枝:逐元素置零(SparseGPT / Wanda)
- 优势:压缩率高,可达 50%~60% 稀疏度几乎无损
- 劣势:需要稀疏硬件支持(如 NVIDIA A100 Sparse Tensor Core 2:4)才有实际加速
结构化剪枝:移除整行/整列/整层(SliceGPT / ShortGPT / LaCo)
- 优势:直接减少计算量,无需特殊硬件即可加速
- 劣势:精度损失可能更大,需要更精细的重要性评估
剪枝粒度层次:
| 方法 | 类型 | 粒度 | 是否需要校准数据 | 硬件要求 |
|---|---|---|---|---|
| SparseGPT | 非结构化 | 权重级 | 需要少量 | 稀疏硬件加速 |
| Wanda | 非结构化 | 权重级 | 不需要 | 稀疏硬件加速 |
| SliceGPT | 结构化 | 通道级 | 需要少量 | 通用硬件 |
| ShortGPT | 结构化 | 层级 | 需要少量 | 通用硬件 |
| LaCo | 结构化 | 层级 | 需要少量 | 通用硬件 |
显示答案 ▾
Prefill 阶段特点:
- 计算密集(处理全部 prompt tokens,大矩阵乘法)
- GPU 利用率高,Compute-bound
- 延迟要求:TTFT(Time To First Token)
Decode 阶段特点:
- 显存密集(KV Cache 持续增长)
- 计算利用率低(每次只算 1 个 token),Memory-bound
- 延迟要求:TPOT(Time Per Output Token)
分离架构优势:
- Prefill 机器配高算力卡(如 H100)—— 最大化 FLOPS 利用
- Decode 机器配大显存卡或多卡分摊 KV Cache —— 最大化显存带宽利用
- 独立扩缩容,资源利用率更高,避免互相干扰
KV Cache 传输:
显示答案 ▾
白盒蒸馏(Logit-level):
- Student 拟合 Teacher 的 logits 分布(KD Loss = KL Divergence)
- 需要 Teacher 推理完整前向,成本高
- 保留了 Teacher 的概率分布信息(dark knowledge)
黑盒蒸馏(Data-level):
- Teacher 生成高质量回答 → Student 做 SFT
- Alpaca / Vicuna 等开源模型的核心方法
- 更实用、成本低,但丢失 Teacher 的概率分布信息
实践 Pipeline:
- 大模型对大量 prompt 生成回答(数据合成)
- 质量过滤(Self-consistency / Reward Model 打分)
- 小模型 SFT 训练
- (可选)小模型 DPO/RLHF 对齐
| 维度 | 白盒蒸馏 | 黑盒蒸馏 |
|---|---|---|
| 信息来源 | Teacher logits | Teacher 生成文本 |
| 是否需要 Teacher 参数 | 需要 | 不需要(API 即可) |
| 成本 | 高(全量前向) | 低(只需生成) |
| 信息保留 | 概率分布完整 | 仅 argmax 输出 |
| 代表工作 | MiniLLM, GKD | Alpaca, Vicuna, WizardLM |
显示答案 ▾
NVIDIA GPU(H100 / A100):
- 生态最成熟,CUDA 工具链完善(vLLM、TensorRT-LLM 等)
- Tensor Core 支持 FP8 / INT8 / FP16
- H100:989 TFLOPS (FP8),80GB HBM3,3.35 TB/s 带宽
Google TPU(v5p):
- 针对矩阵运算优化,大规模互联(ICI,芯片间高速互联)
- XLA 编译器自动优化,但灵活性较低
- 优势在大 batch 训练,单卡推理生态弱于 GPU
华为 Ascend NPU(910B):
- 自主可控需求驱动
- Da Vinci 架构,支持 INT8 / FP16
- 生态相对不成熟,算子适配和调试成本较高
选型考虑:
| 场景 | 推荐硬件 | 理由 |
|---|---|---|
| 推理延迟敏感 | NVIDIA GPU | CUDA 优化成熟,推理框架丰富 |
| 大规模训练 | Google TPU | TCO 可能更低,大规模互联优势 |
| 国产化要求 | 华为 Ascend NPU | 自主可控,政策合规 |
显示答案 ▾
核心挑战:
- 内存限制:手机 6~12GB 总内存,模型 + KV Cache 需要 fit 在有限空间内
- 计算能力有限:手机 GPU/NPU 约 10 TOPS,远低于数据中心卡
- 功耗/散热约束:持续推理会导致降频
关键技术:
- 激进量化:INT4 / INT3 甚至 INT2(BitNet 1.58b)
- 小模型设计:Phi-3-mini / Gemma-2B / Qwen-1.5B
- 推理引擎优化:llama.cpp / MLC-LLM / ExecuTorch
- KV Cache 管理:限制最大 context / 动态 eviction(StreamingLLM)
模型架构优化:
- GQA(Grouped Query Attention)减少 KV Cache 占用
- 深窄网络 vs 浅宽网络的取舍 —— 窄网络更适合端侧内存约束
- 知识蒸馏从大模型迁移能力到小模型
例:3.8B × 4bit / 8 = 1.9GB 权重 + KV Cache 约 0.5~1GB
| 引擎 | 特点 | 支持平台 |
|---|---|---|
| llama.cpp | 纯 C/C++,GGUF 格式,社区活跃 | 全平台(iOS/Android/PC/Mac) |
| MLC-LLM | TVM 编译优化,Vulkan/Metal 后端 | Android/iOS/Web |
| ExecuTorch | PyTorch 官方端侧方案 | iOS/Android |