Brief Reinforcement Learning 02 - From GRPO to ?: 更优与更稳定的 LLM critic-free RL

First Post:
Last Update:
Word Count:
6.6k
Read Time:
25 min
Page View: loading...

写在前面

相关论文与资料参考:

这篇文章从一个问题出发:当我们把 RL 用于 LLM 训练时,advantage 究竟应该怎么估计?优化的目标应该怎么设计来尽可能保证训练的稳定性?


目录


一、PPO 回顾:为什么需要 Clip?

在进入 GRPO 之前,先简短回顾 PPO,因为 GRPO 的很多设计选择只有在对比 PPO 时才能讲清楚。

PPO(Proximal Policy Optimization)的核心目标是:在策略梯度更新时,不让新策略和旧策略偏离太远。它用 Clip 机制实现这个约束:

其中 是概率比, 是 advantage。

PPO 的关键依赖是 Critic 网络——它负责估计状态价值函数 ,从而计算出 。Critic 网络需要单独训练,这意味着:

  • 额外的计算成本(通常是一个与 Actor 同规模的模型)
  • 额外的训练稳定性问题(Critic 和 Actor 需要协同更新)
  • 在 LLM 场景下,状态空间是 token 序列,价值函数的泛化难度极高

GRPO 的出发点就是:能不能不要 Critic?


二、GRPO:用组内对比代替 Critic

2.1 设计动机

GRPO(Group Relative Policy Optimization)的核心洞察是:对于同一个 prompt,如果同时采样多个输出,输出之间的奖励差异本身就是 advantage 的天然来源。不需要一个 Critic 来告诉模型”这个状态值多少”,组内对比就能告诉模型”这个输出比其他的好多少”。

2.2 LLM 中的 MDP 映射:动作与状态

在经典 RL 的记号里,概率比写作:

但在 LLM 场景中, 具体指什么,值得停下来想清楚,因为这个映射直接决定了很多设计选择的合理性。

动作 :下一个 token

LLM 每一步生成一个 token。在 RL 的语言里,第 步的”动作”就是从词表 中选出第 个 token:

状态 :已生成的完整上下文

步的”状态”是到目前为止所有已知的 token 序列——包括原始 prompt 和已经生成的前 个 token:

因此,概率比在 LLM 中展开为:

这是新策略和旧策略在同一个上下文下同一个 token 赋予的概率之比。

这个映射有一个重要含义:LLM 的”状态空间”是所有可能的 token 序列,规模随序列长度指数增长。这正是 Critic 网络在 LLM 场景下极难训练的根本原因——它需要对一个天文数字量级的状态空间学出可靠的价值估计。GRPO 绕开 Critic 的动机,部分就来自于此。

2.3 目标函数

给定一个 prompt ,采样 个输出 ,每个输出得到奖励 。GRPO 计算组内归一化的 advantage:

然后用 PPO 风格的 Clip 目标来更新策略:

2.4 与 PPO 的本质差异

维度 PPO GRPO
Advantage 来源 Critic 网络估计的 组内奖励的相对排名
需要 Critic
Advantage 粒度 每个 token/步骤独立 整条序列共享同一个值
KL 约束 通过 Clip 隐式实现 Clip + 显式 KL 惩罚项
适用场景 通用 RL 可以枚举多个答案的任务(如数学、代码)

最核心的区别在于:PPO 的 advantage 是逐步骤的,而 GRPO 的 advantage 是逐序列的——整条输出共享同一个来自最终奖励的信号。这个设计在 LLM 推理任务(只有最终答案对错的稀疏奖励)中尤为自然,但也埋下了若干隐患。

2.5 GRPO 的内在问题

GRPO 在简洁性上做了很好的工程取舍,但在大规模 long-CoT 训练中,它的几个设计决策会导致系统性的失效:

问题一:对称 Clip 压制探索,导致熵坍塌

Clip 约束对低概率 token 和高概率 token 的限制是不对等的。一个概率为 0.01 的 token,即使 clip 上界是 ,其概率的绝对提升空间也极其有限。长此以往,策略的熵持续下降,模型对同一个 prompt 开始输出几乎相同的内容——探索停止了,但训练还在继续。

问题二:advantage 归一化中的统计偏差

GRPO 用组内的均值和标准差来归一化 advantage。这里有一个微妙的问题:计算某个样本 的 advantage 时,用到的标准差 包含了 本身。这产生了统计上的相关性,使得梯度估计是有偏的。此外,当组内所有奖励相同时,标准差为零,导致数值不稳定。

问题三:序列级均值引入长度偏差

GRPO 的 loss 先在序列内取均值 ,再在组内取均值 :这使得每条序列对总 loss 的贡献权重相同,无论它有多长。这个隐含假设在 long-CoT 场景下是错的:一条 2000 token 的深度推理链和一条 200 token 的简短答案,被等权重对待了。更严重的是,这种归一化方式对错误的长序列惩罚不足——模型学不到”不该用这么多 token 来表达错误的推理”。

问题四:全对/全错的 prompt 产生零梯度

当一个组内所有 个输出的奖励相同(全对或全错),归一化后 advantage 均为零,该 prompt 对梯度无任何贡献。随着训练推进、模型能力提升,”全对”的 prompt 越来越多,有效梯度来源不断萎缩,训练效率下降,梯度方差增大。


三、修补路径:从 RLOO 到 DAPO

理解了 GRPO 的四个问题,接下来的几个算法就像是针对这些问题的”专科门诊”。每一路改进都有明确的靶点:RLOO 和 REINFORCE++ 修的是基线与方差问题,GSPO 修的是 clip 语义错位问题,Dr. GRPO 修的是归一化中的偏差问题,DAPO 是多维系统性修复,GRPO++ 则是这一切的 agent 时代集成。

3.1 RLOO:无偏的留一法基线

RLOO(REINFORCE Leave-One-Out)是 GRPO 之前就已存在的方法,但它的思路对理解 GRPO 的偏差问题极有帮助。

核心思想:计算第 个样本的 advantage 时,用其余所有样本的平均奖励作为基线,而不是包含自身的全组平均:

为什么这是无偏的? 因为样本 的奖励 与其他样本的平均值在统计上是独立的(它们来自同一策略,但是独立采样)。这消除了 GRPO 中因”用自身参与计算基线”而引入的统计相关性。

与 GRPO 的关系:Dr. GRPO 的论文证明,当移除标准差归一化后 (即不再用 ,GRPO 的更新方向实际上等价于 RLOO——只差一个常数缩放因子。换言之,GRPO 加上标准差除法,反而引入了不必要的偏差。

RLOO 的设计哲学是回归到更纯粹的 REINFORCE 框架:不需要 Critic,也不需要参数化的基线,只需要组内的相互参照。代价是方差通常高于有 Critic 的方法,但在 LLM 场景中,多采样带来的信息增益往往足以补偿这一点。

3.2 REINFORCE++:稳定的单采样基线

RLOO 需要同一个 prompt 采样 个输出来构造基线,而 REINFORCE++ 的出发点是:能否在只有单条或少量轨迹的情况下,也做到稳定训练?

核心修改:在标准 REINFORCE 的基础上叠加三个 PPO 时代的工程经验:

  1. Mini-batch 更新:不再每条轨迹更新一次,而是攒成 mini-batch 后统一更新。这复用了同一批数据多个梯度步,大幅提升样本效率——这正是 PPO 相比原始策略梯度的核心优势之一,REINFORCE++ 把它带回了无 Critic 的框架。

  2. Token 级 KL 惩罚:用每个 token 处的 KL 散度作为 per-step 惩罚,而不是在序列末端统一施加:

序列末端的 KL 惩罚覆盖所有 token 的行为,但真正偏离 ref 的往往只是少数几个关键位置。逐 token 施加惩罚,让约束力和实际偏离程度精确对齐。

  1. 优势归一化:对批内所有样本的 advantage 做标准化,降低不同难度 prompt 之间的梯度尺度差异,稳定训练。

与 GRPO 的定位差异:GRPO 依赖”组内有对比”才能产生有效 advantage;REINFORCE++ 不要求这一点,哪怕只有单条轨迹也能工作。在对话任务、RAG 任务等难以枚举多个同质答案的场景下,REINFORCE++ 更具实用性。

3.3 GSPO:把 Clip 的语义对齐到序列级别

GRPO 继承自 PPO 的 Clip 机制,在 token 级别计算概率比并进行裁剪:

GSPO(Group Sequence Policy Optimization) 指出了一个被长期忽视的语义错位:我们真正关心的是整条序列有没有发生过大的偏移,但 token 级 clip 无法捕捉这一点。

两个策略对某条序列的概率比是所有 token 概率比的乘积:

即使每个 token 的 都在 clip 范围内,它们连乘之后完全可能产生极端值——序列越长,这个问题越严重。反过来,某个 token 的 略微超出 clip 范围,也不代表这条序列整体发生了大的偏移。Token 级 clip 和序列级语义之间存在根本的不匹配。

GSPO 的解法是直接在序列级别计算概率比并进行 clip

在实现上,为避免长序列的数值溢出,用 log 空间计算:,再还原成比值。

这使得 Clip 真正保护了”新旧策略对整条序列的联合概率不要偏离太远”这一直觉,而不是对 token 逐个检查。

3.4 Dr. GRPO:诊断并移除两种偏差

Dr. GRPO(”GRPO Done Right”)对 GRPO 做了两处精准的外科手术,分别对应两种不同性质的偏差。

修改一:移除标准差归一化

原始 GRPO 的 advantage:

Dr. GRPO 将其改为:

移除 的动机是:除以标准差相当于按难度缩放梯度——容易的题(奖励方差小, 小)会产生更大的更新幅度,而难题( 大)反而更新更保守。这在逻辑上是倒置的:模型应该更努力地学习困难样本,而不是被难题的方差”稀释”了梯度

修改二:按最大上下文长度归一化,而非按序列长度

原始 GRPO 用 对每条序列的 loss 归一化(即 GRPO 的序列级均值),Dr. GRPO 改为用固定常数(最大上下文长度 )归一化:

这消除了长度偏差:在原始 GRPO 中,对正确答案来说,较短的序列会产生更大的归一化 loss(因为分母更小),无意中鼓励了模型用更短的序列来”凑对”;对错误答案来说,较长的序列又被”稀释”了惩罚。两者组合的结果是训练过程中错误序列越来越长。Dr. GRPO 用固定分母斩断了这种隐蔽的激励。

3.5 DAPO:四个方向的系统性修复

DAPO(Decoupled Clip and Dynamic sAmpling Policy Optimization)更为全面,同时从策略层、数据层、损失层、奖励层四个维度出发,对应 GRPO 的四个问题。

Clip-Higher:不对称裁剪,守住探索空间

对称 clip 对低概率 token 不公平,DAPO 将上下界解耦:

(如 0.28 vs 0.20)。设计逻辑是:clip 的下界保守,防止策略突然崩坏;clip 的上界宽松,给低概率 token 留有足够的提升空间。两者的职责本就不同,用同一个 统一对待,是一种不必要的耦合。

同时,DAPO 移除了显式的 KL 惩罚项。KL 约束在 RLHF 对齐场景下有其道理:防止模型偏离安全的 SFT 初始化。但在 long-CoT 推理训练中,模型必须习得全新的思考方式,势必大幅偏离 SFT checkpoint——此时 KL 惩罚是学习的阻力,而非保护。

Dynamic Sampling:保证每步都有有效梯度

在送入训练前,过滤掉组内全对或全错的 prompt,只保留”有区分度”的样本。通过过采样 + 筛选来凑满目标 batch size。

这个设计的本质是:RL 的梯度信号来源于对比。如果一个 batch 里大量 prompt 的组内奖励没有分差,模型根本学不到任何东西——批次的计算成本实实在在地花了,但梯度方向几乎为零。Dynamic Sampling 把信息密度的维护变成了训练流程的一部分,而不是寄希望于数据分布自然产生足够的难度区分。

Token-Level Policy Gradient Loss:序列不是原子单位

DAPO 将 loss 从序列级均值改为 token 级均值:

每个 token 权重相同,序列的影响与其长度成正比。这背后是一个简单的公平性原则:损失函数的权重应该反映信息量,而信息量的载体是 token,不是”一条序列”这个抽象单位。序列级均值把”产生了 200 个 token 的正确推理”和”产生了 2000 个 token 的正确推理”等价对待,这在 long-CoT 场景中是一种根本性的信息丢失。

Overlong Reward Shaping:软性惩罚,避免奖励跳变

硬截断奖励(超过长度就直接 -1)会在奖励函数中引入跳变:序列差一个 token,奖励可能天差地别。这种不连续性对梯度是纯噪声。软性过渡区间让惩罚与”偏离合理范围的程度”连续对应,模型能从中感知方向,而不是面对一个无法微分的断崖。

3.6 GRPO++:汇聚以上,走向 Agent

DeepSWE 的 GRPO++ 将上述多路改进整合成一套用于 long-horizon agent 任务的训练算法,并增加了一个专为多步骤场景设计的修改:

技术 来源 解决的问题
Clip High DAPO 探索空间被对称 clip 压制
No KL Loss DAPO KL 约束阻碍推理策略大幅偏移
No Reward Std Dr. GRPO 标准差归一化引入难度偏差
Length Normalization Dr. GRPO 序列级归一化的长度偏差
Leave One Out RLOO 包含自身的基线引入统计偏差
Compact Filtering DeepSWE 原创 Agent 场景特有的”幸运成功”污染
No Entropy Loss DeepSWE 原创 熵正则项在多步任务中引入不稳定

其中 Compact Filtering 是 agent 场景独有的问题所对应的解法:在软件工程任务中,agent 偶尔会”蒙对”——随机提交一个改动恰好通过测试,但整个推理轨迹毫无逻辑。如果不过滤这类轨迹,模型会把”随机试探+侥幸命中”当成正确的策略来学习,导致奖励坍塌而非真正的能力提升。Compact Filtering 的本质是:只允许通过真正推理获得的成功贡献梯度。


四、Long-Horizon 的更深挑战

上述算法都在一个共同的假设下工作:奖励信号来自单次、完整的输出。这在数学推理(答对或答错)、代码生成(测试通过或不通过)等任务中是成立的。但当任务时序变长、步骤变多、环境可交互时,这个假设开始崩塌。

4.1 Holistic Policy Update:整体轨迹的梯度问题

在多步骤 agent 任务中,模型执行一系列动作(搜索文件、修改代码、运行测试),最终奖励只在任务结束时给出。这带来了一个根本问题:如何把末端的稀疏奖励归因到具体的每一步?

当前的 GRPO 系列方法,包括 GRPO++,本质上仍在用轨迹级的单一奖励来训练 token 级的策略。这意味着:

  • 整条轨迹中每个 token 获得相同的 advantage,不管它是”关键的一步”还是”无足轻重的过渡”。
  • 早期步骤的探索行为受到的奖励信号极其延迟,梯度方差极大。
  • 模型无法从”哪一步导致了失败”中学习,只知道”这条轨迹失败了”。

真正的 holistic policy update 应该能够对轨迹中的每一步分配合理的功劳或过失。这需要某种形式的过程奖励模型(Process Reward Model, PRM),在轨迹的中间节点提供密集反馈,而不是只有终态的稀疏信号。但 PRM 本身的标注与训练是另一个难题——谁来告诉模型”这一步的中间状态值多少分”?

4.2 Compositional RL:分解任务,分解奖励

Long-horizon 任务面临的另一个挑战是:任务本身就是由多个子目标组合而成的。一个完整的软件工程任务,包含了”理解需求”、”定位代码”、”设计方案”、”实现修改”、”验证结果”等多个阶段,每个阶段都有自己的成功标准。

Compositional RL 的思路是把这个结构显式地引入训练:

  • 奖励分解(Reward Decomposition):不只给最终任务奖励,而是给每个子目标独立的奖励信号,把稀疏的末端奖励转化为密集的过程信号,从根本上改善信用分配。

  • 分层策略(Hierarchical Policy):高层策略(meta-controller)负责分解任务、分配子目标;低层策略负责在单个子目标内做具体动作。两者可以独立用 RL 训练,再通过接口组合,把一个极难探索的大问题降维成若干个更容易覆盖的小问题。

  • 选项框架(Options Framework):每个”选项”是一个带有终止条件的子策略,让策略的时间尺度自适应,而不是强迫用同一粒度处理”单步改动”和”整体架构决策”。

常见的子奖励信号:设计实例

奖励分解不是抽象概念,在工程落地中已经形成了若干经验性的奖励组合模式。以下是在 tool-use 和 agent 任务中常见的几类子奖励:

① 格式正确性奖励(Format Reward)

模型调用外部工具时,输出必须是可被解析的结构化格式(如 JSON、XML 或特定模板)。格式奖励检查的是:function call 的字段是否完整、嵌套层级是否正确、必填参数是否缺失。

这是最低层的奖励,属于”连参与任务的资格都需要用奖励来训练”的类型。格式错误会导致整条轨迹后续全部失效,它的信号应该强而清晰。

② 工具调用正确性奖励(Tool Correctness Reward)

格式正确只是第一步,工具调用的语义是否合理是第二层。检查内容包括:工具名称是否合法(调用了存在的 API)、参数类型是否匹配、调用时机是否合适(在需要检索时调用了检索工具而非生成工具)。

这类奖励通常需要一个轻量的校验器(validator)来实现,而不只是字面匹配。

③ 工具使用激励(Tool Usage Incentive)

在 RAG 或 search-augmented agent 中,模型有时会倾向于”靠记忆直接回答”而非主动调用工具——因为调用工具需要多步骤,失败风险更高。工具使用激励给主动调用工具的行为一个正向信号,防止模型退化成纯参数记忆的检索模式。

这类奖励需要谨慎校准:激励过强会导致模型过度调用工具,对简单问题也要反复查询,增加延迟和成本。

④ 超长输出惩罚(Length Penalty)

对应 DAPO 的 Overlong Reward Shaping,但在 agent 任务中语义略有不同:超长不只是”token 太多”,也包括”思考轮次太多”、”工具调用次数超出合理范围”。软性惩罚的设计原则相同:让惩罚与偏离程度成比例,避免硬截断引入奖励跳变。

⑤ 引用真实性奖励(Grounding Reward)

当模型生成引用了文献、代码函数名、API 端点、数据库字段等实体时,可以对这些引用做存在性验证:引用的论文 DOI 是否真实、调用的函数名是否在当前代码库中存在、提到的 URL 是否可访问。这是一类事实核查型奖励,专门用于抑制模型”自信地编造引用”这一顽固问题(即 hallucination 的一种具体形态)。

实现上常用工具调用的返回结果(检索到了 → 正分,404 → 负分)来替代人工标注。

子奖励的组合与冲突

将以上奖励线性组合是最常见的起点:

但线性组合并不总是稳定的。子奖励之间存在若干典型的干扰模式:

  • 格式奖励与内容奖励冲突:模型可能学会”生成格式合法但内容无意义的调用”来刷格式分。
  • 工具激励与长度惩罚冲突:鼓励多用工具,但多轮工具调用又会增加长度,两个信号相互抵消。
  • Grounding 奖励被 hack:模型学会只引用高频出现的、容易验证的实体,而回避需要深度推理才能确定的引用。

这些冲突没有通用解法,是 compositional reward 工程中需要针对具体任务反复调试的核心难点。

然而,Compositional RL 并非免费的午餐。子目标的设计本身需要领域知识;子奖励之间可能互相干扰或被 hack;分层策略的训练稳定性比单层更难保证。这些问题目前还没有被 GRPO 系列的任何变体正面解决——它们代表了从”让模型做对一道题”到”让模型真正解决一个工程问题”之间尚未跨越的鸿沟。


小结

从 GRPO 出发,这条演化路径可以用一张图来理解:

1
2
3
4
5
6
7
8
9
10
11
GRPO
├── 统计偏差(含自身的基线) → RLOO(留一法,无偏估计)
├── 单轨迹场景下方差过高 → REINFORCE++(mini-batch + token KL)
├── Token 级 clip 语义错位 → GSPO(序列级概率比 + clip)
├── 难度偏差(std 归一化) → Dr. GRPO(移除 std)
├── 长度偏差(序列级均值) → Dr. GRPO / DAPO Token-Level Loss
├── 探索坍塌(对称 clip) → DAPO Clip-Higher
├── 梯度空转(全对/全错组) → DAPO Dynamic Sampling
├── 奖励噪声(硬截断惩罚) → DAPO Overlong Reward Shaping
├── KL 约束阻碍 long-CoT → DAPO / GRPO++ No KL Loss
└── Agent 场景的幸运成功污染 → GRPO++ Compact Filtering

每一个改动背后都有清晰的诊断:某个设计假设在大规模 long-CoT 或 agent 训练中不再成立,因此要修正它。这种”找到假设、打破假设、重建假设”的思路,比任何具体的超参数或公式都更值得记住。

而 long-horizon 任务的挑战,则要求我们在这个框架之上再进一步——不只是修补 advantage 估计的统计问题,而是重新思考奖励的结构、策略的层次、以及”学会解决问题”和”学会通过测试”之间的根本差别


本文由 IsaacGHXClaude Code 合著。
如有错误或讨论,欢迎在评论区指出。