GRPO / DAPO 家族
LLM-RL · 2017–2026 · 算法家族

从 PPO 到 DAPO、SAO 与 OPD:同一张目标函数,七种算法

PPO 用 critic 把序列奖励摊到每个 token,GRPO 改用组内相对奖励省掉 critic,DAPO 再拆开裁剪、采样、长度归一化和超长奖励。 CISPO、SAPO、SAO、OPD 各自只改其中一项:裁剪对象、门控形状、采样方式或监督信号。 把它们放在一张表里,差异不在名字,而在优势从哪来、clip 裁什么、KL 放哪、长度怎么归一化。

PPO / DeepSeekMath / DAPO / SAO / MiniMax-M1 / SAPO / verl OPD PPO ↗ GRPO ↗ DAPO ↗ SAO ↗ CISPO ↗ SAPO ↗ OPD 文档 ↗
TL;DR · 30 秒抓住核心

PPO 的核心不是名字,而是 Eq.7 的 min:未裁剪的 r·Â 和裁剪后的 clip(r)·Â 取较小者。 它需要一个 Ât;PPO 用 critic + GAE 把序列末端的奖励摊到每个 token。代价是第二个同量级模型,以及“每个 token 的价值”本身很难学。

GRPO 去掉 critic:同一问题采样 G 条回答,奖励在组内减均值、除标准差,整条回答的所有 token 共用这个 Â。 DeepSeekMath 的设置是 G=64、β=0.04;它省掉了 value model,但组内全对或全错时 Â=0,样本级归一化也让长短回答的权重不同。

DAPO 在 GRPO 上拧四个开关:解耦上下 clip(0.2 / 0.28)、过滤全对或全错组、把损失从样本级改成 token 级、对超长样本做软惩罚。 它不是新 critic,而是把“哪些 token 该学、每组该不该学、长度怎么算”拆开。

再往后,CISPO 把裁剪从 token 更新移到 IS 权重并停梯度,SAPO 用平滑门控替代硬裁剪,SAO 把 group 采样换成单 rollout + DIS mask + 更强的 value model,OPD 把 reward 换成 teacher 的 token 分布。 它们不是一条单向升级链;共同点只是都在改同一张目标函数的某一项。

50 avg@32
DAPO 在 AIME 2024、Qwen2.5-32B 上的分数;同一张表里 naive GRPO 为 30,差 20 个百分点
97.3 Pass@1
SAO 在 AIME2025、Qwen3-30B-A3B-Thinking-2507 上的分数;同表 GRPO(w/ python)为 84.2
88.2%
DeepSeekMath-RL 7B 在 GSM8K、CoT 设定下的准确率;同表 MATH 为 51.7%
01

PPO 的 clip 很便宜,贵的是它背后那个 critic

先建立共同认知:clipped surrogate 本身只是一个逐 token 的乘法与取小;真正决定训练成本的是 Ât 从哪来。

PPO 的目标写在 Eq.7。记 rt(θ) = πθ(at|st) / πθold(at|st),它是新旧策略对同一个动作的概率比:

LCLIP(θ) = Êt[ min( rt(θ) Ât, clip(rt(θ), 1−ε, 1+ε) Ât ) ]
PPO 原文 Eq.7;ε 的示例取值为 0.2(§3)。当 r 落在区间外时,裁剪项把梯度与 θ 脱钩,min 使目标成为未裁剪目标的悲观下界。

min 的几何含义很直接:对正优势,r 超过上界后目标不再随 r 增长;对负优势,r 低于下界后目标也不再随 r 下降。 它限制的是“单次更新能把一个 token 的概率推多远”,而不是“这个 token 该不该学”。后者由 Ât 决定。

PPO 用 value function V(s) 和 GAE 得到 Ât。PPO 原文 Eq.11 给出截断 GAE:

Ât = δt + (γλ) δt+1 + … + (γλ)T−t+1 δT−1
PPO 原文 Eq.11;GAE 本身来自 Schulman et al. 2015(arXiv:1506.02438),PPO 表格里的 λ=0.95、γ=0.99 是实验超参。λ 在偏差与方差之间插值:λ=0 只看一步 TD,λ=1 看完整回报。

在 LLM RLHF 里,这个 critic 的代价被放大。DeepSeekMath §4.1 的原话是:PPO 里的 value function 通常是和 policy model 同量级的另一个模型,带来 substantial memory and computational burden; 而且在 LLM 场景中,reward model 通常只给最后一个 token 打分,训练一个“每个 token 都准”的 value function 会更困难。前者是显存与吞吐,后者是信号质量。

四个账本问题

后面每个算法,都可以按这四问答一次

  • 优势从哪来?critic + GAE、组内相对奖励、还是 teacher 分布?
  • clip / mask 裁什么?裁概率比、裁 IS 权重、用软门控,还是直接 mask 掉 token?
  • KL 放在哪?塞进 reward、作为 loss 的独立项,还是完全移除?
  • 长度怎么归一化?先按响应平均再按批次平均,还是直接除以全 batch 的 token 总数?

这四问不是分类学,而是会直接改变梯度的形状。比如 KL 放进 reward 时,Ât 里已经包含了对参考模型的惩罚;KL 作为 loss 项时,Ât 只反映任务奖励。 两种写法在论文里都叫“PPO/GRPO”,但梯度不是同一个东西。后面的对比都按“目标函数实际写了什么”来,不按名字。

02

GRPO 拿掉 critic,代价是把信用分配压成组内一个标量

PPO 用 critic 买 per-token 信用;GRPO 用组内比较省掉 critic。两条路的代价不同,不是简单的“谁更先进”。

PPO

critic + GAE:每个 token 一个优势

价值网络给出 V(st),GAE 把 TD 残差按 (γλ) 加权,得到逐 token 的 Ât。信用粒度细,理论成熟。

代价:多一个同量级模型;长文本下 value 估计噪声大;LLM 往往只在序列末给奖励,per-token value 更难训。

在 RLHF 工程里,KL 通常还被塞进 reward:rt = rφ − β log(πθ/πref),这样 Ât 里已经含 KL。DeepSeekMath Eq.2 描述的就是这个写法。

GRPO

组内相对奖励:整条回答一个优势

同一问题采样 G 条回答,奖励在组内标准化;整条回答的所有 token 共用 Âi,t = (ri − mean(r)) / std(r)。不需要 critic。

代价:组内全对或全错时分子为 0;同一条回答里所有 token 共享一个数;硬 clip 的上界会压住低概率“探索型” token。

GRPO 把 KL 从 reward 移到 loss,用 Eq.4 的逐 token 估计量;DeepSeekMath 的设置是 G=64、β=0.04。

GRPO 的目标函数(DeepSeekMath Eq.3)是 PPO clip 目标加一个 KL 项,归一化方式改成了“先 token、再组内”(先在每条回答内对 token 取平均,再对 G 条回答取平均):

JGRPO(θ) = E[ (1/G) Σi=1G (1/|oi|) Σt=1|oi| ( min( ri,tÂi,t, clip(ri,t, 1−ε, 1+ε)Âi,t ) − β DKL[πθ ‖ πref] ) ]
DeepSeekMath Eq.3;Âi,t 在同一组内对整条回答是常数。KL 估计量用 Eq.4:πref/πθ − log(πref/πθ) − 1,论文注明它保证非负。

这些缺口正好对应 DAPO 的四个改动:全对/全错组没有梯度,对应动态采样;样本级归一化让长短回答权重不同,对应 token 级损失;上界压住低概率 token,对应 clip-higher;超长样本被截断后统一罚分,对应 overlong reward shaping。 所以 DAPO 不是“又一个新的 critic”,而是把 GRPO 里混在一起的几件事拆开。

本页表 1:PPO 与 GRPO 在优势、基线、KL、长度归一化四个维度上的对照(整理表,不是原文表号)。

维度PPOGRPO差别落在哪
优势来源critic + GAE,逐 token组内标准化,整条回答共享显存 / 信用粒度
基线V(st)mean(r1…rG)基线是否条件在状态上
KL 位置通常在 reward 里(RLHF 约定)loss 里的独立项Â 是否已含 KL
长度归一化逐 token / 逐序列,按实现(1/G)Σ(1/|oi|)Σt长短回答的总权重
典型失效critic 噪声、显存零方差组、长度偏差下一节展开

注:PPO 侧按 Eq.7/11 与 DeepSeekMath Eq.2 的 RLHF 写法;GRPO 侧按 DeepSeekMath Eq.3/4。两列的“典型失效”是结构性描述,不是论文实验结论。

03

这些算法,改的都是同一张目标函数的不同项

先看目标函数的逐项差异,再看每个方法把哪一项换掉;最后用一个可调模拟器把“组内优势 + clip”算一遍。

3.1 PPO / GRPO:裁概率比,KL 一个在 reward、一个在 loss

PPO 和 GRPO 的信任域都作用在概率比 ri,t 上:min(r·Â, clip(r,1−ε,1+ε)·Â)。 差别在 Â 和 KL:PPO 的 Â 来自 critic,KL 常被塞进 reward;GRPO 的 Â 来自组内标准化,KL 是 Eq.3 里的独立项。 两种写法都能写成“带信任域的策略梯度”,但梯度的组成不同。

GRPO 的组内优势有一个容易忽略的细节:std(r) 的分母论文没有在公式里区分 ÷G 与 ÷(G−1)。 本页的模拟统一用总体标准差 ÷G;复现时要和实现对齐,因为 G=4 或 8 时两种分母的数值差别不小。

3.2 DAPO:四个开关分别改 clip、采样、长度和超长奖励

Clip-Higher(Eq.10)。把单一的 ε 拆成 εlow 和 εhigh,只抬高上界。DAPO §4.1 的设置是 εlow=0.2、εhigh=0.28。论文 §3.1 的理由是:上界会限制低概率“探索型” token 的概率提升,抬高上界可以缓解熵坍塌;εlow 保持 0.2,因为增大 εlow 会把低概率 token 的概率压到 0。

JDAPO(θ) = E[ (1/Σi|oi|) Σi Σt min( ri,tÂi,t, clip(ri,t, 1−εlow, 1+εhigh)Âi,t ) ]
DAPO Eq.10 / Eq.12;εlow=0.2、εhigh=0.28(§4.1)。Eq.10 与 Eq.12 的分母相同(都是 1/Σi|oi|);Eq.10 的改动是 clip,Eq.12 的改动是相对 GRPO Eq.3 的样本级归约改为 token 级归约。

Dynamic Sampling(Eq.11)。对每个 prompt 采样一组回答,只保留“既有正确又有错误”的组,满足 0 < |{oi | is_equivalent(a,oi)}| < G。全对或全错的组不进 batch;采样不够就继续采,直到 batch 填满。这样每个进入训练的组都有非零优势,避免零梯度组稀释 batch 梯度。

0 < |{ oi | is_equivalent(a, oi) }| < G
DAPO Eq.11 的约束;Algorithm 1 第 6–8 行:过滤后若 buffer 不足 N,就继续采样而不更新。

Token-Level Loss(Eq.12)。GRPO 先对每条回答的 token 取平均,再对 G 条回答取平均;DAPO 直接对所有回答的所有 token 求和,再除以总 token 数。前者的每条回答总权重相同,后者每个 token 权重相同。DAPO §3.3 报告后者让长回答对梯度的影响更大;§4.2 报告它让训练更稳、长度增长更健康。

Overlong Reward Shaping(Eq.13)。超过 Lmax−Lcache 后开始线性罚分,超过 Lmax 后固定罚 −1:

Rlength(y) = 0   if |y| ≤ Lmax−Lcache
= ((Lmax−Lcache) − |y|) / Lcache   if Lmax−Lcache < |y| ≤ Lmax
= −1   if |y| > Lmax
DAPO Eq.13;§4.1 设置 Lmax=16384、Lcache=4096,因此最大生成长度为 20480 个 token。另有 Overlong Filtering:把被截断样本的 loss mask 掉。

点一个样本,再用滑块改它的概率比 r;看组内优势与 clip 后的目标值。

组内统计与 clip 目标

简化模拟:奖励只有 0 / 1,标准差用总体标准差(÷G),r 由滑块给定,不由模型前向计算。 未覆盖:真实 token 级 ratio、KL 项、动态采样、多轮 off-policy 更新;因此它只验证 Eq.3 的组内标准化与 Eq.7 的 min/clip 算术,不代表完整训练。

手算 A:G=4 的组内优势与 clip 目标 与交互 1 同参数逐位一致(三位小数)

奖励 [1, 0, 1, 0],G=4。均值:

mean = (1+0+1+0)/4 = 0.500

总体方差 ((1−0.5)²+(0−0.5)²+(1−0.5)²+(0−0.5)²)/4 = 0.25,总体标准差 std = 1/2 = 0.500。

样本 0:Â = (1−0.5)/0.5 = +1.000;样本 1:Â = (0−0.5)/0.5 = −1.000。

正优势:取样本 0,r=1.300,ε_low=0.2、ε_high=0.28。未裁剪 r·Â = 1.300×1 = 1.300;裁剪 clip(1.3, 0.8, 1.28)=1.280;目标 min(1.300, 1.280)=1.280。

负优势:取样本 1,r=0.700,Â=−1.000。未裁剪 0.700×(−1) = −0.700;裁剪 clip(0.7, 0.8, 1.28)=0.800;目标 min(−0.700, 0.800×(−1)=−0.800) = −0.800。

注意负优势这一支:min 选的是更小的 −0.800,也就是裁剪分支。它的梯度为 0,这正是 PPO 在“坏 token 的概率已经被压得足够低”时停止继续压低的方式。

3.3 CISPO:裁 IS 权重并停梯度,而不是把 token 的梯度裁没

CISPO 的出发点是:PPO/GRPO 的 clip 会让高 rt 的稀有 token 在第一次 on-policy 更新后就不再贡献梯度。MiniMax-M1 §3.1 把这类 token 描述为推理路径的“分叉点”(例如 However、Recheck、Wait、Aha),它们在 base 模型里概率低,更新时 rt 往往很大,于是被裁掉。

JCISPO(θ) = E[ (1/Σi|oi|) Σi Σt sg( r̂i,t(θ) ) Âi,t log πθ(oi,t | q, oi,<t) ]
MiniMax-M1 Eq.4;r̂ = clip(r, 1−εlowIS, 1+εhighIS)(Eq.5),sg 表示 stop-gradient。论文说下界没有真正启用,εlowIS 设得很大,只调上界。

关键差别是裁剪对象:PPO/GRPO 裁的是“目标里的 token 更新”,CISPO 裁的是“IS 权重”,并且把权重停梯度。于是每个 token 都还能通过 log πθ 贡献梯度,权重只作为一个固定系数;代价是梯度有轻微偏差(论文 §3.1 自己说明)。 CISPO 还给了 Eq.6/7 的统一形式,用 token mask 模拟 PPO 的信任域:Â>0 且 r>1+εhigh 时 mask 为 0,Â<0 且 r<1−εlow 时 mask 为 0。它不使用 KL 项,并借用了 DAPO 的动态采样与长度惩罚。

引言(§1)称 2× 加速。正文对 CISPO vs DAPO/GRPO 的受控对比只给 Figure 2 的曲线,没有给出可直接转录的 AIME 分数(MiniMax-M1 最终模型分数见 Table 2)。

3.4 SAPO:把硬裁剪换成平滑门控

SAPO 的观察是 token 级重要性比方差大,硬裁剪在“稳定”和“保留学习信号”之间只能二选一:GSPO 在序列级裁,少数离群 token 会让整条序列的梯度被抑制;GRPO 在 token 级裁,边界是断开的。 SAPO 用一个温度控制的软门控替换硬裁剪:

JSAPO(θ) = E[ (1/G) Σi (1/|yi|) Σt fi,t(ri,t(θ)) Âi,t ]
SAPO Eq.5;fi,t(x) = σ(τi,t(x−1)) · (4/τi,t)(Eq.6),τi,t = τpos 若 Â>0,否则 τneg。因子 4/τ 使 r=1 处的梯度与未裁剪目标相同。

门控在 r=1 处取 1,向两侧平滑衰减;τ 越大衰减越快。论文设置 τpos=1.0、τneg=1.05(§5.1 的受控实验),并解释负优势需要更快的衰减,因为负 token 的更新会抬高大量未采样 token 的 logits,词表大时更容易不稳。 在“token 级 log-ratio 方差小”的假设下,逐 token 门控会聚合成序列级的 sech²(τ/2 · log si),因此它既有序列连贯性,又能只降权离群 token。目标函数 Eq.5 没有 KL 项。

论文在 Qwen3-30B-A3B-Base 的 cold-start 模型上比较 GSPO 与 GRPO-R2,报告 SAPO 训练更稳、最终 Pass@1 更高;但正文只给 Figure 4 的曲线,没有给出可转录的最终数值。Qwen3-VL 的实验同样只给 Figure 6 的曲线。

3.5 SAO:group size 1,DIS mask,critic 回来但换了训练方式

SAO 处理的是异步 agentic RL:同步 group 采样必须等最慢的一条 rollout,长链路任务里这个等待很贵;异步又会引入 policy lag。SAO 直接把 group 采样换成“每个 prompt 一条 rollout”,于是 GRPO 的组内基线消失,优势估计回到 value model。

L(θ) = Êt[ f(rt(θ), εℓ, εh) Ât log πθ(at|st) ]
rt(θ) = exp( log πθ(at|st) − log πrollout(at|st) )
f(x; εℓ, εh) = x   if 1−εℓ < x < 1+εh;   0   otherwise
SAO Eq.1–3;DIS 直接用 rollout 引擎的 log-prob 当行为策略,不再追踪 πθold。区间外的 token 整段 mask 掉(梯度为 0),而不是只裁目标。

单 rollout 的梯度方差像 REINFORCE,SAO 用三件事补:critic 每个 policy 更新训 K=2 次;critic 的 attention 层冻结,只训 MoE 投影;agentic 轨迹跨 action→observation 边界时,用 skip-observation GAE 把 Bellman target 直接连到下一个 action:

Â(ai,N) = δ + γλ Â(ai+1,0)    δ = rt + γ V(ai+1,0) − V(ai,N)
SAO Eq.4/5;ai,N 是第 i 个 action 的最后一个 token,ai+1,0 是下一个 action 的第一个 token;observation token 由环境生成,不进入 value 链路。

设置:batch 128、group size 1、max length 128k、policy lr 1e-6、critic lr 5e-6;数学/TIR 的 εℓ=0.3、εh=5.0,coding 的 εℓ=0.8、εh=3.0(§4.1)。

3.6 OPD:把 reward 换成 teacher 的 token 分布

OPD(On-Policy Distillation)不采样“奖励”,而是让学生在自己的 rollouts 上接受 teacher 的逐 token 分布监督。这样状态分布与推理时对齐(on-policy),监督信号又比序列级 0/1 reward 密集。

LOPD(θ) = Ex, y∼πθ[ (1/|y|) Σt D( πθ(·|st), ν(·|st), yt ) ]
verl 官方文档 OPD 页的损失形式;st=(x,y<t),ν 是 teacher。文档把实现分成 GKD OPD(默认,teacher top-k forward KL,直接反传)与 PG OPD(单样本 reverse KL 估计当 reward,rt=sg(log ν(yt|st) − log πθ(yt|st)),走 PPO 更新)。

出处说明:OPD 在笔记里没有对应单篇论文,笔记把来源指向 verl 官方文档的 OPD 页;本页的公式与 GKD/PG 区分按该文档写。按论文谱系追溯的原始出处,本页标注为“笔记简称,原始出处待核”,不引用任何二手博客的数字。

本页表 2:算法家族的目标函数逐项对照;“口径”列区分论文原文与工程实现约定。

方法目标函数核心Â 来源信任域机制KL长度归一化口径
PPO min(r·Â, clip(r,1−ε,1+ε)·Â) critic + GAE 概率比 clip,ε=0.2 通常在 reward 里(RLHF 约定) 按实现,逐 token 或逐序列 论文 Eq.7/11;KL 位置是工程约定
GRPO min(r·Â, clip(r,1−ε,1+ε)·Â) − βDKL (Ri−mean)/std,整条共享 概率比 clip loss 独立项,β=0.04 (1/G)Σ(1/|oi|)Σt 论文 Eq.3/4
DAPO min(r·Â, clip(r,1−εlow,1+εhigh)·Â) GRPO 组内优势 非对称 clip,0.2 / 0.28 移除(§2.3) (1/Σi|oi|)ΣiΣt 论文 Eq.10–13
CISPO sg(clip(r,1−εlowIS,1+εhighIS))·Â·log π GRPO 组内优势 裁 IS 权重并停梯度 无(§3.1) token 级 论文 §3.1 Eq.4/5
SAPO σ(τ(r−1))·(4/τ)·Â GRPO 组内优势 平滑门控,τpos/τneg Eq.5 无 KL 项 (1/G)Σ(1/|yi|)Σt 论文 §3 Eq.5/6
SAO f(r)·Â·log π,区间外 f=0 critic + skip-observation GAE 双侧 token mask 正文未列 KL 项 token 级 论文 §3.1 Eq.1–5
OPD E[(1/|y|)ΣtD(πθ,ν)] teacher 分布,不是 Â 无 PPO clip 文档建议多数情况关闭 ref KL token 平均 1/|y| verl 文档;笔记简称,原始出处待核

注:逐行按各文公式转录;OPD 一行来自 verl 文档,不是论文 Eq。

04

组内优势、长度归一化、KL 位置:三本账决定行为

目标函数只写了“怎么更新”;这一节把三个最容易被忽略的账本拆开:Â 的统计量、长度的权重、KL 的位置。

4.1 优势账本:组内均值/标准差,还是 critic 的逐 token 估计

GRPO 的 Â 是组内标准化:Âi = (Ri − mean(R)) / std(R)。它把“这一条比同组平均好多少”压成一个标量,然后复制给整条回答的所有 token。 这样做的好处是不需要 critic;代价是同一回答里所有 token 共享一个数,且组内奖励没有差异时 Â 为 0。

DAPO 的动态采样把“Â 为 0”的组直接过滤掉;SAO 则因为 group size 1,根本不用组内基线,改用 critic + GAE。CISPO 和 SAPO 沿用 GRPO 的组内优势,只是改了信任域;OPD 没有 Â,监督信号是 teacher 的分布。

方法Â 的估计组规模 / 采样零方差组怎么处理出处
PPOcritic + GAE,逐 token一条轨迹;可多 epoch无组概念Eq.7/11
GRPO(Ri−mean)/stdG=64(DeepSeekMath)没有专门处理;全同组梯度为 0§4.1/§4.2
DAPO同 GRPO每个 prompt 16 条回答动态采样过滤全对/全错§3.2/§4.1
SAOcritic + skip-observation GAEgroup size 1不适用(没有组)§3.1–3.2
CISPOGRPO 组内优势正文未给具体 G借用 DAPO 动态采样§3.1
SAPOGRPO 组内优势公式含 G,正文未给具体值正文未展开§3 Eq.5
OPDteacher 分布,不是 Â无组不适用verl 文档

本页表 3(整理表):组规模均按各文正文能查到的设置填写;“未给”表示正文没有写出具体数值,不是断言论文没有做实验。

标准差的除数是第二个容易踩的坑。GRPO 论文的公式只写 std(r),没有在正文区分 ÷G 与 ÷(G−1);本页模拟统一用 ÷G。 在 G=4、奖励 [1,0,1,0] 时,÷G 得到 0.500,÷(G−1) 得到 0.577;Â 会从 ±1.000 变成 ±0.866。复现时先对齐分母,再比较结果。

4.2 长度账本:样本级 vs token 级,权重差多少

GRPO 的 Eq.3 是样本级归约:先在每条回答内部对 token 取平均,再对 G 条回答取平均。DAPO 的 Eq.12 是 token 级归约:所有回答的所有 token 一起求和,再除以总 token 数。 两条公式都合法,但对长短回答的权重不同。

归约公式两条回答(长度 2 / 6)的总权重每个 token 的权重
样本级(GRPO)(1/G)Σi(1/|oi|)Σt各 1/2 = 0.500短回答 1/2 × 1/2 = 0.250;长回答 1/2 × 1/6 = 0.083
token 级(DAPO)(1/Σi|oi|)ΣiΣt2/8 = 0.250;6/8 = 0.750每条 token 都是 1/8 = 0.125

本页表 4(整理表):G=2、长度 2 与 6 的玩具设定;权重由两条公式直接算出,不是论文实验数字。

两种归约下的权重

简化模拟:只比较两条回答的权重,不计算 advantage、reward 或梯度;假设两条回答长度固定、没有截断。 未覆盖:G>2、变长 batch、padding/EOS mask、overlong reward shaping。

手算 B:G=8 的组内统计与长度权重 与交互 1/2 同参数逐位一致(三位小数)

组内统计。奖励 [1,0,1,1,0,0,1,0],G=8。均值 4/8 = 0.500;每个奖励与均值相差 ±0.5,总体方差 8×(0.5)²/8 = 0.25,总体标准差 1/2 = 0.500。样本 0 的 Â = (1−0.5)/0.5 = +1.000。

长度权重。取 L1=2、L2=6,总 token 数 2+6=8。样本级:每条回答总权重 1/2 = 0.500。token 级:回答 1 2/8 = 0.250,回答 2 6/8 = 0.750;长回答拿到短回答的 0.750/0.250 = 3.000 倍权重。

这就是“长度偏差”的算术来源:token 级归约并不是“更公平”,它把总权重按 token 数分配;样本级归约则是每条回答一份。哪个更好取决于任务:长 CoT 里长回答的 token 也需要被惩罚或奖励,token 级更合适;如果长回答只是重复啰嗦,token 级会放大它的影响,需要 overlong shaping 或过滤配合。

DAPO 的 overlong shaping 只处理“超过 Lmax−Lcache”的部分:Lmax=16384、Lcache=4096,因此 16384−4096=12288 以内不罚,12288–16384 线性罚,超过 16384 固定罚 −1。 它解决的是“截断样本被错误罚分”的噪声,不是“所有长回答都该短”的偏好;长度偏置仍然由归约方式和 reward 决定。

4.3 KL 账本:同一个系数,放在 reward 和 loss 里不是一回事

本页表 5:KL 位置账本,以及它对 Â 的影响。

方法KL 位置系数 / 设置对 Â 的影响出处
PPO + RLHFreward shapingrt = rφ − β log(πθ/πref)Â 里已含 KLDeepSeekMath Eq.2
GRPOloss 独立项β=0.04Â 只含任务奖励,KL 不进 ÂEq.3/4,§4.2
DAPO移除—Â 只含任务奖励§2.3
CISPO无—Â 只含任务奖励§3.1
SAPOEq.5 无 KL 项—Â 只含任务奖励§3 Eq.5
SAO正文未列 KL 项—Â 来自 critic§3.1
OPD文档建议多数情况关闭 ref KL—监督来自 teacher 分布verl 文档

注:KL 的位置按各文公式/正文填写;“无”表示该方法的目标函数没有 KL 项,不是“KL 一定不需要”。

为什么位置重要?因为  是策略梯度的系数。KL 在 reward 里时, 已经包含“离参考模型多远”的惩罚,clip 之后仍然带着它;KL 在 loss 里时, 只反映任务奖励,KL 单独加在目标上。 这两种写法在数学上都可以成立,但梯度的量纲、系数 β 的最优值、以及“clip 裁的是任务优势还是任务+KL 优势”都不同。跨论文比较时,先看 KL 在哪,再看数字。

05

一次迭代的数据流:rollout 先进组,再进 clip

把公式放回一次训练迭代:采样、打分、算优势、更新。GRPO/DAPO 在“组”上分叉,PPO/SAO 在“critic”上分叉,OPD 在“监督信号”上分叉。

问题 q 同一 prompt G 条 rollout π_old 采样 reward 规则 / 模型 优势 Â 组内 / critic clip 更新 min(rÂ, clip·Â) G = 64 / 16 / 1 按论文设置 GRPO / DAPO 组内相对 PPO / SAO critic + GAE μ 次更新 新一批 rollout:旧策略快照 / rollout 引擎 log-prob
图:一次迭代的抽象数据流。覆盖 GRPO/DAPO 的组内优势、PPO/SAO 的 critic 优势、以及 Eq.7 的 clip 更新;不覆盖具体框架的 batch 组织、分布式采样、异步队列与旧策略快照实现。
Step 1

rollout:采样并记录 log-prob

GRPO/DAPO 对每个 prompt 采样 G 条回答;SAO 每个 prompt 一条,完成即送入训练;OPD 采样学生自己的轨迹。实现里通常由推理引擎生成 token,再由训练引擎重算 log-prob,因为两套引擎的数值不完全相同。

Step 2

reward:规则、模型或 teacher

DAPO 用最终答案的规则 verifier;PPO/RLHF 用 reward model;SAO 的在线实验用 LLM judge;OPD 不用 reward,teacher 给逐 token 分布。不同的 reward 决定不同的 reward hacking 风险。

Step 3

advantage:组内、critic 或 teacher

组内:(Ri−mean)/std;critic:V(s) + GAE;teacher:D(πθ,ν)。这一步决定“信用分配”的粒度:整条回答、逐 token,还是逐 token 分布。

Step 4

update:clip、mask 或 gate

PPO/GRPO/DAPO 裁概率比;CISPO 裁 IS 权重并停梯度;SAPO 用软门控;SAO 把区间外的 token 直接 mask;OPD 直接对分布散度反传或把它当 reward。一次 rollout 通常做 μ 次更新。

工程约定

这些不在论文 Eq 里,但会改变结果

  • 旧策略 log-prob:rollout 引擎与训练引擎的 log-prob 可能对不上;多轮更新时通常要保存 πθold 的 log-prob,或按快照重算。
  • 标准差分母:论文只写 std;实现可能用总体 ÷G 或无偏 ÷(G−1),G 小的时候差别明显。
  • clip 参数名:ε、ε_low/ε_high、clip_ratio_low/high 在不同框架里指同一件事,但默认值不一定相同。
  • loss 归约:样本级、token 级、batch 级分母不同;同一个“GRPO”在不同代码库里可能是不同的长度加权。
06

同一模型同一基准才有可比性:把论文数字放回各自的条件

下面只做并列,不做跨论文排名。模型、数据、解码、评测次数不同的数字,不能相加,也不能说“谁比谁高多少”。

6.1 可转录的实测数字

方法模型数据 / 设定基准(口径)数值原文位置
GRPODeepSeekMath-RL 7BGSM8K + MATH 的 CoT 数据GSM8K 准确率88.2%Table 5
GRPODeepSeekMath-RL 7B同上MATH 准确率51.7%Table 5
DAPOQwen2.5-32BDAPO-Math-17KAIME 2024 avg@3250DAPO Table 1
SAOQwen3-30B-A3B-Thinking-2507TIR SFT 初始化AIME2025 Pass@197.3SAO Table 1
SAO同上同上BeyondAIME Pass@174.8SAO Table 1
SAO同上OpenHands,最多 300 轮SWE-Bench Verified29.8SAO Table 2

本页表 6:数字逐格转录自原文;GRPO 的两行来自同一张 Table 5,DAPO 来自 Table 1,SAO 来自 Table 1/2。不同行的模型与基准不同,不能跨行比较。

6.2 DAPO 的累加消融:每一步加了多少

配置(按 DAPO Table 1 的累加顺序)AIME 2024 avg@32相对上一行
DeepSeek-R1-Zero-Qwen-32B47—
Naive GRPO30—
+ Overlong Filtering36+6
+ Clip-Higher38+2
+ Soft Overlong Punishment41+3
+ Token-level Loss42+1
+ Dynamic Sampling(DAPO)50+8

本页表 7:转录自 DAPO Table 1。它是累加消融,不是逐项独立消融;“+8”是在已有五项之上的边际,不是动态采样单独的因果效应。DAPO 比 R1-Zero-Qwen-32B 高 3 个百分点,同时只用了后者 50% 的训练步数。

这张表最容易被误读的地方是“token-level loss 只涨 1 分”。DAPO §3.3 明确说它对分数的贡献较小,但让训练更稳、长度增长更健康;只看 AIME 分数会漏掉它的作用。 同样,动态采样的 +8 是在特定累加顺序下的结果,而且它增加了采样量;论文 §3.2 说该策略不一定会拖慢训练,§4.2 报告整体训练时间没有明显变差,因为生成阶段本来就被长尾样本主导。

6.3 SAO 的消融:单 rollout 之外,value model 的改动各值多少

变体AIME2025BeyondAIME与 SAO 的差
SAO97.374.8—
w/o Faster value95.069.8−2.3 / −5.0
w/o Frozen attention90.674.5−6.7 / −0.3
Vanilla VAPO(w/o DIS)91.369.0—
Running mean baseline79.855.3—

本页表 8:转录自 SAO Table 4(另见 SAO Table 3)。差值为 SAO 减该变体:AIME 上 frozen-attention 的缺口为 6.7 个百分点,BeyondAIME 上 faster-value 的缺口为 5.0 个百分点(表中 Running mean 的缺口更大,不能把这两项读成全表最大)。

SAO 的结论不是“单 rollout 一定更好”,而是“单 rollout + DIS + 更强的 value model”这一组一起才成立。SAO Table 1 里 SAO 为 97.3,仅加 DIS 的 SAO 为 94.2,GRPO+DIS 为 93.5;单 rollout 本身没有带来这 3.1 个百分点的差距(97.3 − 94.2),value model 的训练方式才是后半段的分水岭(推断)。 论文还报告标准 GRPO 在约 160 步崩溃,SAO 稳定训练约 1000 步;vanilla VAPO 在约 90 步崩溃。

6.4 只给曲线、没有可转录分数的结果

方法论文报告可核位置
CISPO相同训练步数下优于 GRPO / DAPO;用 50% 步数追平 DAPO;引言(§1)称 2× 加速§3.1(50%)、§1(2×),Figure 2
SAPO训练更稳、最终 Pass@1 更高;Qwen3-VL 上四个基准都报告提升§5.1 Figure 4;§5.2 Figure 6
OPD文档给损失、GKD/PG 两种模式和配置,不给基准数字verl OPD 文档

本页表 9:这三项的可比受控结果在原文/文档中没有可直接转录的最终分数(CISPO 的最终模型分数见 MiniMax-M1 Table 2,但不属于同一受控对比);页面不把二手博客的数字补进来。

把三组结果放在一起看,能说的只有:DAPO 在 Qwen2.5-32B / AIME 2024 上从 30 到 50;SAO 在 Qwen3-30B-A3B / AIME2025 上到 97.3;GRPO 在 DeepSeekMath 7B / GSM8K 上到 88.2%。 不能把不同模型、数据、基准、评测次数下的分数直接相减。跨论文比较只能比机制,不能比分数。

07

这些方法各自解决一段,不是一条单向升级链

边界按五个维度看:reward hacking、长度偏差、group size、离线/在线、实现差异。每一条都决定“这个方法在你的场景里是否成立”。

边界一

Reward hacking:规则奖励不是免疫,只是换了攻击面

DAPO §2.4 明确说 reward model 容易 reward hacking,所以改用可验证任务的最终答案正确性作为 reward。规则 verifier 降低了“模型讨好 reward model”的风险,但没有消除“模型钻规则漏洞”的风险:格式、答案等价判定、截断处理都可能被利用(推断)。 SAO 的在线实验用 LLM judge 打 style reward,这类 judge 本身可以被优化;OPD 用 teacher 分布,teacher 的错误会被学生模仿。三种监督信号的 hacking 面不同,不能互相替代(推断)。

边界二

长度偏差:token 级不是“更公平”,只是换了权重

GRPO 的样本级归约给每条回答相同总权重,短回答的每个 token 权重更大;DAPO 的 token 级归约给每个 token 相同权重,长回答的总权重更大。 哪个更合适取决于任务:长 CoT 里长回答的 token 也需要被学习,token 级更自然;但如果长回答只是重复,token 级会放大噪声。 DAPO 的 overlong shaping 只处理超过 Lmax−Lcache 的样本,不改变预算内的长度偏好;它不能替代对 reward 和归约方式的设计。

边界三

Group size:G 越大基线越稳,采样越贵

GRPO 的 G=64 是 DeepSeekMath 的设置;DAPO 每个 prompt 16 条回答;SAO 直接把 G 降到 1。G 越大,组内均值的方差越小,但 rollout 成本线性增加;G 越小,优势噪声越大,SAO 因此需要 critic 和更强的 value model 来补(推断)。 动态采样还会额外增加采样量:它要一直采到 batch 里全是“非全对非全错”的组。论文说整体训练时间没有明显变差,但这是在其同步系统和长尾生成特征下的结论,不是所有系统都成立(推断)。

边界四

离线/在线:异步省等待,但引入 policy lag

GRPO/DAPO 的组内比较假设同一组的 rollout 来自相近的策略;异步训练里,一条轨迹可能横跨多次策略更新,组内策略漂移会让 Â 失真。SAO 的 DIS 直接用 rollout 引擎的 log-prob 当行为策略,不再追踪 πθold,并用双侧 mask 把偏离太远的 token 整段去掉。 代价是它接受一定的 off-policy 偏差;论文说这是“controlled degree of off-policy bias”,不是无偏估计。

边界五

实现差异:同一个名字,可能不是同一张目标函数

标准差用 ÷G 还是 ÷(G−1)、KL 放 reward 还是 loss、loss 用样本级还是 token 级、旧策略 log-prob 是保存还是重算——这些都不在论文的 Eq 里,但会改变梯度。 本页的模拟只覆盖 Eq.3 的组内标准化和 Eq.7 的 min/clip 算术;不覆盖真实 token 级 ratio、KL、动态采样、多轮更新和分布式实现。把页面里的数字当成“公式算术”,不要当成“复现实验”。

什么时候别用:先问四个问题

一句话总结:这个家族不是“PPO → GRPO → DAPO → SAO”的版本号序列。 PPO 买的是逐 token 信用,GRPO 省掉 critic 但把信用压成组内标量,DAPO 拆开 clip/采样/长度,CISPO 和 SAPO 改信任域的形状,SAO 改采样方式并把 critic 请回来,OPD 改监督信号。 选型时先看你的瓶颈是哪一本账:优势、长度、KL,还是 rollout 吞吐。