GRPO
为了干掉 Critic 网络,也就是 $V$ 网络,换成直接使用 Actor 网络多次采样代替。
GRPO 采用 PPO 的变体类似的组合建模问题:
$$\begin{aligned} J(\theta) &= \sum_{g = 1}^G \left[\frac 1 {T_g} \sum_{t = 0}^{T_g}\min \left\{ r_t A_{g, t}, {\rm clip}\left(r_t, 1 - \epsilon, 1 + \epsilon\right) A_{g, t} \right\} - \beta D_{KL}(\pi_\theta \| \pi_{ref}) \right] \end{aligned} $$
其中 $G$ 是采样的组,$r_t = \frac {\pi_{\hat \theta}(a_{g, t} | s_t)}{\pi_{\theta}(a_{g, t} | s_t)}$,$A_g$ 也就是组内的优势函数:
$$A_g = \frac {r_g - \bar r}{{\rm std}\{r_g\}} $$
换句话来说,也就是将 Critic 计算 $V(s_t)$ 的过程,变成采样 $G$ 个答案,然后对于分数取平均,得到相对优势。
DAPO
在 GRPO 的基础上,进行了这样的优化。
提高 $1 + \epsilon$
这是源于这样一个情况:如果说不小心采样到了一个小概率的答案,但是答案却是非常好的,此时,由重要性采样,其权重就会很低,导致优势变得很小,难以学习到该答案。所以独立设置 $1 - \epsilon_{low}$ 和 $1 + \epsilon_{high}$动态采样
模型在前后期的情况下,可能回答全错/全对,导致组内优势全部为 0,从而导致无效训练。
这里的 trick 就是一直采样直到出现至少一对评分有区别的答案。token 平均
注意看 GRPO 的优势,是对于每一个回答进行 Token 级别的平均。但是这样导致了长回答的优势被稀疏化。所以这里采用全部采样级别的平均,换句话来说,也就是删除了 $\frac 1 {T_g}$ 这一个平均的系数作为损失。过长惩罚
太长的东西也令人痛苦。所以当回答超过一定长度后,对 token 进行惩罚,约长惩罚越高。
GSPO
这一框架的提出动机源于以下事实:在MoE架构训练期间,GRPO 的重要性采样引入了大的方差和不稳定性。GSPO 的核心思想是减少在奖励处理过程中对 token 级优化的依赖,同时更加强调整体序列结果。
| 场景 | 选谁 | 原因 |
|---|---|---|
| 数学推理 / 代码生成(答案可验证) | GRPO/GSPO | 奖励稀疏且二元,组内相对优势足够;省 Critic 显存用于更大 batch。 |
| 传统 RLHF(人类偏好,连续奖励) | PPO | 需要 Critic 建模复杂偏好面,GRPO 的组内标准化会丢失细粒度信号。 |
| MoE LLM / 异构 Agent | GSPO/HACPO | Token-level IS 在 MoE 中因 expert 切换而崩溃,必须 sequence-level。 |
| 边缘设备 / 显存受限 | GRPO | 单网络即可训练,我的 5070Ti 跑 7B 模型时显存瓶颈显著。 |
| 机器人控制 / 游戏 AI | PPO | 状态连续、奖励稠密,Critic 的价值估计对稳定探索至关重要。 |