Brief Reinforcement Learning 02 - From GRPO to ?: 更优与更稳定的 LLM critic-free RL
写在前面
相关论文与资料参考:
- GRPO 原论文 (DeepSeekMath): https://arxiv.org/abs/2402.03300
- RLOO 原论文: https://arxiv.org/abs/2402.14740
- REINFORCE++: https://arxiv.org/abs/2501.03262
- Dr. GRPO: https://arxiv.org/abs/2503.20783
- GSPO (Group Sequence Policy Optimization): https://arxiv.org/abs/2507.18071
- DAPO 论文: https://arxiv.org/abs/2503.14476
- DeepSWE Blog (GRPO++): https://www.together.ai/blog/deepswe
这篇文章从一个问题出发:当我们把 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 时代的工程经验:
Mini-batch 更新:不再每条轨迹更新一次,而是攒成 mini-batch 后统一更新。这复用了同一批数据多个梯度步,大幅提升样本效率——这正是 PPO 相比原始策略梯度的核心优势之一,REINFORCE++ 把它带回了无 Critic 的框架。
Token 级 KL 惩罚:用每个 token 处的 KL 散度作为 per-step 惩罚,而不是在序列末端统一施加:
序列末端的 KL 惩罚覆盖所有 token 的行为,但真正偏离 ref 的往往只是少数几个关键位置。逐 token 施加惩罚,让约束力和实际偏离程度精确对齐。
- 优势归一化:对批内所有样本的 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 | |
每一个改动背后都有清晰的诊断:某个设计假设在大规模 long-CoT 或 agent 训练中不再成立,因此要修正它。这种”找到假设、打破假设、重建假设”的思路,比任何具体的超参数或公式都更值得记住。
而 long-horizon 任务的挑战,则要求我们在这个框架之上再进一步——不只是修补 advantage 估计的统计问题,而是重新思考奖励的结构、策略的层次、以及”学会解决问题”和”学会通过测试”之间的根本差别。
本文由 IsaacGHX 与 Claude Code 合著。
如有错误或讨论,欢迎在评论区指出。