L08: Post-training

Week 4 · Thu Jan 29 2026 08:00:00 GMT+0800 (中国标准时间)

进度: 0/22 (0%)
下载 PDF
/ 0
100%
正在加载 PDF...

L08: Post-training

Slides

中英交替版(推荐)

L08 双语 (PDF)

英文原版

L08 EN (PDF)

中文翻译版

L08 ZH (PDF)

核心知识点

1. 语言建模 != 辅助用户

Slide 1 Slide 2 Slide 3 Slide 4 Slide 5 Slide 6 Slide 7 Slide 8 Slide 9
  • 预训练 LM 只会续写文本(completion),不会遵循指令
  • GPT-3 示例:对 “Explain X” 的回复是生成更多类似 prompt,而非实际回答
  • 核心问题:语言模型与用户意图未对齐(not aligned)

📐 预训练 LM 与助手模型的目标差异

预训练语言模型的目标:在给定任意前缀的情况下,预测最可能的下一个 token:

PLM(xt+1xt;θ)P_{LM}(x_{t+1} \mid x_{\leq t}; \theta)

这个目标对输入内容完全无偏——给定 “The sky is” 和给定 “How do I make a bomb? Answer:” 都一视同仁,只预测下一个最可能的 token。

助手模型的目标:给定用户请求 xx 和系统角色描述 rr,生成有帮助的回复:

Passistant(yx,r;θ)其中 y 最大化用户满意度P_{assistant}(y \mid x, r; \theta) \quad \text{其中 } y \text{ 最大化用户满意度}

两者的根本差异:LM 目标是描述性的(世界上的文本是什么样的),助手目标是规范性的(回复应该是什么样的)。这个差距——对齐问题(Alignment Problem)——是后训练(post-training)存在的根本原因。

📚 已收录至 拓展阅读知识库

💡 为什么这样做?

把预训练 LM 想象成一个读了大量书的人,他能流利地”续写”任何文章风格。但”续写文章”和”回答你的问题”是完全不同的事。如果你在一本书里问”今天天气怎么样?“,接下来的文字很可能是”晴朗的春日让人心情愉悦……”,而不是真正回答天气预报。预训练模型的行为正是如此——它在模仿训练数据的分布,而不是在帮你解决问题。

⚠️ 常见误区

  1. 误区:RLHF/SFT 的目的是让模型变得”更聪明”、获得更多知识 → 正确:模型的能力(推理、知识、代码)主要在预训练阶段获得,后训练的核心目的是行为对齐——让模型更有用(Helpful)、更无害(Harmless)、更诚实(Honest),即 Anthropic 的 HHH 框架。后训练可以激发预训练中隐含的能力,但无法凭空创造新能力。

  2. 误区:只要模型够大,预训练后就能自动成为好助手 → 正确:GPT-3(175B)在没有对齐的情况下,会在”Explain the moon landing” 之后生成更多关于月球登陆的讨论(而非解释),因为这是语料中最可能的续写。规模不能替代对齐。

2. Instruction Fine-tuning(指令微调)

Slide 10 Slide 11 Slide 12 Slide 13 Slide 14 Slide 15 Slide 16 Slide 17 Slide 18 Slide 19 Slide 20 Slide 21 Slide 22
  • 收集 (instruction, output) 对,跨多任务微调 LM
  • Super-NaturalInstructions:1.6K+ 任务,3M+ 样本
  • Flan-T5(Chung et al., 2022):T5 在 1.8K 任务上指令微调
    • 更大模型 = 更大的指令微调增益(T5-XXL: +26.6)
    • 模型可在未见任务上泛化
  • 数据 + 模型规模是关键
  • 新基准:MMLU(57 个知识密集型任务)、BIG-Bench(200+ 任务)

📐 SFT 目标函数

监督微调(Supervised Fine-Tuning) 与标准语言模型训练的区别仅在于损失计算的范围

JSFT(θ)=(xi,yi)DSFTt=1yilogPθ ⁣(yi(t)yi(<t),xi)J_{SFT}(\theta) = -\sum_{(x_i, y_i) \in D_{SFT}} \sum_{t=1}^{|y_i|} \log P_\theta\!\left(y_i^{(t)} \mid y_i^{(<t)}, x_i\right)

  • (xi,yi)(x_i, y_i):(指令 / 用户请求,示范回复)对
  • 只在回复 yiy_i 上计算损失,指令 xix_i 的 token 损失被 mask 掉(不参与梯度更新)
  • 这与标准 CLM 预训练的区别:SFT 的模型需要学的是”给定指令,生成好的回复”,而不是”给定任意前缀,续写任意文本”

数学上,SFT 等价于在条件分布 P(yx)P(y \mid x) 上做最大似然估计(MLE),以人类示范回复作为正样本。

📚 已收录至 拓展阅读知识库

📐 CLM vs SFT:Token 级损失的精确对比

设完整序列 S=[x1,,xm,y1,,yn]S = [x_1, \ldots, x_m, y_1, \ldots, y_n],其中 x1:mx_{1:m} 是指令 token,y1:ny_{1:n} 是回复 token。

CLM(因果语言建模,预训练目标)——对所有 T=m+nT = m + n 个位置计算损失:

JCLM(θ)=1Tt=1TlogPθ(sts<t)J_{CLM}(\theta) = -\frac{1}{T}\sum_{t=1}^{T} \log P_\theta(s_t \mid s_{<t})

每个 token 都参与梯度更新,模型学的是”这段文字整体的续写概率”。

SFT(监督微调,指令微调使用)——引入 loss mask mt{0,1}m_t \in \{0, 1\},只在回复部分计算损失:

JSFT(θ)=1tmtt=1TmtlogPθ(sts<t)J_{SFT}(\theta) = -\frac{1}{\sum_t m_t}\sum_{t=1}^{T} m_t \cdot \log P_\theta(s_t \mid s_{<t})

其中

mt={0tm(指令 token,mask 掉)1t>m(回复 token,计算损失)m_t = \begin{cases} 0 & t \leq m \quad (\text{指令 token,mask 掉}) \\ 1 & t > m \quad (\text{回复 token,计算损失}) \end{cases}

两者的梯度差异

JSFTθ=1nt=m+1m+nlogPθ(sts<t)θ\frac{\partial J_{SFT}}{\partial \theta} = -\frac{1}{n} \sum_{t=m+1}^{m+n} \frac{\partial \log P_\theta(s_t \mid s_{<t})}{\partial \theta}

注意:指令 token x1:mx_{1:m} 仍参与前向传播(在 attention context 中可见),只是不产生梯度。这与把指令截断掉完全不同——模型需要”看到”指令才能生成正确回复,只是不需要”学会生成”指令。

三者等价关系:若指令长度 m0m \to 0(纯文本续写),SFT 退化为 CLM;若 mTm \to T(全部 mask),则 JSFT=0J_{SFT} = 0,无梯度信号。

📚 已收录至 拓展阅读知识库

🔢 Token 级损失计算:一个完整的手算示例

设定:词表 V={[Q],翻译:,,[A],cat,.,[EOS],}V = \{\texttt{[Q]}, \texttt{翻译:}, \texttt{猫}, \texttt{[A]}, \texttt{cat}, \texttt{.}, \texttt{[EOS]}, \ldots\}

指令 x=[[Q],翻译:,]x = [\texttt{[Q]}, \texttt{翻译:}, \texttt{猫}](3 个 token),回复 y=[[A],cat,.,[EOS]]y = [\texttt{[A]}, \texttt{cat}, \texttt{.}, \texttt{[EOS]}](4 个 token)

完整序列 S=[[Q],翻译:,指令 m=3,[A],cat,.,[EOS]回复 n=4]S = [\underbrace{\texttt{[Q]}, \texttt{翻译:}, \texttt{猫}}_{\text{指令 }m=3}, \underbrace{\texttt{[A]}, \texttt{cat}, \texttt{.}, \texttt{[EOS]}}_{\text{回复 }n=4}],共 T=7T=7 个 token。

位置 ttToken sts_t条件 Pθ(sts<t)P_\theta(s_t \mid s_{<t})CLM mtm_tSFT mtm_t损失项 t\ell_t
1[Q]P([Q])P(\texttt{[Q]})1\ell_1
2翻译:P(翻译:[Q])P(\texttt{翻译:} \mid \texttt{[Q]})2\ell_2
3P([Q]翻译:)P(\texttt{猫} \mid \texttt{[Q]}\texttt{翻译:})3\ell_3
4[A]P([A]x1:3)P(\texttt{[A]} \mid x_{1:3})4\ell_4
5catP(catx1:3,[A])P(\texttt{cat} \mid x_{1:3}, \texttt{[A]})5\ell_5
6.P(.x1:3,[A]cat)P(\texttt{.} \mid x_{1:3}, \texttt{[A]}\texttt{cat})6\ell_6
7[EOS]P([EOS]x1:3,[A]cat.)P(\texttt{[EOS]} \mid x_{1:3}, \texttt{[A]}\texttt{cat}\texttt{.})7\ell_7

JCLM=17(1+2+3+4+5+6+7)J_{CLM} = -\frac{1}{7}(\ell_1 + \ell_2 + \ell_3 + \ell_4 + \ell_5 + \ell_6 + \ell_7)

JSFT=14(4+5+6+7)J_{SFT} = -\frac{1}{4}(\ell_4 + \ell_5 + \ell_6 + \ell_7)

假设模型对各 token 的概率估计(训练初期典型值):

Token估计概率 PθP_\thetalogP-\log P
[Q]0.122.12
翻译:0.181.71
0.082.53
[A]0.450.80
cat0.620.48
.0.810.21
[EOS]0.730.31

则:JCLM=2.12+1.71+2.53+0.80+0.48+0.21+0.317=8.1671.17J_{CLM} = \frac{2.12+1.71+2.53+0.80+0.48+0.21+0.31}{7} = \frac{8.16}{7} \approx 1.17

JSFT=0.80+0.48+0.21+0.314=1.804=0.45J_{SFT} = \frac{0.80+0.48+0.21+0.31}{4} = \frac{1.80}{4} = 0.45

观察

  1. SFT 损失数值更小——不是因为模型更好,而是指令 token(概率低)被排除在外。
  2. 梯度信号更纯净:CLM 的梯度有 3/743%3/7 \approx 43\% 来自”如何生成指令”,与训练目标无关;SFT 的梯度 100% 来自”如何生成正确回复”。
  3. 当指令很长(mnm \gg n,如 few-shot prompt)时,CLM 的信噪比更差,SFT 的优势更显著。

💡 为什么 Instruction Fine-tuning 不能直接用 CLM?

把 LM 想象成一个填空机器:CLM 训练它在任意位置预测下一个 token。如果用 CLM 做指令微调(对指令+回复全序列计损失),会同时教它:

  • 怎么”续写”一段指令(“将…翻译成…→”)
  • 怎么生成一个回答(“cat.”)

第一件事完全没用——我们不需要模型自己生成指令,我们需要它响应指令。更糟的是,训练数据里的指令往往比回复长得多(few-shot 场景尤其如此),CLM 会把大量梯度浪费在”学指令的写法”上。

反例:T5 的预训练用的是 span corruption(类似 CLM 的自监督),但指令微调(Flan-T5)时也会用 response masking——这不是偶然,而是实验验证的最优策略。

更深的视角:SFT 训练的是条件分布 P(yx;θ)P(y \mid x; \theta),CLM 训练的是联合分布 P(x,y;θ)=P(x;θ)P(yx;θ)P(x, y; \theta) = P(x; \theta) \cdot P(y \mid x; \theta)。后者包含了 P(x;θ)P(x; \theta)(指令的”自然度”),但指令的自然度与模型的有用性完全无关。

🔢 InstructGPT 数据集规模对比

数据类型规模用途
SFT 示范数据~13K 指令训练 SFT 模型
RM 偏好数据~33K 偏好对训练奖励模型
PPO 提示~31K 提示PPO 在线优化
GPT-3 预训练数据~300B tokens预训练(对比)

关键洞察:SFT 数据量(13K)比预训练数据(3000 亿 token)小约 2300 万倍,但效果变化天翻地覆。这说明对齐是一个数据效率极高的过程——模型的能力已在预训练中存在,SFT 只是”解锁”正确的行为模式。

LIMA 论文(Zhou et al., 2023)进一步证明:1000 个高质量 SFT 样本与 52K 个 Alpaca 样本效果相当甚至更好,彻底颠覆了”SFT 需要大量数据”的认知。

⚠️ 常见误区

  1. 误区:SFT 数据越多越好 → 正确:数据质量远比数量重要。低质量示范(如 GPT-3 自动生成的标注)可能引入坏的行为模式。人工精心标注的少量数据(LIMA 的 1000 条)往往优于自动生成的大量数据(Alpaca 的 52K 条)。

  2. 误区:在指令上也计算损失能帮助模型更好地理解指令 → 正确:在指令上计算损失会让模型同时学”如何生成指令”,这不是目标,且会稀释回复生成的训练信号。正确做法是对指令部分的 token 用 loss mask 屏蔽。

  3. 误区:Instruction FT、SFT、CLM 是同一件事的不同叫法 → 正确:三者是不同层次的概念(见下方知识关联块)。

🔗 Instruction FT / SFT / CLM 的层次关系

这三个术语经常混用,但含义层次不同:

概念层次含义
CLM(Causal Language Modeling)目标函数对序列所有 token 做 next-token prediction,J=tlogP(xtx<t)J = -\sum_t \log P(x_t \mid x_{<t}),用于预训练,无监督
SFT(Supervised Fine-Tuning)训练方法用人工标注的 (x,y)(x, y) 对做监督学习,只对 yy 计算 CLM 风格的 MLE 损失,有监督
Instruction Fine-Tuning训练策略/范式跨任务指令数据上做 SFT,目标是泛化的指令遵循能力;SFT 是它的实现手段

包含关系:Instruction FT ⊃ SFT(实现方法)⊃ 类 CLM 的 MLE 目标(但限定 token 范围)

与 CLM 的本质区别

  • CLM 是 self-supervised(数据无需标注,用文本自身做监督信号)
  • SFT 是 supervised(必须有人工标注的回复 yy,或教师模型生成的高质量回复)
  • Instruction FT 还要求数据跨任务多样性,单一任务的 SFT 不算 Instruction FT

常见的混淆场景

  • “用 CLM 做 SFT” = 对全序列(指令+回复)计算损失,是一种实现变体,一般效果不如 response-only SFT
  • “Flan-T5” = 在 T5 上做 Instruction FT(用的是 encoder-decoder,不是 CLM 架构,但微调目标类似 SFT)
  • “Chat fine-tuning” = Instruction FT 的对话版本,数据格式变为多轮对话,仍用 SFT 方法

与 L07 关联:L07 预训练 中的 CLM 目标 JCLMJ_{CLM} 正是 SFT 的前驱——SFT 是在 CLM 预训练好的模型上,用条件化的方式继续优化 P(yx)P(y \mid x)

3. RLHF(从人类反馈中强化学习)

Slide 23 Slide 24 Slide 25 Slide 26 Slide 27 Slide 28 Slide 29 Slide 30 Slide 31 Slide 32 Slide 33 Slide 34 Slide 35 Slide 36 Slide 37
  • 三阶段流水线:SFT -> Reward Model 训练 -> PPO 优化
  • PPO 的复杂性:需要 Policy Model + Value Model + Reward Model + Reference Model
  • KL 散度约束防止偏离预训练分布太远
  • 超参数敏感、在线采样慢、训练不稳定

📐 RLHF 完整流程的数学推导

Step 1:训练奖励模型(Reward Model)

收集人类偏好数据:对同一输入 xx,标注者标记哪个回复更好,形成偏好对 (yw,yl)(y_w, y_l)(winner, loser)。

基于 Bradley-Terry 偏好模型(人类选择 ywy_w 优于 yly_l 的概率):

P(ywylx)=σ(r(x,yw)r(x,yl))P(y_w \succ y_l \mid x) = \sigma(r(x, y_w) - r(x, y_l))

训练 RM 最大化偏好数据的对数似然(最小化负对数似然):

JRM=E(x,yw,yl)Dpref[logσ ⁣(rϕ(x,yw)rϕ(x,yl))]J_{RM} = -\mathbb{E}_{(x, y_w, y_l) \sim D_{pref}} \left[\log \sigma\!\left(r_\phi(x, y_w) - r_\phi(x, y_l)\right)\right]

Step 2:PPO 微调策略

最大化奖励,同时通过 KL 惩罚约束策略不偏离参考模型过远:

JPPO(θ)=ExD,yπθ(x) ⁣[rϕ(x,y)βlogπθ(yx)πref(yx)]J_{PPO}(\theta) = \mathbb{E}_{x \sim D,\, y \sim \pi_\theta(\cdot|x)}\!\left[r_\phi(x, y) - \beta \cdot \log\frac{\pi_\theta(y \mid x)}{\pi_{ref}(y \mid x)}\right]

其中 β[0.01,0.1]\beta \in [0.01, 0.1] 是 KL 惩罚系数,πref\pi_{ref} 是 SFT 模型(固定不更新)。

完整训练所需的模型数量:Policy(更新) + Reference(固定) + Reward(固定) + Value(更新)= 4 个模型同时在显存中,这是 PPO 内存开销大的根本原因。

📚 已收录至 拓展阅读知识库

🔢 Reward Hacking 与 KL 约束的数值示例

场景:奖励模型过度偏好”长且流畅的回复”(常见的 RM 偏差)。

未加 KL 约束时β=0\beta = 0):

  • 模型学会无限重复、填充废话以增加长度
  • 某回复:奖励 r=8.5r = 8.5,但实际对用户无用(reward hacking)

加 KL 约束后β=0.1\beta = 0.1):

  • 某冗长回复:r(x,y)=8.5r(x,y) = 8.5KL=35.0\text{KL} = 35.0

  • 有效奖励 = 8.50.1×35.0=5.08.5 - 0.1 \times 35.0 = 5.0

  • 某精简回复:r(x,y)=7.0r(x,y) = 7.0KL=3.0\text{KL} = 3.0

  • 有效奖励 = 7.00.1×3.0=6.77.0 - 0.1 \times 3.0 = 6.7 ← 更高!

结论:KL 惩罚使模型倾向于用更接近 SFT 模型行为的方式获得奖励,抑制了极端的 reward hacking。

⚠️ 常见误区

  1. 误区:RLHF 是”在人类偏好上优化” → 正确:RLHF 是”在奖励模型上优化”。奖励模型是人类偏好的近似,本身有误差。Goodhart’s Law:“当一个度量指标成为优化目标时,它就不再是好的度量指标”——模型会找到奖励模型的漏洞(如倾向于给更长、语气更确定的回复高分),而不是真正提高有用性。

  2. 误区:KL 约束 β\beta 越小越好(更自由地优化奖励) → 正确β\beta 太小会导致严重的 reward hacking 和模型退化;β\beta 太大则 RLHF 效果微弱(模型几乎不更新)。β\beta 的调优是 RLHF 最重要的超参数之一,通常需要实验搜索。

📐 PPO 算法核心机制:Clip 目标与 LLM Token 级实现

为什么朴素 Policy Gradient(REINFORCE)不够用?

REINFORCE 梯度:θJ=Eyπθ ⁣[θlogπθ(yx)A(x,y)]\nabla_\theta J = \mathbb{E}_{y \sim \pi_\theta}\!\left[\nabla_\theta \log \pi_\theta(y|x) \cdot A(x,y)\right]

当一步更新过大时,πθ\pi_\theta 与旧策略 πold\pi_{old} 偏离严重,重要性权重 πθπold\frac{\pi_\theta}{\pi_{old}} 方差爆炸,训练崩溃。

PPO 的解法:Clip 重要性权重

定义 token tt 的重要性比:

rt(θ)=πθ(ytx,y<t)πold(ytx,y<t)r_t(\theta) = \frac{\pi_\theta(y_t \mid x, y_{<t})}{\pi_{old}(y_t \mid x, y_{<t})}

PPO Clip 损失(ϵ=0.2\epsilon = 0.2 为标准值):

LCLIP(θ)=Et ⁣[min ⁣(rt(θ)At,    clip(rt(θ),1ϵ,1+ϵ)At)]L^{CLIP}(\theta) = \mathbb{E}_t\!\left[\min\!\left(r_t(\theta)\cdot A_t,\;\; \text{clip}(r_t(\theta),\, 1-\epsilon,\, 1+\epsilon)\cdot A_t\right)\right]

Clip 行为直觉

情形rtr_t 越界时clip 作用
At>0A_t > 0(好动作),rt>1+ϵr_t > 1+\epsilon已过度增加截断,禁止继续提高好动作概率
At<0A_t < 0(坏动作),rt<1ϵr_t < 1-\epsilon已过度降低截断,禁止继续打压坏动作概率

本质:min 函数确保目标函数是悲观下界——只允许对策略有利的情况”按实际”计,对策略不利的情况”按被截断的保守值”计。

LLM 后训练中的 Token 级 MDP 映射

RL 概念LLM 中的对应
状态 sts_t已生成序列 (x,y1,,yt1)(x, y_1, \ldots, y_{t-1})
动作 ata_t下一个 token yty_t($
终末奖励RM 对完整回复评分 rϕ(x,y1:T)r_\phi(x, y_{1:T})
中间惩罚Per-token KL:βlogπθ(yt)πref(yt)-\beta \log\frac{\pi_\theta(y_t)}{\pi_{ref}(y_t)}

完整的 token 级奖励信号:

r~t={rϕ(x,y1:T)βlogπθ(yTsT)πref(yTsT)t=Tβlogπθ(ytst)πref(ytst)t<T\tilde{r}_t = \begin{cases} r_\phi(x, y_{1:T}) - \beta \log\dfrac{\pi_\theta(y_T|s_T)}{\pi_{ref}(y_T|s_T)} & t = T \\ -\beta \log\dfrac{\pi_\theta(y_t|s_t)}{\pi_{ref}(y_t|s_t)} & t < T \end{cases}

优势函数用 GAE(广义优势估计)从 Value Network 计算:AtGAE=k0(γλ)kδt+kA_t^{GAE} = \sum_{k \geq 0}(\gamma\lambda)^k \delta_{t+k},其中 δt=r~t+γVϕ(st+1)Vϕ(st)\delta_t = \tilde{r}_t + \gamma V_\phi(s_{t+1}) - V_\phi(s_t)

RLHF-PPO 的 4 模型架构

模型是否更新梯度作用
Policy πθ\pi_\theta生成回复(正在对齐的模型)
Value Network VϕV_\phi估计每 token 期望回报(Critic)
Reward Model rϕr_\phi对完整序列打分
Reference Policy πref\pi_{ref}KL 惩罚基准(SFT 模型)

Value Network 与 Policy 等大且需要梯度,这是 PPO 显存开销是 DPO 两倍的根本原因。GRPO 的核心创新就是消除它。

📚 已收录至 拓展阅读知识库

💡 RLHF / PPO / DPO / GRPO 全景层次——一次讲清

RLHF(框架): 用人类偏好数据训练 RM,再用 RL 最大化 RM 奖励

├── PPO(RLHF 的标准 RL 实现)
│   需要:Policy + Value + RM + Reference(4 模型)
│   在线:每步采样新回复 → 评分 → 更新
│   优势:能探索未见过的策略分布
│   劣势:4 倍显存、超参敏感、训练不稳定

├── GRPO(PPO 的轻量变体,去掉 Value Network)
│   需要:Policy + RM + Reference(3 模型)
│   用组内统计代替 Critic,适合稀疏自动评分任务
│   典型用途:DeepSeek-R1 数学/代码推理训练

└── DPO(RLHF 目标的数学重参数化,绕过 RL)
    需要:Policy + Reference(2 模型)
    离线:直接在静态偏好数据集上 MLE
    优势:简单稳定,无需 RM 训练
    代价:无法在线探索,遇到分布外样本容易失效

三条关键认知

  • RLHF ≠ PPO:PPO 是其中一种 RL 算法选择,可替换为 REINFORCE、A2C、GRPO
  • DPO 是 RLHF 的数学等价离线版,有不同 tradeoff,而非”升级版”
  • 三者共享底层假设:Bradley-Terry 偏好模型 P(ywylx)=σ(rwrl)P(y_w \succ y_l \mid x) = \sigma(r_w - r_l)

🔗 知识关联

  • REINFORCE vs PPO 的稳定性差距:PPO 的 Clip 约束等价于信任域优化(Trust Region),TRPO 的近似实现
  • DPO 如何从此处 PPO 目标推导:见下方 Section 5 完整推导
  • GRPO 如何消除 Value Network:见 Section 6
  • PPO 的 4 模型架构 对 GPU 集群的实际影响(需要 4 路模型并行)已收录至 RLHF 拓展阅读

4. InstructGPT 和 ChatGPT

Slide 38 Slide 39 Slide 40 Slide 41 Slide 42 Slide 43 Slide 44 Slide 45 Slide 46 Slide 47
  • InstructGPT(Ouyang et al., 2022):首次大规模应用 RLHF
  • 从补全模型到对话助手的关键转变

📐 InstructGPT 三阶段训练流水线

阶段 1 — SFT:在人工示范数据上监督微调,得到 πSFT\pi_{SFT}

θSFT=argmaxθ(x,y)DSFTlogPθ(yx)\theta_{SFT} = \arg\max_\theta \sum_{(x,y)\in D_{SFT}} \log P_\theta(y \mid x)

阶段 2 — RM 训练:学习人类偏好排序,得到奖励函数 rϕ(x,y)r_\phi(x, y)

ϕ=argminϕE(x,yw,yl)[logσ(rϕ(x,yw)rϕ(x,yl))]\phi^* = \arg\min_\phi -\mathbb{E}_{(x,y_w,y_l)}\left[\log\sigma(r_\phi(x,y_w) - r_\phi(x,y_l))\right]

阶段 3 — PPO:在 RM 的奖励下优化策略,约束不偏离 πSFT\pi_{SFT}

θ=argmaxθEyπθ[rϕ(x,y)βKL(πθπSFT)]\theta^* = \arg\max_\theta \mathbb{E}_{y \sim \pi_\theta}\left[r_\phi(x,y) - \beta \cdot KL(\pi_\theta \| \pi_{SFT})\right]

关键结论(InstructGPT 论文原文数字)

在人类评测中,1.3B 参数 InstructGPT 优于 175B 参数 GPT-3(85% 的评测者偏好 InstructGPT 输出)。参数量相差 134 倍,但对齐使小模型胜出——说明行为对齐的收益远超单纯的模型规模

📚 已收录至 拓展阅读知识库

🔢 InstructGPT 的人类评测结果

对比组偏好 InstructGPT 的比例
InstructGPT-1.3B vs GPT-3-175B85%
InstructGPT-175B vs GPT-3-175B~85%
InstructGPT-175B vs RLHF without SFT71%

同等参数量的 InstructGPT-175B 与 GPT-3-175B 对比,仍有 85% 偏好率,说明 RLHF 而非模型规模是主要贡献。

⚠️ 常见误区

  1. 误区:ChatGPT = InstructGPT → 正确:ChatGPT 在 InstructGPT 框架基础上加入了多轮对话历史建模,将整个对话 history 作为 context 输入。此外,ChatGPT 针对安全性有额外的 RLHF 阶段。OpenAI 从未公开 ChatGPT 的完整技术细节。

  2. 误区:RLHF 之后模型完全”听话”,不会产生有害输出 → 正确:RLHF 显著降低了有害输出,但无法完全消除——通过 jailbreak(越狱 prompt)、角色扮演等方法仍可绕过安全训练。这是对抗式 AI 安全研究的核心问题。

5. DPO(Direct Preference Optimization)

Slide 48 Slide 49 Slide 50 Slide 51 Slide 52 Slide 53 Slide 54 Slide 55 Slide 56 Slide 57
  • 核心洞察:RLHF 目标的闭式解可将 reward model 用 policy 的对数概率比表示
  • RMθ(x,y^)=βlogpθRL(y^x)pPT(y^x)+βlogZ(x)RM_\theta(x, \hat{y}) = \beta \log \frac{p_\theta^{RL}(\hat{y}|x)}{p^{PT}(\hat{y}|x)} + \beta \log Z(x)
  • DPO 损失:JDPO(θ)=E[logσ(RMθ(x,yw)RMθ(x,yl))]J_{DPO}(\theta) = -\mathbb{E}[\log \sigma(RM_\theta(x, y_w) - RM_\theta(x, y_l))]
  • Z(x) 在损失中消去(因为只测量 reward 差异)
  • 用简单的加权 MLE 替代复杂的 RL
  • 开源 LLM 几乎都用 DPO(HuggingFace 排行榜验证)
  • 变体:KTO、IPO 等

📐 DPO 从 RLHF 目标的完整推导

Step 1:RLHF 目标的最优解

RLHF 最大化(对每个输入 xx,对所有可能输出 yy 求最优):

maxπθEyπθ[r(x,y)]βKL[πθ(yx)πref(yx)]\max_{\pi_\theta} \mathbb{E}_{y \sim \pi_\theta}\left[r(x,y)\right] - \beta \cdot KL\left[\pi_\theta(y|x) \| \pi_{ref}(y|x)\right]

对此目标关于 πθ\pi_\theta 取变分,令导数为零,得闭式最优策略

π(yx)=1Z(x)πref(yx)exp ⁣(r(x,y)β)\pi^*(y|x) = \frac{1}{Z(x)}\, \pi_{ref}(y|x)\exp\!\left(\frac{r(x,y)}{\beta}\right)

其中 Z(x)=yπref(yx)exp ⁣(r(x,y)β)Z(x) = \sum_y \pi_{ref}(y|x)\exp\!\left(\frac{r(x,y)}{\beta}\right) 是归一化常数(配分函数)。

Step 2:反解奖励函数

由上式取对数,用 π\pi^* 表示 rr

r(x,y)=βlogπ(yx)πref(yx)+βlogZ(x)r(x,y) = \beta \log\frac{\pi^*(y|x)}{\pi_{ref}(y|x)} + \beta \log Z(x)

Step 3:代入 Bradley-Terry 偏好模型

P(ywylx)=σ(r(x,yw)r(x,yl))P(y_w \succ y_l \mid x) = \sigma(r(x,y_w) - r(x,y_l))

代入 rr 的表达式,βlogZ(x)\beta \log Z(x) 在差值中完全抵消

P(ywylx)=σ ⁣(βlogπ(ywx)πref(ywx)βlogπ(ylx)πref(ylx))P(y_w \succ y_l \mid x) = \sigma\!\left(\beta \log\frac{\pi^*(y_w|x)}{\pi_{ref}(y_w|x)} - \beta \log\frac{\pi^*(y_l|x)}{\pi_{ref}(y_l|x)}\right)

Step 4:DPO 损失(用 πθ\pi_\theta 近似 π\pi^*,最大化偏好对数似然):

JDPO(θ)=E(x,yw,yl) ⁣[logσ ⁣(βlogπθ(ywx)πref(ywx)βlogπθ(ylx)πref(ylx))]J_{DPO}(\theta) = -\mathbb{E}_{(x,y_w,y_l)}\!\left[\log\sigma\!\left(\beta\log\frac{\pi_\theta(y_w|x)}{\pi_{ref}(y_w|x)} - \beta\log\frac{\pi_\theta(y_l|x)}{\pi_{ref}(y_l|x)}\right)\right]

结论:DPO 完全绕过了奖励模型的训练,直接用偏好数据优化策略,且数学上等价于 RLHF 的最优解。

📚 已收录至 拓展阅读知识库

🔢 DPO vs RLHF 工程复杂度对比

维度RLHF (PPO)DPO
需要的模型数量4(Policy + Value + RM + Ref)2(Policy + Ref)
是否需要在线采样是(每步采样新回复)否(离线偏好数据)
训练稳定性较差(PPO 对超参敏感)较好(标准 MLE 梯度)
GPU 显存需求极高(4 模型同时加载)适中(2 模型)
是否需要 RM 单独训练

典型实践:Llama 2/3、Mistral、Qwen 等主流开源模型的偏好对齐阶段均采用 DPO 或其变体(SimPO、KTO)。

⚠️ 常见误区

  1. 误区:DPO 总是优于 RLHF → 正确:DPO 是离线方法——它只能从固定的偏好数据集中学习,而 PPO 可以通过在线与奖励模型交互动态生成新训练数据(探索未见过的输出)。对于分布外的困难指令,DPO 可能不如 PPO 的在线 RL 有效。近期 Online-DPO 和 DAPO 等方法试图结合两者优势。

  2. 误区:DPO 推导中 Z(x)Z(x) 消去,说明归一化常数无关紧要 → 正确Z(x)Z(x) 消去是数学推导的偶然便利,它实际上仍然存在于最优策略 π\pi^* 中。DPO 的真正假设是:偏好数据是由”接近真正最优策略”的分布生成的,当数据分布与当前策略差距大时(distribution shift),DPO 会失效。

💡 DPO 在做什么?隐式奖励与梯度方向

DPO 损失看起来像 binary cross-entropy,但隐藏着一个精妙的结构。将损失改写:

JDPO(θ)=E ⁣[logσ ⁣(βlogπθ(ywx)πref(ywx)r^θ(x,yw):隐式奖励βlogπθ(ylx)πref(ylx)r^θ(x,yl):隐式奖励)]J_{DPO}(\theta) = -\mathbb{E}\!\left[\log \sigma\!\left(\underbrace{\beta \log\frac{\pi_\theta(y_w|x)}{\pi_{ref}(y_w|x)}}_{\hat{r}_\theta(x,y_w)\text{:隐式奖励}} - \underbrace{\beta \log\frac{\pi_\theta(y_l|x)}{\pi_{ref}(y_l|x)}}_{\hat{r}_\theta(x,y_l)\text{:隐式奖励}}\right)\right]

隐式奖励 r^θ(x,y)=βlogπθ(yx)πref(yx)\hat{r}_\theta(x,y) = \beta \log\frac{\pi_\theta(y|x)}{\pi_{ref}(y|x)} 的含义:

  • r^>0\hat{r} > 0:策略比参考模型更倾向于生成 yy——“认为 yy 比平均水平好”
  • r^<0\hat{r} < 0:策略比参考模型更不倾向于生成 yy——“认为 yy 比平均水平差”
  • DPO 的策略自身就是奖励模型——无需单独训练 RM!

梯度自适应权重

πθ(ywx)\pi_\theta(y_w|x) 求梯度,权重为 σ(r^lr^w)\sigma(\hat{r}_l - \hat{r}_w)

JDPOσ(r^lr^w)[logπθ(ywx)logπθ(ylx)]\nabla J_{DPO} \propto -\sigma(\hat{r}_l - \hat{r}_w) \cdot \left[\nabla \log \pi_\theta(y_w|x) - \nabla \log \pi_\theta(y_l|x)\right]

  • 当模型还认为坏回复更好(r^l>r^w\hat{r}_l > \hat{r}_w):权重大,更新猛
  • 当模型已学好(r^wr^l\hat{r}_w \gg \hat{r}_l):σ\sigma 趋近 0,更新自动减弱
  • DPO 内置自适应学习速率——已正确分类的样本自动获得小权重

🔢 DPO 单步训练完整数值演示

设定β=0.5\beta = 0.5,偏好对 (yw,yl)(y_w, y_l)

初始状态(训练前,模型尚未对齐):

输出πref(yx)\pi_{ref}(y\|x)πθ(yx)\pi_\theta(y\|x)隐式奖励 r^=0.5logπθπref\hat{r} = 0.5\log\frac{\pi_\theta}{\pi_{ref}}
ywy_w(好回复)0.300.250.5×log(0.833)=0.0920.5 \times \log(0.833) = -0.092
yly_l(坏回复)0.200.300.5×log(1.500)=+0.2030.5 \times \log(1.500) = +0.203

当前 r^(yl)>r^(yw)\hat{r}(y_l) > \hat{r}(y_w):模型错误地认为坏回复更好!

DPO 损失

J=logσ(r^wr^l)=logσ(0.0920.203)=logσ(0.295)=log(0.427)=0.851J = -\log\sigma(\hat{r}_w - \hat{r}_l) = -\log\sigma(-0.092 - 0.203) = -\log\sigma(-0.295) = -\log(0.427) = 0.851

梯度权重(惩罚力度):σ(r^lr^w)=σ(0.295)=0.573\sigma(\hat{r}_l - \hat{r}_w) = \sigma(0.295) = 0.573(较大,说明模型对这对样本判断严重错误)

训练后期(收敛时):

输出πθ(yx)\pi_\theta(y\|x)隐式奖励
ywy_w(好回复)0.42+0.167+0.167
yly_l(坏回复)0.140.178-0.178

r^(yw)r^(yl)\hat{r}(y_w) \gg \hat{r}(y_l)σ(0.345)0.41\sigma(-0.345) \approx 0.41,梯度权重下降,更新自动减速——收敛。

一句话总结:DPO 同时在两个方向驱动策略:拉高好回复的相对概率压低坏回复的相对概率,两者权重共享同一个 sigmoid 系数(自适应平衡)。

6. GRPO(Group Relative Policy Optimization)

Slide 58
Slide 58
  • 来自 DeepSeekMath(Shao et al., 2024)
  • 相比 PPO 移除了 Value Model,用 group computation 估计 advantage
  • 更简单的训练架构

📐 GRPO 目标函数推导

核心思想:PPO 需要一个单独的 Value Network(价值网络)来估计优势函数(Advantage)A(x,y)A(x,y)——这个网络和策略网络一样大,代价极高。GRPO 用组内相对奖励代替价值网络。

Step 1:组内采样

对同一输入 xx,从当前策略采样 GG 个输出 {y1,,yG}\{y_1, \ldots, y_G\},计算各自奖励 {r1,,rG}\{r_1, \ldots, r_G\}

Step 2:优势估计(组内归一化)

Ai=riμrσr,μr=1Gj=1Grj,σr=1Gj=1G(rjμr)2A_i = \frac{r_i - \mu_r}{\sigma_r}, \quad \mu_r = \frac{1}{G}\sum_{j=1}^G r_j, \quad \sigma_r = \sqrt{\frac{1}{G}\sum_{j=1}^G (r_j - \mu_r)^2}

Ai>0A_i > 0 表示第 ii 个输出优于组内平均,Ai<0A_i < 0 则相反。

Step 3:GRPO 目标(结合 PPO clip 技巧)

JGRPO(θ)=Ex,{yi} ⁣[1Gi=1Gmin ⁣(πθ(yix)πold(yix)Ai,  clip ⁣(πθ(yix)πold(yix),1 ⁣ ⁣ϵ,1 ⁣+ ⁣ϵ)Ai)βDKL(πθπref)]J_{GRPO}(\theta) = \mathbb{E}_{x,\{y_i\}}\!\left[\frac{1}{G}\sum_{i=1}^G \min\!\left(\frac{\pi_\theta(y_i|x)}{\pi_{old}(y_i|x)} A_i,\; \text{clip}\!\left(\frac{\pi_\theta(y_i|x)}{\pi_{old}(y_i|x)}, 1\!-\!\epsilon, 1\!+\!\epsilon\right) A_i\right) - \beta\, D_{KL}(\pi_\theta \| \pi_{ref})\right]

与 PPO 的对比:PPO 用 Ai=riVϕ(x)A_i = r_i - V_\phi(x)VϕV_\phi 是价值网络),而 GRPO 用组内统计替代,消除了对价值网络的需求,节省了约 50% 的训练显存。

📚 已收录至 拓展阅读知识库

🔢 DeepSeek-R1 使用 GRPO 训练推理模型

任务:数学题求解(可自动验证正确性)

参数设置G=16G=16(每题采样 16 个解),ϵ=0.2\epsilon=0.2β=0.04\beta=0.04

一次训练步示例(某道数学题):

解法编号是否正确格式分总奖励 rir_i
y1y_1正确 ✓+0.11.1
y2y_2错误 ✗+0.10.1
y3y_3正确 ✓01.0
…(16个)

μr=0.35\mu_r = 0.35σr=0.42\sigma_r = 0.42

  • A1=(1.10.35)/0.42=1.79A_1 = (1.1 - 0.35)/0.42 = 1.79(上调概率)
  • A2=(0.10.35)/0.42=0.60A_2 = (0.1 - 0.35)/0.42 = -0.60(下调概率)

训练信号:增加 y1y_1 类解法的概率,降低 y2y_2 类解法的概率——模型学会”比平均水平更好的解题思路”。

⚠️ 常见误区

  1. 误区:GRPO 可以用于任何 NLP 任务 → 正确:GRPO 依赖可自动评分的奖励函数(如数学答案对错、代码是否通过测试)。对于需要人类判断的开放性任务(如写作风格、创意),无法在每步对 G=16G=16 个输出进行快速自动评分,实践中通常用预训练的奖励模型代替,但这又带回了奖励模型偏差的问题。

  2. 误区:组内采样数 GG 越大越好 → 正确GG 增大确实能让优势估计更准确,但计算成本是 O(G)O(G) 的。当 GG 过大时,正确/错误样本比例可能过于固定(高难题全错、简单题全对),组内方差趋近于零,优势估计退化。DeepSeek-R1 选择 G=16G=16 是经过消融实验的平衡点。

📐 GRPO vs PPO:优势估计的根本差异

两者的分歧核心是如何估计优势函数 AtA_t

PPO 的方式(需要 Critic)

AtPPO=r~t+γVϕ(st+1)Vϕ(st)(TD 误差,GAE 展开)A_t^{PPO} = \tilde{r}_t + \gamma V_\phi(s_{t+1}) - V_\phi(s_t) \quad \text{(TD 误差,GAE 展开)}

VϕV_\phi 是独立的价值网络,参数量与策略相当,在每个 token 位置给出”期望累计回报”的估计。

GRPO 的方式(组内归一化,无需 Critic)

AiGRPO=riμGσG,μG=1Gj=1Grj,σG=std(r1:G)A_i^{GRPO} = \frac{r_i - \mu_G}{\sigma_G}, \quad \mu_G = \frac{1}{G}\sum_{j=1}^G r_j, \quad \sigma_G = \text{std}(r_{1:G})

对同一输入采样 GG 个输出,以组内相对排名代替价值函数。

数学等价性:当 GG \to \infty 时,μGE[r]V(s0)\mu_G \to \mathbb{E}[r] \approx V(s_0)——GRPO 的组内均值渐近地等价于 PPO 的 Critic 对初始状态的估计。GRPO 本质上是用 Monte Carlo 采样隐式替代了参数化 Critic

RPO(Reward Policy Optimization)的定义与位置

RPO 是一类方法的统称:以奖励模型(RM)显式评分为驱动,通过参考策略(Reference Policy)施加正则化,优化策略的奖励期望。标准 RLHF + PPO 是 RPO 家族的典型实现。

RPO 的一般形式:

JRPO(θ)=Eyπθ ⁣[rϕ(x,y)]βE ⁣[logπθ(yx)πref(yx)]J_{RPO}(\theta) = \mathbb{E}_{y \sim \pi_\theta}\!\left[r_\phi(x, y)\right] - \beta\, \mathbb{E}\!\left[\log\frac{\pi_\theta(y|x)}{\pi_{ref}(y|x)}\right]

GRPO 可以看作 RPO 的一个特例:用组内奖励均值替代 Critic 估计 V(s)V(s),并保留同样的 KL 正则化项。

GRPO vs PPO(RPO 标准实现)vs REINFORCE 三路对比

维度REINFORCEPPO(RPO 标准实现)GRPO
优势估计A=rbA = r - b(固定基线 bbA=r+γVVA = r + \gamma V - V(Critic 网络)A=(rμG)/σGA = (r - \mu_G)/\sigma_G(组内统计)
需要 Value Network✓(与 Policy 等大)
需要 Reward Model
总模型数量243
训练稳定性差(高方差)好(Critic 降方差)中(组采样降方差)
适用奖励类型稀疏/密集稀疏/密集稀疏为主(可自动验证)
Clip 约束✓(同 PPO)
典型应用早期 LM RLInstructGPT、早期 RLHFDeepSeek-R1 数学/代码

💡 为什么 GRPO 适合推理任务,PPO/RPO 适合通用对话?

奖励信号的密度决定了哪种方法更有效

数学/代码任务的奖励是极稀疏、二值化的(答案对或错),无法给每个 token 提供密集梯度信号。PPO 的 Critic 在这种设置下退化——它只能在序列末尾看到一个 {0,1}\{0, 1\} 奖励,中间 token 的 TD 估计极其不准确,Critic 几乎学不到有用信息。

而 GRPO 的组内比较天然适配稀疏奖励:16 个序列中有 3 个答对了(r=1r=1)、13 个答错了(r=0r=0),组内统计立刻给出清晰的方向信号(对的概率上升 A>0A > 0,错的概率下降 A<0A < 0),完全不需要 per-token Critic。

对话对齐任务的奖励来自 RM 的连续打分(细粒度),Critic 可以充分学习 token 级价值函数——PPO 在这里优势更明显。

🔢 GRPO vs PPO 一次 Forward 的内存对比

以 7B 参数模型(fp16,每参数 2 字节)为基准:

模型GRPO 加载PPO 加载
Policy(有梯度)7B × 2 = 14 GB14 GB
Value Network(有梯度)14 GB
Reference Policy(无梯度)7 GB7 GB
Reward Model(无梯度)7 GB7 GB
合计显存≈ 28 GB≈ 42 GB

GRPO 节省约 33% 显存(去掉 Value Network)。对于 70B 模型,这意味着从需要 8 卡变成可能 6 卡就能训练。

但 GRPO 的隐性开销:每步要推理 G=16G=16 个序列(PPO 通常只采样 1-4 个),推理 throughput 下降明显——总计算量不一定更小,只是显存更省。

🔗 知识关联

  • GRPO → DAPO(2025):Qwen 团队对 GRPO 的改进,引入动态采样策略(只对有正负样本的问题训练),解决 GRPO 在高难度问题上梯度消失的问题 → 见 DAPO
  • GRPO → Dr. GRPO(2025):对组内归一化的统计分解改进,分别归一化不同来源的奖励信号
  • PPO 完整算法机制详见本节 Section 3 补充块
  • DPO 与 GRPO 的定位:DPO 解决”对话对齐”(offline,偏好对),GRPO 解决”推理能力提升”(online,可验证奖励)——两者互补,DeepSeek-R1 的完整训练同时使用了两者
  • 📚 三路算法(REINFORCE / PPO / GRPO)的系统对比 → GRPO vs RPO 拓展阅读

7. GRPO 改进谱系:DAPO / Dr.GRPO / GFPO / GSPO

GRPO 于 2024 年随 DeepSeek-R1 走红后,研究社区迅速暴露了它在大规模训练中的三类问题:熵崩塌优势估计偏差序列长度不平衡。2025 年上半年涌现出一批针对性改进:DAPO(字节跳动)、Dr.GRPO(阿里)、GFPO 和 GSPO。

7.1 DAPO:解决 GRPO 训练不稳定性

来源:ByteDance Research,2025;开源代码 + Qwen-32B 训练 recipe

GRPO 在大规模训练中暴露出四类问题,DAPO 逐一针对性解决:

问题 1:熵崩塌(Entropy Collapse)

训练过程中策略熵(Policy Entropy)持续下降,模型变得过于确信、失去探索能力。这与 GRPO 使用对称裁剪有关:上界 1+ϵ1+\epsilon 同时抑制了”拉高优质 token 概率”的空间。

解决方案 1:Clip-Higher(解耦裁剪)

将上下界裁剪解耦:

JDAPOclip(θ)=E ⁣[min ⁣(πθπoldA^,  clip ⁣(πθπold,1 ⁣ ⁣ϵlow,1 ⁣+ ⁣ϵhigh)A^)]J_{DAPO}^{clip}(\theta) = \mathbb{E}\!\left[\min\!\left(\frac{\pi_\theta}{\pi_{old}} \hat{A},\; \text{clip}\!\left(\frac{\pi_\theta}{\pi_{old}}, 1\!-\!\epsilon_{low},\, 1\!+\!\epsilon_{high}\right)\hat{A}\right)\right]

  • ϵlow0.2\epsilon_{low} \approx 0.2(保守限制策略退化)
  • ϵhigh0.28\epsilon_{high} \approx 0.28(给正向更新更大空间,保持熵)

问题 2:梯度稀释(Sample-Level Loss)

GRPO 原始实现中 loss 以 sample 为单位归一化:每个回答贡献的梯度 =tgradt/1= \sum_t \text{grad}_t / 1,长序列产生的梯度远大于短序列。

解决方案 2:Token-Level Policy Gradient Loss

LDAPO=1ioii=1Gt=1oimin ⁣(ri,tA^i,  clip(ri,t,1 ⁣ ⁣ϵlow,1 ⁣+ ⁣ϵhigh)A^i)\mathcal{L}_{DAPO} = \frac{1}{\sum_i |o_i|}\sum_{i=1}^{G}\sum_{t=1}^{|o_i|} \min\!\left(r_{i,t}\hat{A}_i,\; \text{clip}(r_{i,t}, 1\!-\!\epsilon_{low}, 1\!+\!\epsilon_{high})\hat{A}_i\right)

对总 token 数归一化,每个 token 贡献相等的梯度权重,消除长序列的主导效应。

问题 3:超长序列污染奖励信号

当模型生成超过 LmaxL_{max} 的序列时,被截断的回答在奖励计算上失真(因为推理过程不完整),会引入噪声梯度。

解决方案 3:Overlong Filtering + Soft Overlong Punishment

  • Overlong Filtering:超长序列不参与梯度计算(从 batch 中剔除)
  • Soft Overlong Punishment:对接近 LmaxL_{max} 的序列施加软惩罚,引导模型学习在限制内完成推理,而不是直接截断:

roverlong(y)={0yLmaxλyLmaxLmaxy>Lmaxr_{overlong}(y) = \begin{cases} 0 & |y| \leq L_{max} \\ -\lambda \cdot \frac{|y| - L_{max}}{L_{max}} & |y| > L_{max} \end{cases}

问题 4:全对 / 全错 group 无效训练

当某道题的所有 GG 个采样回答全部正确或全部错误时,组内奖励方差为零:σG=0\sigma_G = 0,归一化优势 A^i0\hat{A}_i \to 0 或 NaN,该 group 贡献零(或不稳定)梯度。

解决方案 4:Dynamic Sampling(动态采样)

在 rollout 阶段过滤掉 accuracy = 0% 或 100% 的 prompt,只保留有正有负的”混合 group”进入训练:

Btrain={(q,{yi})0<acc(q)<1}\mathcal{B}_{train} = \{(q, \{y_i\}) \mid 0 < \text{acc}(q) < 1\}

🔢 DAPO 各改进消融(DeepSeek-R1-Zero-Qwen-32B,AIME 2024)

配置AIME Score
Base(纯 GRPO)36
+ Overlong Filtering36
+ Clip-Higher38
+ Dynamic Sampling45
+ Token-Level Loss49
+ Soft Overlong Punishment50

观察:Dynamic Sampling 单项贡献最大(+7),说明”无效 group”是 GRPO 性能上限的核心瓶颈;Token-Level Loss 补充了梯度均衡(+4)。

💡 为什么 Dynamic Sampling 效果最显著?

想象一个班级学测验:全班都做对(或做错)一道题,老师无法从这道题的批改中学到如何”区分好坏答题策略”——因为没有对比。GRPO 遇到全对/全错 group 时同理:没有相对排名就没有梯度信号。Dynamic Sampling 强制每个 group 都包含”对”和”错”的样本,让每一步训练都有实质性学习信号。

🔗 知识关联


7.2 Dr.GRPO:消除 GRPO 的优化偏差

来源:阿里研究院,2025;“Dr.” = Debiased GRPO

GRPO 的组内归一化 A^i=(riμG)/σG\hat{A}_i = (r_i - \mu_G)/\sigma_G 在统计上存在两类系统性偏差

偏差 1:响应长度偏差(Length Bias)

GRPO 将同一奖励分配给序列内每个 token,但长度不同的回答获得不等的 per-token 梯度权重

  • 长序列(y=500|y| = 500 tokens):每 token 梯度 Ai/500\propto A_i / 500
  • 短序列(y=50|y| = 50 tokens):每 token 梯度 Ai/50\propto A_i / 50(大 10 倍)

这导致模型系统性偏好短回答,而非更正确的回答。

偏差 2:问题难度偏差(Question Difficulty Bias)

对极简单的问题(所有 GG 个采样全部正确),ri1r_i \equiv 1,此时 σG0\sigma_G \approx 0,归一化结果趋向 0/00/0 不稳定。对极难问题(全部错误),同理。

Dr.GRPO 的修正:全局归一化

批次级全局统计量替代 group 内统计量:

A^iDr=R(q,oi)RσR,R=1Nj,kR(qj,oj,k),σR=std ⁣({R(qj,oj,k)}j,k)\hat{A}_{i}^{Dr} = \frac{R(q, o_i) - \overline{R}}{\sigma_R}, \quad \overline{R} = \frac{1}{N}\sum_{j,k} R(q_j, o_{j,k}),\quad \sigma_R = \text{std}\!\left(\{R(q_j, o_{j,k})\}_{j,k}\right)

其中 jj 遍历批次中所有 prompt,kk 遍历每个 prompt 的所有采样——跨 prompt 比较奖励,而非局限于同一 prompt 的 group 内。

Dr.GRPO 完整目标:

JDrGRPO(θ)=i=1G1oit=1oimin ⁣(ri,tA^iDr,  clip(ri,t,1 ⁣ ⁣ϵ,1 ⁣+ ⁣ϵ)A^iDr)J_{DrGRPO}(\theta) = \sum_{i=1}^{G}\frac{1}{|o_i|}\sum_{t=1}^{|o_i|} \min\!\left(r_{i,t}\hat{A}_{i}^{Dr},\; \text{clip}(r_{i,t}, 1\!-\!\epsilon, 1\!+\!\epsilon)\hat{A}_{i}^{Dr}\right)

⚠️ 常见误区

  1. 误区:全局归一化会引入跨 prompt 的不公平比较(不同题目难度不同)→ 正确:正是如此——Dr.GRPO 刻意引入跨题难度对比,让奖励信号在绝对尺度上可比。这与标准化测试的曲线打分逻辑一致:用班级整体分布校准个体成绩。

  2. 误区:Dr.GRPO 解决了长度偏差,所以不再需要 DAPO 的 Token-Level Loss → 正确:两者从不同角度解决长度问题——Dr.GRPO 纠正优势估计的统计偏差,DAPO 的 Token-Level Loss 纠正梯度聚合的权重不均,可以叠加使用。


7.3 GFPO:多采样拒绝精选

核心思想:把 GRPO 的组内相对奖励排名替换为显式的拒绝采样(Rejection Sampling),只使用精选的高质量样本做策略梯度。

GFPO 算法流程

  1. 对同一 prompt qq 采样 GG 个回答 {o1,,oG}\{o_1, \ldots, o_G\}
  2. 计算各回答奖励 {r1,,rG}\{r_1, \ldots, r_G\},按得分排序
  3. 执行拒绝采样:S=REJECTIONSAMPLE(G,k,metric)S = \text{REJECTIONSAMPLE}(G, k, \text{metric}),选出 top-kk
  4. 仅对精选集合 SS 计算策略梯度损失

LGFPO=iSrirSσSlogπθ(oiq)\mathcal{L}_{GFPO} = \sum_{i \in S} \frac{r_i - \overline{r}_S}{\sigma_S}\log \pi_\theta(o_i | q)

核心直觉:与其用”好坏都有”的 group 做双向约束(上调好的、下调坏的),GFPO 只上调最好的——类似于 DPO 中只用”chosen”样本学习,但在线生成而非离线标注。这在奖励函数噪声较大时更鲁棒(坏样本可能因噪声被误评为”较好”,不如直接丢弃)。


7.4 GSPO:面向 MoE 结构的序列级策略优化

来源:针对 MoE(Mixture-of-Experts)模型的 GRPO 适配版本

问题:Token 级 IS 比率对长序列不稳定

标准 GRPO/PPO 使用 token 级重要性采样比率:

rIS=πθ(yx)πold(yx)=t=1yπθ(ytx,y<t)πold(ytx,y<t)r_{IS} = \frac{\pi_\theta(y|x)}{\pi_{old}(y|x)} = \prod_{t=1}^{|y|} \frac{\pi_\theta(y_t|x, y_{<t})}{\pi_{old}(y_t|x, y_{<t})}

当序列长度 y=500|y| = 500 时,这是 500 个比率的连乘积。每个比率略偏离 1.0,乘积结果可能指数级偏离(“比率爆炸”或”比率消失”),使梯度极其不稳定。

对 MoE 模型而言,不同专家路由路径不同,token 级比率的方差更大,问题更严重。

GSPO 的解决:序列级 IS 比率(Log-Sum 形式)

GSPO 将 token 级连乘改为 log-sum,再取 exp:

r~ISseq(y)=exp ⁣(1yt=1ylogπθ(ytx,y<t)πold(ytx,y<t))\tilde{r}_{IS}^{seq}(y) = \exp\!\left(\frac{1}{|y|}\sum_{t=1}^{|y|} \log\frac{\pi_\theta(y_t|x, y_{<t})}{\pi_{old}(y_t|x, y_{<t})}\right)

这等价于几何平均:先取每个 token 对数比率的均值,再还原为比率空间,避免了连乘的指数爆炸。

GSPO 完整目标函数:

JGSPO(θ)=Ex,{yi} ⁣[1Gi=1Gmin ⁣(r~iseqA^i,  clip ⁣(r~iseq,1 ⁣ ⁣ϵ,1 ⁣+ ⁣ϵ)A^i)]J_{GSPO}(\theta) = \mathbb{E}_{x, \{y_i\}}\!\left[\frac{1}{G}\sum_{i=1}^{G} \min\!\left(\tilde{r}_i^{seq} \hat{A}_i,\; \text{clip}\!\left(\tilde{r}_i^{seq}, 1\!-\!\epsilon, 1\!+\!\epsilon\right)\hat{A}_i\right)\right]

其余(组内归一化优势、clip 参数)与 GRPO 保持一致。

🔢 Token 级 vs 序列级 IS 比率对比

以序列长度 y=4|y| = 4 token、每个 token 比率 rt{0.9,1.1,0.95,1.05}r_t \in \{0.9, 1.1, 0.95, 1.05\} 为例:

Token 级连乘rIS=0.9×1.1×0.95×1.05=0.9845r_{IS} = 0.9 \times 1.1 \times 0.95 \times 1.05 = 0.9845

序列级 Log-Sumr~seq=exp ⁣(ln0.9+ln1.1+ln0.95+ln1.054)=exp(0.0159)0.9842\tilde{r}^{seq} = \exp\!\left(\frac{\ln 0.9 + \ln 1.1 + \ln 0.95 + \ln 1.05}{4}\right) = \exp(-0.0159) \approx 0.9842

两者接近——但当序列长度为 500、每个 token 比率方差较大时,连乘会产生数值爆炸,而 log-sum 始终稳定在合理范围。

🔗 GRPO 改进谱系一览

方法主要贡献解决的核心问题
GRPO(原始)组内归一化,去掉 Value Network推理任务的高效 RL 训练
DAPO解耦裁剪 + 动态采样 + Token-Level Loss熵崩塌 + 无效 group + 梯度稀释
Dr.GRPO全局归一化优势估计长度偏差 + 难度偏差
GFPO拒绝采样精选奖励噪声下的样本质量
GSPO序列级 IS 比率MoE 长序列下 IS 比率不稳定

8. 偏好数据的伦理问题

Slide 59 Slide 60 Slide 61 Slide 62 Slide 63 Slide 64
  • RLHF 标注数据来源:大量海外低薪劳工
  • 标注者偏见可能渗入模型(OpinionQA 研究)
  • Reward model 对不同国家/文化的偏好不均匀
  • AI Feedback 作为替代:RL from AI Feedback(Bai et al., 2022)

💡 为什么这样做?

RLHF 的本质是用”人类偏好”定义”好的回复”,但人类偏好是主观的、文化相关的、有偏的。OpenAI 的 InstructGPT 标注者主要来自美国和英语国家;Anthropic 使用众包平台(Mechanical Turk)的标注者人口结构偏向年轻、英语为母语的人群。这些偏好被嵌入奖励模型,再被 RLHF 放大。结果是:模型对某些文化背景的用户”更有帮助”,对其他文化的用户则可能产生偏见性或不当回复。OpinionQA 研究(Santurkar et al., 2023)发现,主流 LLM 的意见分布与特定人口群体高度相关,不能代表全球用户多样性。

⚠️ 常见误区

  1. 误区:RLHF 让模型更诚实(Honest)→ 正确:RLHF 让模型产生看起来诚实的回复,但奖励模型通常由倾向于给”自信、流畅回复”高分的人类标注者训练。这可能导致模型学会”自信地编造事实”(hallucination with confidence),而不是”诚实地承认不确定性”。真正的诚实需要专门设计针对不确定性表达的评估和训练数据。

  2. 误区:用 AI Feedback(RLAIF,Bai et al., 2022)代替人类标注可以消除偏见 → 正确:RLAIF 只是将偏见的来源从”人类标注者”转移到”作为评判者的 LLM”。评判模型本身就包含了人类偏见(因为它也是由人类数据训练的),偏见并没有消失,只是变得更不透明。

推荐阅读

关联概念

个人笔记