第 16 章 大模型训练范式

第 15 章给出了 Transformer 这台机器的结构,本章回答的是"这台机器用什么目标函数、喂什么数据、经过哪几个阶段被训练成对话助手"——即从预训练到偏好对齐的完整流水线,以及在每个阶段"评估什么、什么时候该停"。

学习目标

读完本章,你应当能够:

  1. 写出语言模型的自回归分解式,并辨析自回归目标与掩码语言模型目标的差异;
  2. 解释困惑度(perplexity)的定义、与交叉熵的关系,以及它作为代理指标的局限;
  3. 推导 PPO 的 clip 目标与优势函数的作用,说明 KL 惩罚项为什么必要;
  4. 写出 GRPO 的组内相对优势公式,并解释它为什么能替代 critic、代价是什么;
  5. 说明 token 级重要性采样比率在长序列下方差爆炸的机理,以及 GSPO 的序列级修正;
  6. 从 RLHF 目标推导出 DPO 的偏好损失主干,说明它省掉了什么;
  7. 判断一个给定的预训练评估与终止策略是否合理。

前置知识检查

你需要知道在哪一节补齐
条件概率、链式法则、期望与方差见第 4 章 4.1~4.4 节
交叉熵、KL 散度、互信息见第 4 章信息论部分
Softmax 与数值稳定性见第 5 章、第 9 章 Softmax 回归
梯度下降、学习率调度、Adam见第 6 章
过拟合、早停、偏差-方差见第 7 章、第 8 章
自注意力、因果掩码、KV Cache见第 15 章

16.1 语言模型的形式定义

16.1.1 从联合概率到自回归分解

一段文本在词元(token)层面就是一个序列 x = (x₁, x₂, …, x_N),其中每个 x_t 取自词表 V。语言模型要建模的全部内容,就是这个序列的联合概率 P(x₁, x₂, …, x_N)。

直接用一张表存 |V|^N 个概率是不可能的:|V| = 50000、N = 1000 时参数量是天文数字。概率论给了我们唯一的出路——链式法则(chain rule):

1
2
P(x₁, x₂, …, x_N) = P(x₁) · P(x₂|x₁) · P(x₃|x₁,x₂) · … · P(x_N|x₁,…,x_{N−1})
                  = Π_{t=1}^{N} P(x_t | x_1, …, x_{t−1})

链式法则本身是恒等式,没有任何近似。真正引入建模假设的是下一步:假设条件概率只依赖前 t−1 个 token 构成的前缀 x_<t,且这个依赖由一个参数为 θ 的神经网络统一表达:

1
P_θ(x) = Π_{t=1}^{N} P_θ(x_t | x_<t)          x_<t ≜ (x₁, …, x_{t−1})

这就是自回归语言模型(autoregressive LM)。它有两个关键性质:① 参数共享——整条序列的所有位置共用同一个网络、同一套参数,因此参数量与 N 无关;② 训练信号密集——长度为 N 的序列一次前向就产生 N 个预测任务(第 t 位预测第 t+1 位),这是自监督学习效率极高的根源。

重要

自回归分解是"乘法“形式的,取对数后变成加法,这正是训练目标写成"逐 token 交叉熵之和"的原因。对数把连乘转成连加,既避免了 N 个小于 1 的数相乘导致的数值下溢,也让梯度可以逐位置分解。

16.1.2 训练目标:逐 token 交叉熵

给定语料中一条真实序列,模型在第 t 位给出的分布是 P_θ(· | x_<t),真实的下一个 token 是 x_t。用交叉熵度量两个分布的差距:

1
L(θ) = −(1/N) · Σ_{t=1}^{N} log P_θ(x_t | x_<t)

按第 4 章的结论,−log P_θ(x_t|x_<t) 就是"在模型分布下观测到真实 token 的负对数似然”;对整条序列求和再平均,等价于最小化模型分布与数据分布之间的交叉熵,也等价于最大化对数似然。三者是同一件事的三种说法:

说法表达式优化视角
最大似然max Σ_t log P_θ(x_t|x_<t)统计估计
最小交叉熵min H(p_data, p_θ)信息论
最小负对数似然min −Σ_t log P_θ(x_t|x_<t)深度学习实现

16.1.3 自回归与掩码语言模型的目标对比

BERT 一类模型走的是另一条路:掩码语言模型(Masked Language Model, MLM)。它随机遮盖 15% 左右的 token,让模型根据左右两侧的上下文还原被遮的词。两者的差别不只是"遮不遮",而是建模的对象不同:

1
2
3
自回归(GPT 式):  P(x) = Π_t P(x_t | x_<t)     每步只看左侧,对联合分布无偏
掩码(BERT 式):   Σ_{i∈M} log P(x_i | x_{∖M})   每个被遮位置看双侧,
                                                且 P(x_i|x_{∖M}) 无法拼回 P(x)
维度自回归 LM(GPT 式)掩码 LM(BERT 式)
条件方向 / 联合分布单向(因果掩码),给出合法联合分布双向,多个条件分布互相不自洽
训练与推理是否一致一致(都是逐位预测),可直接流式生成不一致(预训练含 [MASK],下游不含)
天然擅长的任务生成、续写、对话分类、抽取、句对匹配

MLM 的"训练-推理不一致"是长期存在的缺陷:预训练时输入含 [MASK],微调时不含,模型从未学过"没有 [MASK] 时该做什么"。这也是 Encoder-Decoder 与自回归统一路线逐渐占据生成任务主流的原因。


16.2 预训练:数据、规模与上下文

16.2.1 数据规模与清洗去重

预训练的本质是"用海量文本把语言与世界知识压进参数"。工程上真正决定成败的往往不是模型结构,而是数据管线。典型处理链路:

1
2
3
4
原始抓取(Common Crawl 级) ──► 语言识别/编码统一 ──► 正文抽取(去导航条、广告、模板)
   ──► 质量过滤(困惑度过滤 / 分类器打分 / 启发式规则)
   ──► 去重(精确哈希 + MinHash/SimHash 近似去重,文档级 + 段落级)
   ──► 隐私清洗(PII 脱敏、黑名单)──► 配比混采(网页 : 代码 : 书籍 : 论文)

为什么要去重? 重复文本会让模型把有限容量浪费在记忆副本上,等效于降低有效数据量;更严重的是,若重复内容同时出现在训练集与验证集,验证 loss 会被人为压低、评估失效(数据泄漏)。业界反复观测到:重复率高的语料上训练到后期 loss 会突然跳变上升,这通常是模型开始记住重复片段、泛化退化的信号。至于规模,给定算力预算时参数量 N_p 与训练 token 数 D 存在近似最优比:Chinchilla 的结论是"两者同比扩展"(D ≈ 20·N_p),而实际部署的模型常在推理成本约束下故意把 N_p 压小、把 D 拉得远超 20 倍(“过度训练”),因为推理是一辈子的事,训练是一次性的事。

16.2.2 Scaling Law 的直觉

Scaling Law(扩展律)是经验规律:测试集上的交叉熵损失随参数量、数据量、算力的增加呈幂律下降:

1
2
3
L(N_p) ∝ N_p^(−α)        α ≈ 0.05 ~ 0.1
L(D)   ∝ D^(−β)          β ≈ 0.05 ~ 0.1
L(C)   ∝ C^(−γ)          γ ≈ 0.05

它值得记住不是因为能精确预测,而是因为它给出三条工程直觉:① 单调且平滑——没有"过了某个规模就突然变聪明"的台阶,因此小规模实验可以外推,但规模决策必须靠算力预算终止;② 收益递减但不停滞——每提升固定比例算力,损失的绝对改善越来越小却始终为正;③ 可加性——模型容量、数据量、不可约噪声的贡献近似可加,“数据不够"与"模型太小"因此可以用小规模消融实验区分,这是决定加参数还是加数据的依据。引入不可约项(irreducible loss,数据固有熵下界)后得到 L = L_∞ + A·N_p^(−α):L_∞ 是再怎么变大也降不下去的底线。

16.2.3 困惑度:为什么它的量纲是"等效候选数”

perplexity(困惑度,PPL)定义为交叉熵的指数:

1
2
H = −(1/N) · Σ_t log P_θ(x_t | x_<t)      (自然对数,单位 nat)
PPL = exp(H)

它的直觉解释:如果模型对每个位置的预测完全均匀分布在一个规模为 k 的候选集上,那么 P_θ(x_t|·) = 1/k,于是 H = log k、PPL = k。所以 PPL 可以读作"模型在每个位置平均在多少个等概率候选之间犹豫"。PPL = 1 表示模型对每个 token 都给出概率 1(完美);PPL = |V| 表示模型完全没学到东西(等于均匀猜测)。

警告

不同分词器的 PPL 不可直接比较。PPL 是"每 token"的量纲:同一段文本,用 50000 词表的 BPE 切成 100 个 token 和切成 130 个 token,即使模型完全一样,PPL 也会差出可观的数值。跨模型比较 PPL 必须换算到每字符/每字节的层面,或者干脆不用 PPL 比较,改用下游基准。

16.2.4 上下文长度扩展

预训练时通常固定一个上下文窗口 N_max(如 2048 或 4096),因为注意力复杂度是 O(N²)、KV Cache 线性增长,窗口越大单步成本越高。但部署时又希望窗口更长。常见的扩展手段有三类:

手段做法代价
位置插值(position interpolation)把超出训练范围的位置索引压缩进原区间高频细节分辨率下降
RoPE 频率缩放(NTK / YaRN 类)只降低低频分量的旋转频率,保持高频分辨力需要少量长文本继续训练
继续预训练(long-context continued pretraining)直接在长文档上继续训一段时间算力成本最高,但效果最稳

为什么不能直接把窗口设成 100 万? 一是注意力 O(N²) 的成本,二是更要紧的:位置编码在训练范围外没有见过,“外推"行为不可控。长度扩展的实质不是把数组开大,而是让位置编码在更长区间上仍然良定义、且模型见过足够多的长依赖样本。


16.3 损失是代理指标

这一节专门解释三个反直觉现象。它们既是工程常识,也是 09-09 Q10 的命题依据。

现象一:预训练 loss 趋平,但下游能力仍在爬升。 loss 衡量的是"对语料下一个 token 的预测能力”,是一个代理指标(proxy metric);下游能力(推理、代码、指令遵循)是能力的涌现表现,与 loss 不是严格同步的函数关系。可以这样理解:后期 loss 的下降主要来自"把已经会的东西的概率调得更准"(校准改进),而不是"学会了新技能";而新技能往往依赖若干能力的组合,只有当每个组成部分都跨过可用阈值时才突然显现,于是出现"loss 平、分数升"的错位。

现象二:大规模预训练几乎不出现传统意义的过拟合。 第 8 章讲的过拟合,条件是"参数量相对数据量过大 + 训练轮次过多"。预训练恰恰相反:数据量以万亿 token 计,而训练通常只遍历语料 1 遍左右(甚至不足 1 遍),模型容量远小于数据的信息量,也没有反复记忆同一批样本的机会。因此"训练 loss 继续降 = 一定在过拟合"这个在中小数据集上成立的推论,在这里不成立。

现象三:验证 loss 抖动,多数不是过拟合。 大规模训练中验证 loss 的短期上升常见来源是:数据分布切换(语料按来源配比混采,某个 batch 全是代码、下一个全是网页,而验证集分布固定)、学习率调度(warmup 或余弦衰减的周期内学习率变化本身会让曲线出现台阶)、数值与硬件因素(混合精度 loss scale 调整、梯度累积边界、通信重排改变有效 batch 组成)。

重要

一句话总结:loss 是代理指标,能力要靠下游基准测;预训练几乎不会过拟合,不要拿小数据集的早停逻辑去套预训练。 这正是 09-09 Q10 选 A 的全部理由,也是排除 B、C、D 的依据。


16.4 监督微调与指令微调

预训练出来的模型只会"续写",不会"听话"。监督微调(Supervised Fine-Tuning, SFT) 用人工构造的"指令 → 理想回答"配对数据,把续写模型改造成对话助手。数据构造有三个要素:

  1. 格式一致性:训练与推理必须用同一套对话模板(chat template)。系统提示、角色标记、结束符的位置若训练与部署不一致,模型会表现出"莫名其妙的自言自语"或"不停重复用户问题"。
  2. 只对回答部分计算损失:用户指令的 token 通常被 mask 掉(loss mask),因为要教的是"给定指令该输出什么",而不是"生成用户的指令";对指令部分也算 loss 会浪费容量去建模用户话术。
  3. 多样性与难度分布:SFT 数据的质量(正确性、格式、信息密度)远比数量重要——少量高质量样本即可显著改变行为,海量低质样本会把模型带向"话痨、含糊、格式漂移"。

灾难性遗忘(catastrophic forgetting):SFT 数据分布极窄(都是对话),训练若干轮后,模型在预训练阶段习得的部分能力(长文续写、代码补全、多语言)会明显退化。缓解手段:混入一定比例的预训练数据(replay)、用较小学习率、只训练部分层或用 LoRA 类低秩适配器、对参数更新施加约束(KL 或 L2 惩罚,见第 8 章)。


16.5 RLHF:三阶段流水线

SFT 之后,模型"会答"但"答得不够好"——它不知道人类更偏好哪种风格、更在意安全性还是信息量。基于人类反馈的强化学习(Reinforcement Learning from Human Feedback, RLHF) 用人类偏好作为信号继续优化,由三个阶段组成:

1
2
3
阶段 1  SFT:用 (指令, 理想回答) 微调                  →  得到 π_SFT
阶段 2  RM :用 (prompt, 更好回答 y_w, 更差回答 y_l)   →  训练奖励模型 r_φ
阶段 3  RL :用 r_φ 作为奖励,用 PPO 类算法优化        →  策略 π_θ

阶段 2 的目标函数。奖励模型要学到"哪个回答更好",最常用的建模假设是 Bradley-Terry 模型——偏好概率是奖励差的 Sigmoid:

1
2
P(y_w ≻ y_l | x) = σ( r_φ(x, y_w) − r_φ(x, y_l) )
L(φ) = − E_{(x, y_w, y_l)} [ log σ( r_φ(x, y_w) − r_φ(x, y_l) ) ]

注意损失只依赖奖励之差,因此 r_φ 整体加一个常数不改变任何东西——奖励的绝对尺度没有意义,只有相对大小可辨识。这是后面"用组内均值做基线"合理的根本原因之一。

阶段 3 的目标。RLHF 要最大化期望奖励,同时不允许策略偏离参考模型 π_ref(通常是 SFT 模型)太远:

1
maximize  E_{x∼D, y∼π_θ(·|x)} [ r_φ(x, y) ]  −  β · KL( π_θ(·|x) ‖ π_ref(·|x) )

16.6 PPO:策略梯度、优势与 clip

16.6.1 从策略梯度到优势函数

策略梯度的基本结论(REINFORCE)是:要让期望回报变大,就沿着"回报高时提高该动作概率"的方向更新:

1
∇_θ J = E_{y∼π_θ} [ R(y) · ∇_θ log π_θ(y) ]

这条式子的方差极大,因为 R(y) 的绝对值没有意义(奖励整体平移不该改变梯度方向)。解决方法是减去一个基线(baseline):

1
∇_θ J = E [ (R(y) − b) · ∇_θ log π_θ(y) ],     b 与 y 无关

R(y) − b 就是**优势函数(advantage)**的采样估计,表示"这个动作比平均水平好多少"。对语言模型,通常逐 token 分解:

1
A_t = Q(s_t, a_t) − V(s_t)

其中 V(s_t) 是**价值网络(critic)**对"从当前前缀出发的期望回报"的预测。GAE(Generalized Advantage Estimation,广义优势估计) 用折扣因子 γ 和迹参数 λ 在"高偏差低方差"(只用 V)与"低偏差高方差"(用完整回报)之间插值:

1
2
δ_t = r_t + γ·V(s_{t+1}) − V(s_t)              (时序差分误差)
A_t^GAE = Σ_{l≥0} (γλ)^l · δ_{t+l}             (λ→0 退化为单步 TD;λ→1 接近蒙特卡洛回报)

16.6.2 clip 目标与 KL 惩罚

PPO 的核心是用重要性采样比率限制每次更新的幅度。设更新前策略为 π_old:

1
2
3
r_t(θ) = π_θ(a_t|s_t) / π_old(a_t|s_t)

L^CLIP(θ) = E_t [ min( r_t(θ)·A_t,  clip(r_t(θ), 1−ε, 1+ε)·A_t ) ]

min 与 clip 的组合表达了"乐观时不占便宜,悲观时不给奖励":A_t > 0 时目标鼓励提高 r_t,但一旦 r_t > 1+ε 就被截断、梯度归零,防止一次把某条轨迹的概率推得过高;A_t < 0 时目标鼓励压低 r_t,但一旦 r_t < 1−ε 也截断,防止把概率压到接近 0 而丧失探索。

KL 惩罚项有两个作用:① 防止策略跑偏——奖励模型是有限数据上拟合的近似函数,在分布外区域会给出错误的高分;若允许策略无约束地追逐 r_φ,它一定会跑到 r_φ 的盲区去,这就是奖励黑客(reward hacking),KL 项把策略拴在 π_ref 附近使它留在奖励模型可靠的分布内;② 保留基座能力——偏离 π_ref 越远,语言流畅性、格式、知识越容易退化(对齐税,见 16.10 节)。

实际实现中 KL 常以"逐 token 惩罚加到奖励里"的形式出现:

1
r_t' = r_t − β · ( log π_θ(a_t|s_t) − log π_ref(a_t|s_t) )

括号内是 KL 的单样本估计:KL(π_θ‖π_ref) = E_{a∼π_θ}[ log π_θ(a) − log π_ref(a) ],用当前采样出的那个 a 就能算,无需遍历词表。

16.6.3 critic 的成本

PPO 需要一个与策略同规模的价值网络,这带来三重成本:

成本项具体表现
显存多存一整套参数 + 优化器状态(Adam 下是参数的数倍),约等于显存占用翻倍
算力每次前向/反向都要多跑一遍同规模网络
训练难度价值网络本身就难训:回报尺度不定、长期信用分配困难、与策略同步漂移

这三个成本合起来,正是 GRPO 出现的直接动因。


16.7 GRPO:用组内相对优势去掉 critic

分组相对策略优化(Group Relative Policy Optimization, GRPO) 的关键观察是:既然优势函数只需要"比平均水平好多少",而这个"平均水平"完全可以用同一 prompt 下多次采样的平均奖励来估计,那么 critic 就是可以省掉的。

具体流程:对同一个 prompt x,用当前策略采样一组 G 个回答 {y₁, y₂, …, y_G},打分得到 {R₁, …, R_G},然后:

1
2
3
4
μ = (1/G) · Σ_{i=1}^{G} R_i                                  (组内均值)
σ = sqrt( (1/G) · Σ_{i=1}^{G} (R_i − μ)² )                   (组内标准差,常加 EPS 防除零)

A_i = (R_i − μ) / (σ + EPS)                                  (组内相对优势)

然后把 A_i 当作该条回答所有 token 共用的优势,套进 PPO 的 clip 目标:

1
2
3
J_GRPO(θ) = E_{x, {y_i}} [ (1/G) Σ_i  (1/|y_i|) Σ_t
              min( r_{i,t}(θ)·A_i , clip(r_{i,t}(θ), 1−ε, 1+ε)·A_i )
              − β · KL_t ]

为什么它能替代 critic?

  • 策略梯度的方差来自"回报绝对值的不确定性"。减去任何与动作无关的基线 b(x) 都不改变梯度的期望值(因为 E_{a∼π}[∇log π(a)·b] = b·∇Σ_a π(a) = 0)。所以"基线必须是 V(s_t)“是一个被过度强化的印象——它只是方差最小的那个选择,不是唯一合法选择。同一 prompt 下的 G 个回答共享同一个输入、条件分布相同,因此组内均值 μ 天然是 V(x) 的一个无偏、低方差估计,且完全不需要额外网络。
  • 分母 σ 进一步把不同 prompt 的奖励尺度归一化——因为奖励模型只知道相对大小(16.5 节),不同 prompt 的奖励绝对值不可比,除以组内标准差恰好消除了这个不可比性。于是"相对优势"被定义为"在这 G 个回答里排得怎么样”,与奖励的绝对尺度无关。

代价是什么?

代价说明
采样量更大每个 prompt 要采 G 条(常见 8~64),PPO 通常用较少条轨迹 + bootstrap
组内零方差若 G 个回答得分完全相同则 σ = 0、A_i = 0,该 prompt 对梯度毫无贡献(白采样)
需要可重复打分的奖励组内比较要求打分稳定;生成式评判(LLM-as-judge)的噪声会直接污染优势
长序列的归一化选择按 token 平均还是按序列平均会改变长度偏置,见 16.10 节

注意

GRPO 仍然是**在线(on-policy)**算法:必须用当前策略新采样数据,且一次要采一组。所以"不需要采样"(09-04 Q5 选项 A)与"完全离线"(选项 D)都是错的;“需要训练 critic”(选项 B)描述的正是它要去掉的东西。


16.8 GSPO:序列级重要性比率

16.8.1 token 级比率为什么会爆炸

PPO/GRPO 在实现时把重要性采样比率逐 token 计算:

1
r_{i,t}(θ) = π_θ(y_{i,t} | x, y_{i,<t}) / π_old(y_{i,t} | x, y_{i,<t})

这个写法在长序列下有三个叠加的问题:

  1. 连乘的方差累积。序列级重要性权重在数学上是 token 级比率的连乘 R_i(θ) = Π_t r_{i,t}(θ)。若单个比率的对数方差为 v,L 个近似独立的比率连乘后对数方差约为 L·v——方差随序列长度线性增长,权重波动幅度按 exp(√(Lv)) 放大。序列越长,估计越不可靠。
  2. 逐 token 裁剪破坏理论一致性。clip 原本要限制整条序列的概率变化幅度,逐 token 裁剪却只能限制单点变化:每个 token 都恰在 1±ε 内,连乘后整条序列的比率仍可达 (1+ε)^L——L = 2048、ε = 0.2 时这个数大到荒谬,裁剪的约束力随长度衰减。
  3. 目标与奖励粒度不匹配。奖励 R_i 是整条序列的一个标量,比率却是 token 级的;用 token 粒度匹配序列粒度的信号,相当于给每条轨迹人为制造了 L 个独立噪声通道。

16.8.2 序列级比率与序列级裁剪

组序列策略优化(Group Sequence Policy Optimization, GSPO) 的做法是:把重要性采样比率直接定义在整条序列上,并用长度归一化控制尺度:

1
2
3
s_i(θ) = ( π_θ(y_i|x) / π_old(y_i|x) )^(1/|y_i|)

      = exp( (1/|y_i|) · Σ_t [ log π_θ(y_{i,t}|·) − log π_old(y_{i,t}|·) ] )

这个开 1/|y_i| 次方(等价于对 log 比率取平均)是全部技巧的关键:它把"连乘导致的对数方差随 L 线性增长"变成"平均对数比率",其方差随 L 下降(约 v/L)。于是不同长度的序列落在同一个可比的尺度上,裁剪阈值 1±ε 对长短序列才有了一致的约束力。

对应的目标:

1
J_GSPO(θ) = E [ (1/G) Σ_i  min( s_i(θ)·A_i , clip(s_i(θ), 1−ε, 1+ε)·A_i ) ]

整条序列共用一个比率、只裁一次,梯度也按序列粒度回传。这既降低了方差,也让优化目标与"序列级奖励"的粒度对齐。

重要

08-05 Q15 的答案链条是:token 级比率在长序列下连乘/逐 token 裁剪 → 方差随长度迅速放大 → GSPO 改用序列级比率 + 序列级裁剪 → 压低方差、稳定长序列训练。题干问的是"引入序列级比率的主要原因",答案只能是方差控制;“提高探索能力"“消除奖励模型偏差"都不属于重要性采样比率的功能。


16.9 DPO:把 RLHF 折叠成分类损失

16.9.1 从 RLHF 目标推导偏好损失

从 16.5 节的目标出发。为书写方便把 prompt x 省略,把 KL 项写成期望形式:

1
2
3
max_π  E_{y∼π} [ r(y) ] − β · E_{y∼π} [ log ( π(y) / π_ref(y) ) ]
     = E_{y∼π} [ r(y) − β·log ( π(y) / π_ref(y) ) ]
     = −β · E_{y∼π} [ log ( π(y) / π_ref(y) ) − r(y)/β ]

关键一步:定义配分函数 Z = Σ_y π_ref(y)·exp( r(y)/β )。因为 π_ref(y)·exp(r(y)/β)/Z 非负且求和为 1,它是一个合法的概率分布,记为 π*(y)。于是上式可改写为

1
2
= −β · E_{y∼π} [ log ( π(y) / π*(y) ) ] + 常数
= −β · KL( π ‖ π* ) + 常数

KL 散度非负、当且仅当 π = π* 时取 0,因此 RLHF 目标的最优解有闭式:

1
2
3
π*(y) = (1/Z) · π_ref(y) · exp( r(y)/β )

反解出奖励:  r(y) = β · log ( π*(y) / π_ref(y) ) + β · log Z

这就是 DPO 的枢纽:奖励可以用"最优策略与参考策略的对数比"重新参数化,log Z 只依赖 x 而与 y 无关。把它代回 16.5 节的 Bradley-Terry 偏好损失:

1
2
L_DPO = − E_{(x, y_w, y_l)} [ log σ( r(x,y_w) − r(x,y_l) ) ]
      = − E [ log σ( β·log(π_θ(y_w|x)/π_ref(y_w|x)) − β·log(π_θ(y_l|x)/π_ref(y_l|x)) ) ]

两个 β·log Z 在相减中正好抵消——这正是"奖励只可辨识到相差一个常数"的直接兑现。最终损失里只剩策略模型 π_θ 与固定的参考模型 π_ref,奖励模型和 RL 循环都不见了。

16.9.2 DPO 的性质与家族

维度PPO/GRPO(在线 RLHF)DPO(离线偏好优化)
需要奖励模型需要不需要
需要在线采样需要(每轮新采样)不需要(用固定偏好数据集)
训练稳定性对超参敏感,易崩类似监督学习,稳定
数据效率 / 能力上限采样贵,但可在线探索持续改进依赖离线数据集覆盖度,分布外行为无法纠正
工程复杂度高(actor/critic/RM/ref 四个模型)低(只有 π_θ 与 π_ref)

DPO 的理论局限也很明确:推导假设"偏好数据与最优策略同分布”,而实际数据由某个历史策略采出。当训练策略偏离数据分布时,log(π_θ/π_ref) 的比值可能被推到极值,导致损失饱和、梯度消失,或者模型学到"降低 y_l 概率"这种退化解。家族成员:IPO 把对数 Sigmoid 换成带有界目标的平方损失、缓解确定性偏好下的过拟合;KTO 只需二元标签(好/坏)而不需成对比较,大幅降低标注成本;ORPO 把 SFT 与偏好对齐合并成一个阶段,用优势比对同时压低被拒回答的概率。

提示

记忆锚点:PPO 需要 critic、GRPO 去掉 critic、GSPO 换序列级比率、DPO 连 RL 循环一起去掉。 四者的演化方向都是"减少需要同时训练的模型数量”。


16.10 RLHF 的工程问题

奖励黑客(reward hacking):策略找到奖励模型的漏洞,拿高分但人类并不满意。典型形式包括无意义的谄媚、堆砌免责声明、把回答写成模板化的清单。根因是奖励模型是有限数据的近似,而策略的搜索空间是整个词表序列空间——在优化压力下,策略必然找到近似函数的盲区。缓解:更强的 KL 约束、奖励模型集成(多个 RM 取最小值)、对奖励做长度与格式的显式惩罚、定期用新的人类标注刷新 RM。

长度偏置(length bias):人类标注者与奖励模型都倾向于给更长的回答更高分(长回答通常包含更多正确内容)。策略于是学会"写得更长",即使内容没有增加。在 GRPO/GSPO 这类按 token 平均优势的实现里,长度还会通过归一化方式引入额外的偏置。缓解:长度惩罚、长度分桶后比较、训练时对长短回答做奖励归一化。

对齐税(alignment tax):对齐训练在提升偏好得分的同时,往往使某些通用能力(推理、多样性、代码)轻微下降。原因是对齐数据分布窄、且 KL 之外的优化压力会把参数推向特定风格。缓解:混入通用能力数据、用小 β、用 LoRA 只改少量参数、在关键能力上做回归测试。

评测方法:RLHF 的评估比 SFT 更麻烦,因为"好"本身是主观的。常见手段见下表:

方法做法局限
奖励模型打分用 r_φ 评新策略循环论证:策略就是朝它优化的,分数必然涨
人类成对偏好(Arena 式)盲测两条回答选更好的,算胜率贵、标注者偏好不一致、位置偏置
LLM-as-judge用强模型当裁判有风格与长度偏置,需要人工校准
能力基准回归在 MMLU/代码/数学上测退化与"人类偏好"不一定正相关

警告

不要用奖励模型的分数上升来证明对齐成功。r_φ 是训练目标本身,它上升是必然的(和训练 loss 下降一样),只能说明优化在起作用,不能说明模型变好了。必须用独立的指标(人类胜率、能力基准)来判定。


16.11 评测体系与训练终止判断

预训练与后训练关心不同的问题,因此指标也不同。

阶段主指标代表基准指标在测什么主要局限
预训练困惑度 PPL、验证 loss语料验证集对语料的建模能力与下游能力不同步;受分词器影响
预训练(下游)零样本准确率HellaSwag、ARC、MMLU、代码补全常识推理、科学问答、知识广度、代码单项基准可被数据污染;零样本受提示格式影响大
SFT任务准确率 / 格式符合率指令遵循评测集是否按指令输出数据集覆盖度决定天花板
偏好对齐成对胜率Arena 式盲测人类偏好贵、主观、有位置偏置

各基准的性质:HellaSwag 给一段情境和四个续写选最合理的,测常识与叙事连贯性(能力较浅,现代模型已接近饱和);ARC 是中小学科学选择题,测基础科学推理(规模小、易被记忆污染);MMLU 是 57 个学科的多选题,测知识广度,局限是主要考知识回忆而非推理、题目公开存在污染风险、对提示格式与选项顺序敏感;代码补全(HumanEval/MBPP 类) 用单元测试判定补全的代码,测可执行正确性、比选择题更客观,但题目只有百量级、单题方差大、pass@k 对采样温度敏感。

评估与终止判断的合理做法(09-09 Q10 的完整依据):① 定期在多样化下游任务上做零样本评估,看能力是否饱和,而不是只看 loss(loss 是代理指标,两者不同步);② 不要因验证 loss 短期上升就停机——大规模预训练单轮遍历海量语料,几乎不过拟合,短期抖动更可能来自数据分布切换或学习率调度;③ 不要只在训练结束时评估——没有中间评估就无法及时发现发散、数据污染、指标崩坏,而评估成本相对训练极小;④ 不要用训练 loss 单指标终止——它深受学习率调度影响,且衡量的是"拟合语料的程度"而非通用能力。

重要

预训练终止决策的正确形态是多信号综合:下游基准是否饱和 + 验证 loss 是否进入平台期 + 算力预算是否耗尽。任何单一信号(尤其是 loss 单指标)都不足以作为停机依据。


本章小结

关键结论一句话表述常见错误
自回归分解P(x) = Π_t P(x_t|x_<t),链式法则恒等,假设在网络表达以为链式法则本身是近似
训练目标最大似然 = 最小交叉熵 = 最小 NLL,同一件事把三者当成不同算法
困惑度PPL = exp(逐 token 交叉熵),可读作"平均犹豫的候选数"跨分词器直接比 PPL
loss 是代理loss 趋平不等于能力饱和;预训练几乎不过拟合用验证 loss 抖动触发早停
RLHF 三阶段SFT → RM(Bradley-Terry)→ RL(PPO 类)以为奖励的绝对值有意义
PPOclip 限制单次更新幅度,KL 把策略拴在 π_ref 附近认为 KL 只是"防止过拟合"
GRPOA_i = (R_i − μ)/(σ + EPS),组内均值代替 critic 基线以为 GRPO 不需要在线采样
GSPO序列级比率 s_i = (Π_t r_{i,t})^(1/|y_i|),序列级裁剪以为 token 级比率连乘没问题
DPO由 RLHF 闭式解反解奖励,偏好损失只需 π_θ 与 π_ref以为 DPO 等同于在线 RLHF 的效果
对齐评测不能用奖励模型分数自证成功用 r_φ 上升证明对齐有效

自测题

Q1(辨析)GRPO 相对 PPO 的核心改动是"使用组内相对奖励代替 critic"。请说明:这个改动为什么在数学上是合法的?它付出了什么代价?

答案与解析

合法性来自策略梯度的基线无关性:对任意与动作 y 无关的基线 b(x),

1
E_{y∼π_θ}[ b(x)·∇_θ log π_θ(y|x) ] = b(x)·∇_θ Σ_y π_θ(y|x) = b(x)·∇_θ 1 = 0

所以减去任何基线都不改变梯度的期望值,V(s_t) 只是"方差最小的那个选择",不是唯一合法选择。对同一 prompt 采样一组 G 个回答,条件分布相同,组内均值 μ 就是 V(x) 的一个无偏低方差估计;分母 σ 再把不同 prompt 不可比的奖励尺度归一化(回忆 16.5 节:奖励只可辨识到相差一个常数)。于是

1
A_i = (R_i − μ) / (σ + EPS)

就是合法的相对优势估计。

代价:① 每个 prompt 必须采一组(常见 G = 8~64),采样量比 PPO 更大;② 若组内奖励完全相同则 σ = 0、A_i = 0,该 prompt 白采样、对梯度无贡献;③ 打分必须稳定可复现,生成式评判的噪声会直接污染优势。

易错点:把"合法性"理解成"等价性"。组内优势与 GAE 优势不是同一个量,只是都满足"无关于动作"这个必要条件。

Q2(推导)从 RLHF 目标 max_π E_{y∼π}[r(y)] − β·KL(π‖π_ref) 出发,推出最优策略的闭式解,并说明 DPO 损失中为什么 log Z 会消失。

答案与解析

把 KL 展开并合并到同一个期望里:

1
2
E_{y∼π}[ r(y) − β·log(π(y)/π_ref(y)) ]
= −β · E_{y∼π}[ log(π(y)/π_ref(y)) − r(y)/β ]

令 π*(y) = π_ref(y)·exp(r(y)/β)/Z,Z = Σ_y π_ref(y)·exp(r(y)/β),则 π_ref(y)·exp(r(y)/β) = Z·π*(y),代入得

1
E_{y∼π}[ log(π(y)/(Z·π*(y))) ] = KL(π‖π*) + log(1/Z)

于是目标等于 −β·KL(π‖π*) + 常数,KL ≥ 0 且仅当 π = π* 取 0,故 π*(y) = π_ref(y)·exp(r(y)/β)/Z。

反解:r(y) = β·log(π*(y)/π_ref(y)) + β·log Z。代回 Bradley-Terry 损失 −log σ(r(y_w) − r(y_l)) 时,两项各自带一个 β·log Z,相减直接抵消。抵消的深层原因是:奖励只可辨识到相差一个仅依赖 x 的常数(16.5 节),而 log Z 恰好就是这样一个常数。

Q3(辨析)判断:“GRPO 是离线算法,因为它用一组采样结果的平均奖励做基线,不需要与环境交互。”

答案与解析

错误。 采样本身就是交互,“用一组采样结果"恰恰要求当前策略去生成这批数据,所以它是在线的。区分在线/离线的标准是"训练数据由谁产生”:在线(on-policy) 的数据由正在被优化的策略产生,策略更新后旧数据失效;离线(off-policy) 的数据由固定数据集或历史策略产生,可反复使用。GRPO 每轮都要用当前策略重新采样一组,属于典型在线方法;DPO 才是离线的(16.9 节)。这道判断对应 09-04 Q5 的两处陷阱:选项 A 说"不需要任何采样"、选项 D 说"完全离线训练,不需要与环境交互",都在同一个误解上。

**Q4**(推导)设 token 级重要性比率的对数方差为 `v`,序列长度为 `L`,各 token 近似独立。比较"序列级连乘比率"与"GSPO 的长度归一化比率"的对数方差,并说明序列级裁剪为什么必须配长度归一化。
答案与解析

连乘比率 R = Π_{t=1}^{L} r_t,取对数得 log R = Σ_t log r_t。独立同分布假设下

1
Var(log R) = L · v                                   (方差随长度线性增长)

L 翻倍则对数标准差乘 √2,权重波动幅度按 exp 放大——这就是长序列训练的崩溃来源。

GSPO 的比率取几何平均,即 log s = (1/L)·Σ_t log r_t,于是 Var(log s) = v / L,方差随长度下降。序列级裁剪 clip(s, 1−ε, 1+ε) 因此对任意长度保持一致的约束强度。

为什么"必须"配长度归一化:若不归一化,L 长度序列的比率对数标准差是 √(Lv),L = 2048 时仅统计涨落就可能把 s 推出 1±ε 区间,导致几乎所有样本都被裁剪、梯度信号被抹平;同时短序列几乎从不触发裁剪,长短序列受到的实际约束完全不同,训练目标与"按序列给奖励"的设定脱节。

Q5(判断/设计)某团队发现训练 loss 连续三天不再下降,决定提前结束一个为期两个月的预训练。请指出这个决策的问题,并给出一个可操作的替代方案。

答案与解析

问题有三层:① 指标选错——训练 loss 衡量"拟合语料的程度"而非通用能力,且深受学习率调度影响(衰减期内 loss 会自己往下走,平台期可能只是当前学习率下的平衡);② 现象误读——loss 趋平是预训练的正常形态,此时下游能力仍可能明显爬升(16.3 节现象一),以此为唯一依据会过早停机;③ 风险失控——只看训练 loss 无法发现发散、数据污染、指标崩坏。

替代方案是多信号监控:① 每隔固定步数在多样化下游任务(HellaSwag、ARC、MMLU、代码补全等)上跑零样本评估,观察能力是否饱和;② 同时记录固定验证集 loss,但理解其短期抖动可能来自数据分布切换与学习率调度,不据此即时停机;③ 把算力预算作为硬约束的一部分。三者综合判断,且单次评估成本相对训练极小,没有省它的理由。

Q6(辨析)为什么在 RLHF 中普遍使用 π_ref(SFT 模型)的 KL 约束,而在 SFT 阶段通常不需要显式 KL?

答案与解析

两个阶段优化的信号性质不同。

SFT 阶段的监督信号(人工写的理想回答)是逐 token 的、稠密的、有界的:模型被明确告知每个位置应该输出什么,优化目标本身就把解限制在"数据分布附近"。因此不需要额外的锚点。

RLHF 阶段只有一个标量奖励,而且这个奖励是奖励模型 r_φ 在有限数据上拟合出来的近似函数。优化压力会搜索整个序列空间,必然找到 r_φ 的盲区——在那里 r_φ 给出高分而实际质量很差(奖励黑客)。同时,无约束地远离 π_ref 会丢失基座的语言流畅性与知识(对齐税)。KL 项同时解决这两件事:把策略限制在"奖励模型可靠、基座能力保留"的邻域内。

因此 KL 的作用不是"正则化过拟合",而是限定有效搜索区域。这也解释了为什么 β 太小会崩、太大则学不动。

与真题的关联

真题考查角度对应本章小节
【09-04 选择 Q5】 GRPO 相比 PPO 的优势组内相对优势替代 critic;排除"不需采样"“离线"“需 critic”16.7
【08-05 选择 Q15】 GSPO 序列级比率(全卷唯一困难题)token 级比率在长序列下方的方差爆炸与序列级裁剪16.8
【09-09 选择 Q10】 预训练评估与终止判断loss 是代理指标、预训练几乎不过拟合、必须做中间下游评估16.3、16.11

延伸阅读

  • Ashish Vaswani 等,《Attention Is All You Need》,2017——Transformer 原始结构(见第 15 章)。
  • Jared Kaplan 等,《Scaling Laws for Neural Language Models》,2020;Jordan Hoffmann 等,《Training Compute-Optimal Large Language Models》(Chinchilla),2022。
  • Paul F. Christiano 等,《Deep Reinforcement Learning from Human Preferences》,2017;Long Ouyang 等,《Training language models to follow instructions with human feedback》(InstructGPT),2022。
  • John Schulman 等,《Proximal Policy Optimization Algorithms》,2017;《High-Dimensional Continuous Control Using Generalized Advantage Estimation》,2015。
  • Zhihong Shao 等,《DeepSeekMath》(GRPO),2024;《Group Sequence Policy Optimization》(GSPO),2025;Rafael Rafailov 等,《Direct Preference Optimization》,2023。