mobile wallpaper 1
2667 字
7 分钟
RLHF algorithms, from PPO to DAPO
2026-06-07

PPO 论文链接
DPO 论文链接
GRPO 论文链接
DAPO 论文链接

Keywords:PPO、DPO、GRPO、DAPO、RLHF

PPO#

监督学习是在固定数据分布上进行函数拟合,而强化学习是在自己诱导的数据分布上优化奖励。
因此当策略改变,会导致数据分布发生变化,我们必须控制每次策略更新的幅度,这也是 RL 更难稳定的原因。
RL 的目标是最大化期望累积回报,公式可以表示为:

J(θ)=Eτπθ[R(τ)]J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta} \left[ R(\tau) \right]

由于目标中的期望依赖于由策略 πθ\pi_\theta 诱导的离散采样过程,由于其离散特性,无法直接通过标准反向传播优化,因此需要采用策略梯度方法

策略梯度方法通过对数似然技巧 (log-likelihood trick),将目标函数的梯度变换为:

θJ(θ)=Est,atπθ[θlogπθ(atst)A^t]\nabla_\theta J(\theta) = \mathbb{E}_{s_t,a_t \sim \pi_\theta} \left[ \nabla_\theta \log \pi_\theta(a_t|s_t)\, \hat{A}_t \right]

PPO 是基于 TRPO 的改进,TRPO 就是一种策略梯度方法,它的公式如下:

maximizeθE^t[πθ(atst)πθold(atst)A^t]\underset{\theta}{\text{maximize}} \quad \hat{\mathbb{E}}_t \left[ \frac{\pi_\theta(a_t | s_t)}{\pi_{\theta_{\text{old}}}(a_t | s_t)} \hat{A}_t \right]
subject toE^t[KL[πθold(st),πθ(st)]]δ\text{subject to} \quad \hat{\mathbb{E}}_t \left[ \text{KL}[\pi_{\theta_{\text{old}}}(\cdot | s_t), \pi_\theta(\cdot | s_t)] \right] \le \delta

TRPO 是对目标函数的梯度进行局部近似,并引入信任域 (Trust Region) 约束,通过限制新旧策略之间的 KL 散度,避免一次更新导致策略发生剧烈变化。但实际实现中需要运用二阶优化方法,带来了大量额外计算。

为了避免 TRPO 复杂的二阶优化,PPO 的作者提出了两种一阶优化版本:一种通过 Clip 机制限制更新幅度 (PPO-Clip),另一种通过 KL 惩罚约束新旧策略之间的差异 (PPO-Penalty),目标函数分别如下:

LCLIP(θ)=E^t[min(rt(θ)A^t,clip(rt(θ),1ϵ,1+ϵ)A^t)]L^{CLIP}(\theta) = \hat{\mathbb{E}}_t \left[ \min \left( r_t(\theta)\hat{A}_t, \text{clip}(r_t(\theta), 1 - \epsilon, 1 + \epsilon)\hat{A}_t \right) \right]
LKLPEN(θ)=E^t[rt(θ)A^tβKL[πθold(st),πθ(st)]]L^{KLPEN}(\theta) = \hat{\mathbb{E}}_t \left[ r_t(\theta) \hat{A}_t - \beta \text{KL}[\pi_{\theta_{\text{old}}}(\cdot|s_t), \pi_\theta(\cdot|s_t)] \right]

其中

rt(θ)=πθ(atst)πθold(atst)r_t(\theta)=\frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)}

实验发现,PPO-Clip 能够达到与 TRPO 相当甚至更好的性能,而 PPO-Penalty 变体虽然已经通过动态调整惩罚系数 β\beta 来避免超参数敏感问题,但整体表现仍不如 PPO-Clip,因此 PPO-Clip 后来被广泛采用。

for RLHF#

Image1 实际在 LLM 的 RLHF 训练中,PPO 通常会被扩展为由 Policy Model (Actor)、Reference Model、Reward Model 和 Value Model (Critic) 组成的训练框架,完整训练流程可以参考知乎链接,以下是我自己的概括和补充:

  • 先复制一份 SFT 之后的 Policy Model 作为 Reference Model,然后用人类偏好数据离线训练 Reward Model,这两个 Model 在接下来的训练过程中完全固定。
  • 对 Policy Model 进行采样得到一个 rollout batch,然后切分成多个 mini_batch,每次取一个出来用作梯度更新。
  • 对一次梯度更新,由 Reward Model 的结果和对比 Reference Model 计算出的 KL penalty,得到最终 reward,再以 Value Model 为 baseline 通过 GAE 得到 advantage。然后对 Policy Model 和 Value Model 进行梯度下降更新,重复多个 epoch 后再次采样,并更新 θold\theta_{old}

值得一提的是 GAE 的公式:

AtGAE(γ,λ)=l=0(γλ)lδt+lA_t^{GAE(\gamma,\lambda)} = \sum_{l=0}^{\infty} (\gamma\lambda)^l \delta_{t+l}

其中

δt=rt+γV(st+1)V(st)\delta_t = r_t + \gamma V(s_{t+1}) - V(s_t)

常用的参数大概是 γ=0.991.0\gamma=0.99\sim1.0λ0.95\lambda\approx0.95

DPO#

PPO 的缺点在于训练时需要同时维护四个模型,这带来了巨大的硬件门槛和训练成本,而 DPO 则选择了一条完全不同的路线。
DPO 完全舍弃了 Reward Model 和 Value Model,直接用偏好数据优化模型,无需在线采样,因此 DPO 更像是一种隐式的强化学习。 Image1 我们先回顾一下 RLHF 的优化目标:

maxπθExD,yπθ(yx)[rϕ(x,y)]βDKL[πθ(yx)πref(yx)]\max_{\pi_\theta} \mathbb{E}_{x \sim \mathcal{D}, y \sim \pi_\theta(y|x)} \left[ r_\phi(x, y) \right] - \beta \mathbb{D}_{\text{KL}} \left[ \pi_\theta(y|x) \parallel \pi_{\text{ref}}(y|x) \right]

DPO 对优化目标进行了数学推导,先将其转化为等价的求和形式:

yπ(yx)r(x,y)βyπ(yx)logπ(yx)πref(yx)\sum_y \pi(y|x) r(x,y) - \beta \sum_y \pi(y|x) \log \frac{\pi(y|x)}{\pi_{ref}(y|x)}

事实上经过运算可以直接表示出最优策略 πr(yx)\pi_r(y|x),对固定的 xxZ(x)Z(x) 可以视作归一化常数:

π(yx)=1Z(x)πref(yx)exp(1βr(x,y))\pi^*(y|x) = \frac{1}{Z(x)} \pi_{ref}(y|x) \exp\left(\frac{1}{\beta} r(x,y)\right)
Z(x)=yπref(yx)exp(1βr(x,y))Z(x) = \sum_y \pi_{ref}(y|x) \exp\left(\frac{1}{\beta} r(x,y)\right)

因此可以反推出奖励函数的公式:

r(x,y)=βlogπ(yx)πref(yx)+βlogZ(x)r(x,y) = \beta \log \frac{\pi^*(y|x)}{\pi_{ref}(y|x)} + \beta \log Z(x)

这也是 DPO 核心观点的来源,如果我们把策略模型本身看成隐式奖励模型,通过推广定义任意策略 πθ\pi_\theta 的隐式奖励:

rθ(x,y)=βlogπθ(yx)πref(yx)r_{\theta}(x,y) = \beta \log \frac{\pi_\theta(y|x)}{\pi_{\text{ref}}(y|x)}

那么我们就可以直接用偏好对训练策略模型:

LDPO(θ)=E(x,yw,yl)D[logσ(β(logπθ(ywx)πref(ywx)logπθ(ylx)πref(ylx)))].\mathcal{L}_{\text{DPO}}(\theta) = -\mathbb{E}_{(x,y_w,y_l)\sim \mathcal{D}} \left[ \log \sigma \Bigl( \beta \Bigl( \log \frac{\pi_\theta(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \log \frac{\pi_\theta(y_l|x)}{\pi_{\text{ref}}(y_l|x)} \Bigr) \Bigr) \right].

相比 PPO,DPO 不需要 Reward Model、Value Model 和在线采样过程,因此训练更加稳定,且计算成本更低,这让 DPO 成为了工业界的主流对齐方法。
不过 DPO 也有边界,因为是离线方法,无法在线探索出新的高质量行为。
而且 DPO 对数据噪声很敏感,因为它直接将偏好对作为训练信号,这对数据构造提出了较高要求。

GRPO#

GRPO 是基于 PPO 的改进,它去掉提供 baseline 以降低 advantage 估计的方差的 Value Model (Critic),直接从同一个 prompt 的一组回答中构造 baseline。 Image1 首先我们来看 GRPO 是如何计算 advantage:

A^i,t=A^i=rimean(r)std(r)=ri1Gj=1Grj1Gj=1G(rjmean(r))2+ϵ\hat{A}_{i,t} = \hat{A}_i = \frac{r_i - \text{mean}(\mathbf{r})}{\text{std}(\mathbf{r})} = \frac{r_i - \frac{1}{G}\sum_{j=1}^G r_j}{\sqrt{\frac{1}{G}\sum_{j=1}^G (r_j - \text{mean}(\mathbf{r}))^2 + \epsilon}}

不同于 PPO 的逐 token 计算 advantage (At=RtV(st)A_t=R_t−V(s_t)),GRPO 一个回答的所有 token 共用一个 advantage。
GRPO 的 baseline 是当前 prompt 生成的一组回答的组内平均奖励,而不是一个额外训练出来的 value function。

再看 GRPO 的目标函数:

JGRPO(θ)=E[qD,{oi}i=1Gπθold(q)]1Gi=1G1oit=1oi{min[πθ(oi,tq,oi,<t)πθold(oi,tq,oi,<t)A^i,t,clip(πθ(oi,tq,oi,<t)πθold(oi,tq,oi,<t),1ε,1+ε)A^i,t]βDKL(πθπref)}J_{GRPO}(\theta) = \mathbb{E} \left[ q \sim \mathcal{D}, \{o_i\}_{i=1}^G \sim \pi_{\theta_{old}}(\cdot|q) \right] \frac{1}{G} \sum_{i=1}^G \frac{1}{|o_i|} \sum_{t=1}^{|o_i|} \left\{ \min \left[ \frac{\pi_\theta(o_{i,t}|q, o_{i,<t})}{\pi_{\theta_{old}}(o_{i,t}|q, o_{i,<t})} \hat{A}_{i,t}, \text{clip} \left( \frac{\pi_\theta(o_{i,t}|q, o_{i,<t})}{\pi_{\theta_{old}}(o_{i,t}|q, o_{i,<t})}, 1-\varepsilon, 1+\varepsilon \right) \hat{A}_{i,t} \right] - \beta D_{KL}(\pi_\theta || \pi_{ref}) \right\}

可以理解成让策略在给定 prompt 下,把概率质量从低质量回答转移到高质量回答上。
需要注意的是 KL 散度正则化需要直接加在 Loss 上,防止污染对 A^i,t\hat{A}_{i,t} 的计算。并且在 KL 项的计算上用了无偏估计器,公式如下:

DKL(πθπref)=πref(oi,tq,oi,<t)πθ(oi,tq,oi,<t)logπref(oi,tq,oi,<t)πθ(oi,tq,oi,<t)1D_{KL}(\pi_\theta || \pi_{ref}) = \frac{\pi_{ref}(o_{i,t}|q, o_{i,<t})}{\pi_\theta(o_{i,t}|q, o_{i,<t})} - \log \frac{\pi_{ref}(o_{i,t}|q, o_{i,<t})}{\pi_\theta(o_{i,t}|q, o_{i,<t})} - 1

采用该无偏估计器是因为真实 KL 需要对整个词表进行期望计算,在大规模语言模型中无法直接精确求解,只能基于采样 token 进行近似。该形式仅依赖当前生成的 token 即可计算,同时保持对真实 KL 的无偏性,从而在不引入额外计算开销的情况下稳定约束策略更新幅度。

Insights#

GRPO 的论文中还提到了几个 insights,首先是范式的统一,它提出主流后训练方法对参数 θ\theta 的优化公式都可以表示为通用梯度公式:

θJA(θ)=E(q,o)D[1ot=1oGCA(q,o,t,πrf)θlogπθ(otq,o<t)]\nabla_\theta J_{\mathcal{A}}(\theta) = \mathbb{E}_{(q, o) \sim \mathcal{D}} \left[ \frac{1}{|o|} \sum_{t=1}^{|o|} \mathbf{GC}_{\mathcal{A}}(q, o, t, \pi_{rf}) \cdot \nabla_\theta \log \pi_\theta(o_t | q, o_{<t}) \right]

对于每个方法可以找到以下变量:

  • Data Source D\mathcal{D}:决定了训练数据的来源
  • Reward Function πrf\pi_{rf}:训练奖惩信号的提供者
  • Algorithm A\mathcal{A}:负责将数据和奖励转化为梯度系数 (Gradient Coefficient, GC\mathbf{GC}),它决定了对某个 token 概率进行放大或惩罚的力度

论文分析了基于这种统一范式的几种代表性方法,得到以下表格: Image1 我认为这种控制变量的视角会让研究的思路变得更清晰,是值得记录的内容。

第二个是关于强化学习的本质,论文对比了 Instruct 模型和 RL 模型在 GSM8K 和 MATH 数据集上的两组指标:Pass@K 和 Maj@K 准确率。 Image1 强化学习提升了 Maj@K 的性能,但对 Pass@K 的性能没有显著提升,这说明强化学习并没有提升模型的绝对数学推理能力,而是优化了模型的策略分布,使原本偶尔出现的正确推理路径成为高概率输出。

第三个是关于后续的优化方向,我们可以从之前提到的三个变量出发:

  • Data Source:不局限于在 SFT 数据集上训练,还可以引入域外问题;同时也可以引入更优的采样策略,如树搜索策略。
  • Reward Function:如何提升奖励模型在域外问题的泛化能力,如何让奖励模型能够表达自身的不确定性,如何更低成本更高效率建立高质量过程奖励模型,这些都是需要克服的痛点。
  • Algorithm:目前的强化学习都百分之百信任奖励信号,但是复杂的任务中奖励任务必然存在噪声,因此可能需要能抵御噪声奖励的鲁棒 RL 算法。

DAPO#

GRPO 算法相比 PPO 大幅降低了显存消耗,且更适合数学、代码等可验证任务,不过在训练过程中存在一些瓶颈,DAPO 在 GRPO 的基础上,进行了一些优化。 首先关注 DAPO 的目标函数和约束条件:

JDAPO(θ)=E(q,a)D,{oi}i=1Gπθold(q)[1i=1Goii=1Gt=1oimin(ri,t(θ)A^i,t,clip(ri,t(θ),1ϵlow,1+ϵhigh)A^i,t)]\mathcal{J}_{DAPO}(\theta)=\mathbb{E}_{(q,a)\sim\mathcal{D},\{o_{i}\}_{i=1}^{G}\sim\pi_{\theta_{old}}(\cdot|q)} \left[ \frac{1}{\sum_{i=1}^{G}|o_{i}|}\sum_{i=1}^{G}\sum_{t=1}^{|o_{i}|}\min\left(r_{i,t}(\theta)\hat{A}_{i,t},\text{clip}(r_{i,t}(\theta),1-\epsilon_{low},1+\epsilon_{high})\hat{A}_{i,t}\right) \right]
subject to0<{oiis_equivalent(a,oi)}<G\text{subject to} \quad 0<|\{o_{i} \mid \text{is\_equivalent}(a,o_{i})\}|<G

根据上面的公式,可见主要的优化有以下四点。

Clip-Higher#

GRPO 使用的裁剪区间为 [1ϵ,1+ϵ][1-\epsilon,1+\epsilon],然而被上限裁剪的 token 大多数是低概率 token,这种裁剪会限制低概率成长性 token 的探索空间。
因此 DAPO 放宽了正方向的上界,可以参考目标函数的公式,其中ϵlow=0.2\epsilon_{low}=0.2ϵhigh=0.28\epsilon_{high}=0.28

Dynamic Sampling#

GRPO 在某些 prompt 下很容易采出全对或全错的一组回答,从而计算出来的组内优势为 0,策略梯度也为 0,这会导致整个 batch 内实际能够提供有效训练信号的样本数量减少,降低了采样的效率。
因此 DAPO 在训练前直接过滤掉回答全对和全错的关键词,这就是 DAPO 的约束条件。

Token-Level Policy Gradient Loss#

GRPO 的目标函数对每条回答先做 token 平均,再跨回答平均,这导致长回答对整体 loss 的贡献被严重低估:200 token 的回答权重只有 10 token 回答的 1/20。
这可能会稀释较长回答中单个推理 token 的损失权重,阻碍模型从高质量的长推理步骤中汲取有效模式,也会导致长回答中的错谬 token 无法被施加足够的惩罚。
因此 DAPO 将损失函数改为 token 级别的策略梯度损失,采用所有生成样本的 Token 总数之和作为归一化分母。

Overlong Reward Shaping#

在 RL 中通常设置最大学习长度,超出该长度的样本会被直接截断。如果对这些被截断的超长样本进行不合理的奖励设计,会引入剧烈的奖励噪声。
因此 DAPO 采用了平滑超长惩罚机制,在最大生成长度 LmaxL_{max} 之前预留一段缓冲区间 LcacheL_{cache},并根据实际生成的长度进行渐进式的柔性惩罚,公式如下:

Rlength(y)={0,yLmaxLcachey(LmaxLcache)Lcache,LmaxLcache<yLmax1,y>[citestart]LmaxR_{length}(y) = \begin{cases} 0, & |y|\le L_{max}-L_{cache} \\ -\frac{|y| - (L_{max} - L_{cache})}{L_{cache}}, & L_{max}-L_{cache}<|y|\le L_{max} \\ -1, & |y| > [cite_start]L_{max} \end{cases}

最终的综合奖励为:Rfinal=R(x,y)+Rlength(y)R_{final} = R(x,y) + R_{length}(y) 。在缓冲区间内,回答越长,受到的负向惩罚越大 ,这引导模型学会简洁且正确的回答。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

RLHF algorithms, from PPO to DAPO
https://kisaragi-irona.top/posts/paper-reading/rlhf-algorithms/blog/
作者
Kisaragi
发布于
2026-06-07
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录