LLM 后训练实践
第4课:RLHF与GRPO

4.3 GRPO 改进与测试时计算

DAPO、Dr. GRPO、REINFORCE++ 等改进方法,以及测试时计算扩展的概念和与 o1/o3/R1 的连接

GRPO 的已知问题

尽管 GRPO 相比 PPO 大幅简化了推理 RL 的训练流程,但在大规模实践中仍存在一些问题:

  1. 长度偏差:序列级归一化导致更长的回复被隐式惩罚
  2. 采样效率:当组内所有回复都正确或都错误时,优势为零,该批次的训练信号为零
  3. 稳定性:大规模训练中仍有崩溃风险
  4. 熵坍缩:策略快速收敛到低熵状态,丧失探索能力

2025年上半年,多个团队提出了针对这些问题的改进方案。

DAPO:大规模 RL 的系统性改进

DAPO(Decoupled Alignment Policy Optimization)(Yu 等,字节跳动,2025)是对 GRPO 最全面的改进方案,包含四个核心技术:

技术1:Clip-Higher

问题:标准 PPO 的截断范围 [1ϵ,1+ϵ][1-\epsilon, 1+\epsilon] 是对称的,但在 RLHF 场景中,抑制坏回复(比值下降)和强化好回复(比值上升)的需求不对称。

解决方案:使用不对称截断:

clip(ρt,1ϵlow,1+ϵhigh)\text{clip}(\rho_t, 1-\epsilon_{\text{low}}, 1+\epsilon_{\text{high}})

其中 ϵhigh>ϵlow\epsilon_{\text{high}} > \epsilon_{\text{low}},例如 ϵlow=0.2\epsilon_{\text{low}} = 0.2ϵhigh=0.28\epsilon_{\text{high}} = 0.28

效果:给好回复更大的"上升空间",防止策略过早收敛到低熵状态。

技术2:动态采样(Dynamic Sampling)

问题:当组内 GG 个回复全部正确或全部错误时:

std({r1,,rG})=0    A^i=riμ0 (未定义)\text{std}(\{r_1, \ldots, r_G\}) = 0 \implies \hat{A}_i = \frac{r_i - \mu}{0} \text{ (未定义)}

通常设为 0,但这意味着浪费了该批次的计算

解决方案:当组内方差为零时,重新采样过滤掉该组,只保留有信息量的训练样本:

def dynamic_sampling(rewards):
    """过滤掉无信息量的组"""
    valid_groups = []
    for group in rewards:
        if group.std() > 0:  # 至少有正确和错误的回复
            valid_groups.append(group)
    return valid_groups

技术3:Token 级损失归一化

问题:标准 GRPO 对每个回复的损失除以回复长度 oi|o_i|,这会导致长回复和短回复被等权处理。但实际上,长回复包含更多 token 级决策,应该有更大的贡献。

解决方案:改为 token 级归一化——对整个 mini-batch 内的所有 token 的损失总和除以 token 总数,而非按序列归一化。

技术4:过长回复惩罚

对超过最大长度的截断回复施加额外惩罚,鼓励模型学习更简洁的推理:

Rtotal=Rcorrectness+Rformatλ1[o>Lmax]R_{\text{total}} = R_{\text{correctness}} + R_{\text{format}} - \lambda \cdot \mathbb{1}[|o| > L_{\text{max}}]

DAPO 的实验结果

方法AIME 2024MATH-500
GRPO (基线)31.4%90.2%
+ Clip-Higher33.8%91.0%
+ Dynamic Sampling35.2%91.8%
+ Token-Level Loss38.6%93.0%
DAPO (全部)41.0%93.4%

DAPO 的价值:它不是一个全新的算法,而是对 GRPO 的一组工程级改进。每个改进单独来看都很直观,但组合在一起效果显著。DAPO 是完全开源的,包含代码和训练配置。

Dr. GRPO:去除长度偏差

Dr. GRPO(Length-Desensitized GRPO)(MIT,2025)专门解决 GRPO 中的长度偏差问题。

长度偏差的来源

在标准 GRPO 中,损失按序列长度归一化:

L=1Gi=1G1oit=1oi[]\mathcal{L} = -\frac{1}{G}\sum_{i=1}^{G} \frac{1}{|o_i|}\sum_{t=1}^{|o_i|} [\cdots]

这意味着每个 token 的损失被等权对待。但问题在于:

  • 长回复:更多 token,每个 token 的梯度更新更小
  • 短回复:更少 token,每个 token 的梯度更新更大

如果奖励信号与长度相关(长回复更容易包含正确答案),模型可能学到"写得更长"的虚假策略。

Dr. GRPO 的解决方案

Dr. GRPO 通过以下方式消除长度偏差:

  1. 去均值化(De-meaning):从奖励中减去组均值(这与标准 GRPO 相同)
  2. 去相关化(De-correlation):进一步从优势中去除与长度相关的分量
A^iDR=A^iproj(A^i)\hat{A}_i^{\text{DR}} = \hat{A}_i - \text{proj}_{\ell}(\hat{A}_i)

其中 proj\text{proj}_{\ell} 是优势在长度方向上的投影。直觉上,这确保了模型只学习"质量信号",而非"长度信号"。

效果

Dr. GRPO 训练的模型在保持推理准确率的同时,生成的推理链更加简洁高效——不会为了"写得更长"而添加冗余的推理步骤。

REINFORCE++:简化 PPO

回到 REINFORCE 基础

REINFORCE++ 可以理解为 REINFORCE(经典策略梯度算法)加上一些现代改进,但不使用 Critic(价值网络)

θJ(θ)=Eτπθ[tθlogπθ(atst)(R(τ)b)]\nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta} \left[\sum_t \nabla_\theta \log \pi_\theta(a_t|s_t) \cdot \left(R(\tau) - b\right)\right]

其中基线 bb 使用简单的移动平均,而非学习到的价值函数。

REINFORCE++ 的关键改进

相比原始 REINFORCE,REINFORCE++ 加入了:

  1. PPO 式截断:限制更新幅度
  2. KL 惩罚:防止策略偏离参考模型
  3. 梯度裁剪:稳定训练
  4. 分组采样:类似 GRPO 的组内归一化

与 GRPO 的关系

REINFORCE++ 和 GRPO 的核心思想非常接近——都是去掉 Critic、用简单基线替代。主要区别在于:

方面GRPOREINFORCE++
基线计算组内均值/标准差归一化移动平均
来源DeepSeek (2024)经典 RL + 现代改进
TRL 支持GRPOTrainerRLOOTrainer

在 TRL 框架中,REINFORCE++ 通过 RLOOTrainer(Reinforcement Learning with Online Optimization)实现。

三种方法对比

方法Critic基线复杂度效果
PPO需要价值网络 VψV_\psi基准
GRPO不需要组内均值归一化约等于 PPO
REINFORCE++不需要移动平均略低于 GRPO

测试时计算扩展

核心发现

Snell 等(2024) 的研究提出了一个重要发现:

对于中等难度的问题,在推理时分配更多计算资源(让模型"思考更长时间"),可以超越14倍大的模型。

这意味着:在某些场景下,增加推理计算比增加模型参数更有性价比。

测试时计算的方式

策略描述计算成本适用场景
多次采样(Best-of-N)生成 N 个回复,选最优O(N)O(N)有验证器时
延长推理链让模型生成更长的推理过程O(L)O(L)有思考模式时
自我改进(Self-Refinement)让模型反复修改回复O(K)O(K)通用
树搜索(Tree-of-Thought)在推理空间中搜索O(BD)O(B^D)复杂推理
过程奖励引导用 PRM 引导推理路径O(NL)O(N \cdot L)有 PRM 时

与问题难度的关系

Snell 等的关键发现是测试时计算的效益高度依赖于问题难度

问题难度测试时计算效益原因
简单模型已经能做对,更多计算无意义
中等模型"差一点"就能做对,额外计算帮助突破
极难模型能力根本不够,更多计算也无法弥补
效益{简单问题:Pbase>0.8中等问题:0.2<Pbase<0.8困难问题:Pbase<0.1\text{效益} \propto \begin{cases} \text{小} & \text{简单问题:} P_{\text{base}} > 0.8 \\ \text{大} & \text{中等问题:} 0.2 < P_{\text{base}} < 0.8 \\ \text{小} & \text{困难问题:} P_{\text{base}} < 0.1 \end{cases}

与 o1/o3 和 R1 的连接

OpenAI 的 o1/o3 和 DeepSeek 的 R1 都体现了测试时计算扩展的思想:

o1/o3 模型(OpenAI):在回复前先进行长时间的"内部推理",推理过程对用户不可见。推理时间和 token 消耗显著增加,但推理质量大幅提升。

DeepSeek-R1:类似地在 <think> 标签内进行长推理,推理链可以长达数千 token。

Qwen3 思考模式:通过 /think 指令启用,模型在回复前先进行推理,推理过程对用户可见。

共同点:都是通过增加推理时的计算量来提升推理质量,而非增加模型参数。这代表了一种从"参数扩展"(parameter scaling)到"推理扩展"(inference scaling)的范式转变。

训练时 vs 推理时计算

维度训练时计算推理时计算
目的提升模型能力上限在能力范围内找到更好的解
方式更多数据、更多步数更长推理链、多次采样
成本模式一次性每次推理都需要
代表GRPO 训练o1/R1 推理
扩展规律预训练 Scaling LawsInference Scaling Laws

本节小结

GRPO 改进方法和测试时计算扩展共同构成了推理 AI 的最新技术前沿:

  1. DAPO 通过工程级改进(clip-higher、动态采样、token 级损失)全面提升 GRPO 效果
  2. Dr. GRPO 专门解决长度偏差问题,让模型生成更简洁的推理
  3. REINFORCE++ 提供了更简单的无 Critic RL 替代方案
  4. 测试时计算扩展 开辟了提升模型能力的新维度——不依赖更大的模型,而是让模型"想更多"
  5. 这些技术共同推动了 o1、o3、R1 和 Qwen3 等推理模型的发展