大模型对齐算法(四): DAPO,VAPO,GMPO,GSPO, CISPO,GFPO
DAPO
DAPO 在 GRPO 的基础上做了 4 处关键升级,既保持 GRPO 的“无价值函数 + 组内归一化”思想,又通过 剪枝、采样、Token 级梯度、长度惩罚 解决长 Chain-of-Thought RL 的四大痛点。
1 剪枝范围解耦:Clip-Higher
GRPO:单一对称剪枝
min(rt(θ)A^t,clip(rt(θ),1−ε,1+ε)A^t)\min\!\Bigl(r_t(\theta)\hat A_t,\; \mathrm{clip}(r_t(\theta),\,1-\varepsilon,\,1+\varepsilon)\,\hat A_t\Bigr)min(rt(θ)A^t,clip(rt(θ),1−ε,1+ε)A^t)
DAPO:将上下界拆成 ε_low, ε_high
min(rt(θ)A^t,clip(rt(θ),1−εlow,1+εhigh)A^t)\min\!\Bigl(r_t(\theta)\hat A_t,\; \mathrm{clip}(r_t(\theta),\,1-\varepsilon_{\text{low}},\,1+\varepsilon_{\text{high}})\,\hat A_t\Bigr)min(rt(θ)A^t,clip(rt(θ),1−εlow,1+εhigh)A^t)
其中
εhigh>εlow\varepsilon_{\text{high}}>\varepsilon_{\text{low}}εhigh>εlow
→ 给低概率 “探索 token” 更大的上升空间,防止 熵崩溃。
2 动态采样:Dynamic Sampling
GRPO:固定 batch,遇到全对 / 全错 prompt → 梯度为零。
DAPO:在采样阶段 过滤掉 reward=±1 的 prompt,直到 batch 内所有 prompt 均有 有效梯度。
约束加入目标:
0<∣{oi∣is_equivalent(a,oi)}∣<G0<|\{o_i \mid \text{is\_equivalent}(a,o_i)\}|<G0<∣{oi∣is_equivalent(a,oi)}∣<G
3 Token-Level Policy Gradient
GRPO:先对 样本内 token 求平均,再跨样本平均。
DAPO:直接对 token 级 loss 求和,避免长回答权重稀释:
JDAPO(θ)=E(q,a)∼D,{oi}i=1G∼πθold[1∑i=1G∣oi∣∑i=1G∑t=1∣oi∣min(ri,t(θ)A^i,t,clip(ri,t(θ),1−εlow,1+εhigh)A^i,t)]J_{\text{DAPO}}(\theta)= \mathbb{E}_{(q,a)\sim\mathcal D,\{o_i\}_{i=1}^{G}\sim\pi_{\theta_{\text{old}}}} \left[ \frac{1}{\sum_{i=1}^{G}|o_i|}\sum_{i=1}^{G} \sum_{t=1}^{|o_i|} \min\!\Bigl( r_{i,t}(\theta)\hat A_{i,t},\, \mathrm{clip}(r_{i,t}(\theta),\,1-\varepsilon_{\text{low}},\,1+\varepsilon_{\text{high}})\,\hat A_{i,t} \Bigr) \right]JDAPO(θ)=E(q,a)∼D,{oi}i=1G∼πθold[∑i=1G∣oi∣1∑i=1G∑t=1∣oi∣min(ri,t(θ)A^i,t,clip(ri,t(θ),1−εlow,1+εhigh)A^i,t)]
4 长度惩罚:Overlong Reward Shaping
GRPO:截断回答直接给惩罚 −1。
DAPO:引入 Soft Overlong Punishment(长度感知)
Rlength(y)={0,∣y∣≤Lmax−Lcache(Lmax−Lcache)−∣y∣Lcache,Lmax−Lcache<∣y∣≤Lmax−1,∣y∣>LmaxR_{\text{length}}(y)= \begin{cases} 0, & |y|\le L_{\max}-L_{\text{cache}}\\[4pt] \frac{(L_{\max}-L_{\text{cache}})-|y|}{L_{\text{cache}}}, & L_{\max}-L_{\text{cache}}<|y|\le L_{\max}\\[4pt] -1, & |y|>L_{\max} \end{cases}Rlength(y)=⎩⎨⎧0,Lcache(Lmax−Lcache)−∣y∣,−1,∣y∣≤Lmax−LcacheLmax−Lcache<∣y∣≤Lmax∣y∣>Lmax
最终奖励
Rtotal(y)=Rrule(y)+Rlength(y)R_{\text{total}}(y)=R_{\text{rule}}(y)+R_{\text{length}}(y)Rtotal(y)=Rrule(y)+Rlength(y)
5 总结公式(DAPO 完整目标)
JDAPO(θ)=E(q,a)∼D,{oi}i=1G∼πθold[1∑i=1G∣oi∣∑i=1G∑t=1∣oi∣min(ri,t(θ)A^i,t,clip(ri,t(θ),1−εlow,1+εhigh)A^i,t)]s.t.0<∣{oi∣is_equivalent(a,oi)}∣<G,ri,t(θ)=πθ(oi,t∣q,oi,<t)πθold(oi,t∣q,oi,<t)A^i,t=Ri−μσ,Ri=Rrule(oi)+Rlength(oi)\boxed{ \begin{aligned} J_{\text{DAPO}}(\theta)= \mathbb{E}_{(q,a)\sim\mathcal D,\{o_i\}_{i=1}^{G}\sim\pi_{\theta_{\text{old}}}} \Bigg[ &\frac{1}{\sum_{i=1}^G|o_i|}\sum_{i=1}^{G} \sum_{t=1}^{|o_i|} \min\!\Bigl( r_{i,t}(\theta)\hat A_{i,t},\, \mathrm{clip}\bigl(r_{i,t}(\theta),\,1-\varepsilon_{\text{low}},\,1+\varepsilon_{\text{high}}\bigr)\hat A_{i,t} \Bigr) \Bigg]\\[2pt] \text{s.t.}\quad &0<|\{o_i \mid \text{is\_equivalent}(a,o_i)\}|<G,\quad r_{i,t}(\theta)=\frac{\pi_\theta(o_{i,t}\mid q,o_{i,<t})}{\pi_{\theta_{\text{old}}}(o_{i,t}\mid q,o_{i,<t})}\\[2pt] &\hat A_{i,t}=\frac{R_i-\mu}{\sigma},\quad R_i=R_{\text{rule}}(o_i)+R_{\text{length}}(o_i) \end{aligned} }JDAPO(θ)=E(q,a)∼D,{oi}i=1G∼πθold[s.t.∑i=1G∣oi∣1i=1∑Gt=1∑∣oi∣min(ri,t(θ)A^i,t,clip(ri,t(θ),1−εlow,1+εhigh)A^i,t)]0<∣{oi∣is_equivalent(a,oi)}∣<G,ri,t(θ)=πθold(oi,t∣q,oi,<t)πθ(oi,t∣q,oi,<t)A^i,t=σRi−μ,Ri=Rrule(oi)+Rlength(oi)
6 一句话总结
DAPO = GRPO
- Clip-Higher(解决熵塌陷)
- Dynamic Sampling(解决零梯度)
- Token-Level Loss(解决长回答稀释)
- Soft Length Penalty(解决截断噪声)
→ AIME 50 分,仅用 50% 训练步数。
VAPO
VC-PPO + DAPO
VC-PPO
value pretraining
1. 背景知识
- Reward模型:在强化学习中,reward模型通常只在**最后一个token(即EOS token)**处给出评分,前面的token是没有奖励信号的。
- Value模型:Value模型的作用是估计每个token位置的期望回报(即未来能获得的奖励总和)。
- 热启(warm start):通常会用reward模型的参数来初始化value模型,因为两者都是输出一个标量值。
2. 问题分析
- Reward模型的训练目标:reward模型只在EOS token处训练,因此它学会的是:
- EOS token处的值是合理的(接近真实奖励)。
- EOS token之前的token的值是未训练的,通常会被模型默认赋予较小的值(因为训练时这些位置的值没有约束,模型倾向于输出较小的值)。
- Value模型的初始化:如果用reward模型的参数来初始化value模型,那么:
- EOS token处的value初始值是合理的(因为reward模型在此处训练过)。
- EOS token之前的token的value初始值会偏小(因为reward模型在这些位置的输出是未训练的,倾向于小值)。
3. 后果
- Value偏小导致的问题:
- 在强化学习中,**advantage(优势函数)**的计算依赖于value的估计:
[
A_t = r_t + V(s_{t+1}) - V(s_t)
] - 如果靠前的token的value初始值偏小,那么( V(s_t) )会偏小,导致advantage ( A_t )偏大(因为减去的( V(s_t) )偏小)。
- 这会让模型误以为靠前的token“很好”,从而倾向于生成更短的序列(因为靠前的token被高估了,模型会提前结束序列以获得更高的advantage)。
- 在强化学习中,**advantage(优势函数)**的计算依赖于value的估计:
4. 直观理解
- 比喻:想象你在玩一个游戏,游戏结束时才给你奖励。但你的“价值预测器”一开始被初始化得很奇怪:
- 游戏结束时,它能准确预测奖励(比如100分)。
- 游戏开始时,它却预测价值很低(比如0分)。
- 后果:你会觉得“游戏开始时的价值很低,但下一步突然变高了”,于是你会倾向于“提前结束游戏”来获得这个“突然变高”的优势。这就是模型倾向于生成短序列的原因。
5. 总结
- 核心原因:reward模型只在EOS token处训练,导致EOS之前的token的value初始值偏小。
- 后果:靠前的token的advantage被高估,模型倾向于提前结束序列,导致生成短序列(无法生成长CoT)。
这就是为什么论文中提出value pretraining(提前用离线数据训练value模型),来避免这种初始化偏差。
一些思考:
论文其实没有真正从细节说明为啥value和advantage在eos附近断崖式drop的现象消失了
1. 价值预训练的目标值
论文原文(§3.2 第 4–5 段):
“Continuously generate responses by sampling from a fixed policy … update the value model using GAE with λ = 1.0, also known as the Monte-Carlo return.”
…
“Train the value model until key training metrics, including value loss and explained variance, attain sufficiently low values.”
也就是说,作者只说了“用 λ=1.0 的 MC return 当目标”,没有解释网络怎么保证前缀 token 不塌缩到同一个常数。
2. 训练曲线
论文图 6 给了 value-loss 的两段式下降,但没有给出 value 随 token 位置变化的曲线
decouple GAE
论文中提出的 Decoupled-GAE(解耦广义优势估计) 指的是:
在强化学习训练过程中,将价值模型(critic)和策略模型(actor)在计算广义优势估计(GAE)时使用的λ参数进行解耦,分别独立设置,以解决长链式思考(long-CoT)任务中价值估计的偏差和策略更新的方差问题。
具体而言:
-
价值模型(critic):
使用较大的λ值(论文中设为 λ=1.0),以保证奖励信号在长序列中无衰减地传播,从而避免价值估计的偏差(bias),实现更准确的价值估计。 -
策略模型(actor):
使用较小的λ值(论文中设为 λ=0.95),以降低策略梯度估计的方差(variance),加速策略收敛,提升训练稳定性。
通过这种方式,Decoupled-GAE 实现了:
-
价值模型的无偏更新:
通过λ=1.0的蒙特卡洛回报(Monte-Carlo return),确保价值估计准确,避免奖励信号衰减。 -
策略模型的稳定高效更新:
通过λ=0.95降低方差,避免策略更新过程中的震荡或不稳定,提升训练效率和稳定性。
简而言之,Decoupled-GAE 就是一种在强化学习训练过程中,分别为价值模型和策略模型设置不同λ参数的策略,以兼顾价值估计的准确性和策略更新的稳定性,特别适用于长链式思考(long-CoT)任务。
GMPO
https://zhuanlan.zhihu.com/p/1934575387687490603
GSPO
https://blog.csdn.net/weixin_36378508/article/details/150395944
CISPO
https://blog.csdn.net/weixin_36378508/article/details/150395944
GFPO
https://zhuanlan.zhihu.com/p/1939843423994610732
把大象放进冰箱需要三步,把 LLM 训练成奥数冠军却需要五步:GRPO → GMPO → GSPO → CISPO → GFPO。
本文一次讲清每个字母背后的动机、公式差异与实战效果,并给出一张“对照速查表”,让你 5 分钟就能选对自己任务的算法。
0. 开场白:为什么大家集体“卷”GRPO?
2024 年开始,大模型后训练出现一条清晰技术路线:
- 冷启动 SFT →
- 在线 RL(可验证奖励) →
- 推理时 scaling(长 CoT)。
在线 RL 的核心矛盾是:不要价值模型,还要稳定训练。
于是 DeepSeek 提出 GRPO(Group Relative Policy Optimization):
- 把价值网络扔掉,省 50 % 显存;
- 用“同 prompt 多条回答”做组内相对奖励,简单有效。
但很快,社区发现 GRPO 有三宗罪:
罪名 | 现象 | 根因 |
---|---|---|
长度偏差 | 正确答案越来越短,错误答案越来越长 | 算术平均 + token 归一化 |
离群值爆炸 | 几个 token 的权重把策略拉飞 | 算术平均对极端值敏感 |
MoE 不稳定 | 专家路由一变,token 级权重全乱 | token 级重要性采样 |
接下来的一年,就是“打补丁”的一年——GMPO、GSPO、CISPO、GFPO 接连登场。
1. GRPO:把“价值网络”扔进历史的垃圾桶
-
核心公式
LGRPO=1G∑i=1G1∣oi∣∑t=1∣oi∣min(ρi,tA^i,clip(ρi,t,1−ϵ,1+ϵ)A^i)\mathcal L_{\text{GRPO}}=\frac{1}{G}\sum_{i=1}^{G}\frac{1}{|o_i|}\sum_{t=1}^{|o_i|} \min\!\Bigl(\rho_{i,t}\hat A_i,\ \text{clip}(\rho_{i,t},1\!-\!\epsilon,1\!+\!\epsilon)\hat A_i\Bigr)LGRPO=G1i=1∑G∣oi∣1t=1∑∣oi∣min(ρi,tA^i, clip(ρi,t,1−ϵ,1+ϵ)A^i)
其中- (G):组内样本数
- (ρi,t\rho_{i,t}ρi,t=πθ/πold\pi_\theta/\pi_{\text{old}}πθ/πold):token 级概率比
- (A^i\hat A_iA^i):序列级相对优势(组内标准化)
-
一句话总结
“token 级裁剪 + 算术平均” → 省价值模型,但易震荡。
2. GMPO:把“算术平均”换成“几何平均”
-
痛点
GRPO 的算术平均对离群 token 太敏感,训练曲线像过山车。 -
补丁
几何平均天然把极端值压到地板。
核心改动只是把公式里的“平均”换成“几何平均”:LGMPO=1G∑i=1G(∏t=1∣oi∣ρi,t1∣oi∣)A^i\mathcal L_{\text{GMPO}}=\frac{1}{G}\sum_{i=1}^{G} \left(\prod_{t=1}^{|o_i|}\rho_{i,t}^{\frac{1}{|o_i|}}\right)\hat A_i LGMPO=G1i=1∑Gt=1∏∣oi∣ρi,t∣oi∣1A^i
-
效果
同资源下 +4.1 % AIME24(DeepSeek-R1-Distill-7B),
还能把裁剪范围从 (0.8,1.2) 扩到 (e{-0.4},e{0.4}),探索更野。
3. GSPO:干脆把“token”扔掉,改成“序列”
-
痛点
token 级权重在长序列里累积方差 → 训练崩溃;
MoE 里路由一变,权重直接“量子隧穿”。 -
补丁
整句采样权重代替逐 token 权重:
si(θ)=exp(1∣oi∣∑t=1∣oi∣logρi,t)s_i(\theta)=\exp\!\Bigl(\frac{1}{|o_i|}\sum_{t=1}^{|o_i|}\log\rho_{i,t}\Bigr) si(θ)=exp(∣oi∣1t=1∑∣oi∣logρi,t)
整条序列共享同一个 (s_i) 进行裁剪,梯度一次性广播到所有 token。 -
效果
- 训练全程无崩溃,不再需要“routing replay”(MoE 稳定器)。
- 在 Qwen3-30B-A3B 上,同等计算量 AIME24↑2.3 %。
4. CISPO:别剪 token,剪“权重”
-
痛点
token 级裁剪把关键反思词(“Wait”、“Recheck”)直接剪没,长 CoT 断流。 -
补丁
保留所有 token,只裁剪重要性权重 IW:
IWclip=clip(IW,1−ϵ,1+ϵ)\text{IW}_{\text{clip}}=\text{clip}\!\bigl(\text{IW},\ 1-\epsilon,\ 1+\epsilon\bigr) IWclip=clip(IW, 1−ϵ, 1+ϵ) -
效果
- 关键 token 不再被误伤;
- 50 % 训练步数即可追平 DAPO 性能。
5. GFPO:给“组”再做个过滤
-
痛点(推测)
组内样本质量参差不齐,坏样本拖累梯度。 -
补丁(推测)
在 GSPO 基础上加一层 Group Filter:
用轻量 reward model 先给每条回答打分,
只保留 top-k 样本进入最终优化,
相当于“先筛后炼”。 -
效果(待官方报告)
6. 一张对照速查表
算法 | 优化粒度 | 平均方式 | 重要性权重 | 裁剪级别 | 是否用 value | 解决痛点 |
---|---|---|---|---|---|---|
GRPO | token | 算术 | token ρ | token | ❌ | 省 value,但易崩 |
GMPO | token | 几何 | token ρ | token | ❌ | 抗离群 |
GSPO | sequence | 算术 | 序列 s | sequence | ❌ | 抗长序列+MoE |
CISPO | token | 算术 | token ρ | 权重级 | ❌ | 保关键 token |
GFPO | sequence | 算术 | 序列 s | sequence | ❌ | 组内再过滤 |
7. 怎么选?
- 短回答 / 代码补全 → GMPO/CISPO(token 级仍有用)
- 长 CoT / MoE 大模型 → GSPO/GFPO(序列级更稳)
- 资源紧张 / 想先跑通 → GRPO(baseline 够用)
8. 尾巴
从 GRPO 到 GFPO,短短一年,我们看到了 “简化→稳定→再简化” 的螺旋上升:
扔掉价值网络 → 扔掉算术平均 → 扔掉 token 级权重 → 扔掉坏样本
每一步都在回答同一个问题:
如何在无价值模型的前提下,既省资源又训得稳?
答案或许还没写完,下一篇论文,也许就叫 “XFPO” 😉