后 RL 书
Takeaways from Prior
以下是前篇保留的一些必要 takeaways(有部分重述):
-
Trajectory formulation:\(\tau=(s_0,a_0,r_1,s_1,a_1,r_2,\dots)\)。
-
Environment formulation:初态分布记作 \(h\);转移动力学用 \(\Pr[s'\mid a,s]\) 描述。
-
Policy formulation:\(\pi(a\mid s)\) 是状态空间上每一点 \(s\) 处下一步行为 \(a\) 的分布。当分布是 Dirac 的 \(\delta_a\) 时,它退化为 \(s\mapsto a\) 的映射,也即确定性策略。
-
RL 算法的分类维度:
- Per-Episode / Per-Step:只在 traj 结尾处提供信号,或者 traj 中每一步均有监督。居于二者之间的模式是 \(n\)-step 或 GAE。
- On-Policy / Off-Policy:On-Policy 强制 traj 来自当前 policy,而 Off-Policy 则不要求。通过 Importance Sampling 可以把前者改造成后者,代价是增大方差。
- Policy-Based / Value-Based:前者认为 Policy 或称 Actor 是本质,更新的本质是沿着 Policy 效用的 gradient ascent,而 Value 或 Critic 都是用于加速这一过程或提供合适效用信号的辅助工具。后者认为 Value 也即对当前所处状态效用的估计是本质,Policy 可以自动通过 argmax 或其近似诱导出,更新本质上是 Bellman 迭代。
-
Policy 的效用:
-
总是有 Lagrangian 和 Eulerian 两种模式,其中第一种对具体的 traj \(\tau\) 分析,而第二种则依赖某种分布 \(\mu\) 下的单步回报。二者总是等价的,一般计算时使用前者,分析时使用后者。
-
Lagrangian 的通用模式:
\[J(\pi)=\E_\tau G_0(\tau) \] -
Eulerian 的通用模式:
\[J(\pi)=\E_{s\sim\mu(\cdot)}\E_{a\sim\pi(\cdot\mid s)}r(s,a) \]有可能带一个可省略的常系数。一般无法写出 \(\mu\) 的显式表达式,因此还是要靠 Lagrangian 进行计算。
-
-
Discounted 模式:
- Lagrangian 式:\(G_t=\sum_{k=0}\gamma^k r_{t+k+1}\)。
- Eulerian 式:\(\mu\) 是按照 \(\gamma^t\) 加权后的稳态分布。
-
Differential 模式:
- Lagrangian 式:\(G_t=\sum_{k=0}[r_{t+k+1}-J(\pi)]\)。
- Eulerian 式:\(\mu\) 是标准稳态分布。
-
本文除非明确说明否则默认使用 Discounted 模式。
-
-
Policy Gradient Theorem:
-
Eulerian 式:
\[\nabla_\theta J(\pi_\theta)\propto\E_{\mat{s\sim \mu(\cdot)\\a\sim\pi_\theta(\cdot\mid s)}}\nabla_\theta\log\pi_\theta(a\mid s)\cdot Q^{\pi_\theta}(s,a) \] -
Lagrangian 式:
\[\nabla_\theta J(\pi_\theta)\propto\E_\tau\left[\sum_{t=0}\nabla_\theta\log\pi_\theta(a_t\mid s_t)\sum_{k=0}\gamma^kr_{t+k+1}\right] \]
-
-
Q Actor-Critics:
\[\nabla_\theta J(\pi_\theta)\propto\E_\tau\left[\sum_{t=0}\nabla_\theta\log\pi_\theta(a_t\mid s_t)Q_\varphi(s_t,a_t)\right] \] -
Advantage Actor-Critics:
-
通用式:
\[\nabla_\theta J(\pi_\theta)\propto\E_\tau\left[\sum_{t=0}\nabla_\theta\log\pi_\theta(a_t\mid s_t)\t{error}_t\right] \\\varphi\gets\varphi-\alpha'\E_\tau\sum_{t=0}\nabla_\varphi\t{dist}(\t{error}_t) \]特别地,\(\t{error}_t\) 与 \(\theta\) 无关,所以更新 \(J\) 时,其可以默认 detach。下文中的 stop gradient 只是相对于 critic 更新而言。
\(\t{error}_t\) 的常见其它 notation 是 advantage \(A(s_t,a_t)\)。本文为了强调 error 是导出项(而 \(A(s_t,a_t)\) 容易被理解为原生训练项),所以更倾向于前者。
-
TD 式:
\[\t{error}^\t{TD}_t=r_{t+1}+\gamma\t{SG}[V_\varphi(s_{t+1})]-V_\varphi(s_t) \] -
\(n\)-step 式:
\[\t{error}^{n\t{-step}}_t=\sum_{i=0}^{n-1}\gamma^ir_{t+i+1}+\gamma^n\t{SG}[V_\varphi(s_{t+n})]-V_\varphi(s_t) \] -
Monte-Carlo 式(此时 \(V\) 甚至不一定需要维护):
\[\t{error}^\t{MC}_t=\sum_{i=0}\gamma^ir_{t+i+1}-V_\varphi(s_t) \] -
GAE(λ) 式:
\[\t{error}_t^{\t{GAE}(\lambda)}=\sum_{i=0}^{n-1}(\lambda\gamma)^i\t{error}_{t+i}^\t{TD} \]这个是目前比较主流的 advantage 刻画方法。
-
-
Importance Sampling:
-
Lagrangian 式:
\[\dfrac{\Pr[\tau\mid \pi]}{\Pr[\tau\mid \pi']}=\dfrac{h(s_0)\prod\pi(a_i\mid s_i)\Pr[s_{i+1}\mid s_i,a_i]}{h(s_0)\prod\pi'(a_i\mid s_i)\Pr[s_{i+1}\mid s_i,a_i]}=\dfrac{\prod\pi(a_i\mid s_i)}{\prod\pi'(a_i\mid s_i)} \]\[\nabla_\theta J(\pi_\theta)\propto\E_{\tau\mid \pi_{\theta'}}\dfrac{\prod_{i=0}^{T-1}\pi_\theta(a_i\mid s_i)}{\prod_{i=0}^{T-1}\pi_{\theta'}(a_i\mid s_i)}\sum_{i=0}^{T-1}\nabla_\theta\log\pi_\theta(a_i\mid s_i)\t{error}_i \] -
Eulerian 式:
\[\nabla_\theta J(\pi_\theta)\propto\E_{\tau\mid\pi_{\theta'}}\sum_{i=0}^{T-1}\dfrac{\mu_\theta(s_i)\pi_\theta(a_i\mid s_i)}{\mu_{\theta'}(s_i)\pi_{\theta'}(a_i\mid s_i)}\nabla_\theta\log\pi_\theta(a_i\mid s_i)\t{error}_i \]注意此处并没有采用 \(\E_{\mat{s\sim \mu(\cdot)\\a\sim\pi_\theta(\cdot\mid s)}}\) 的记号,仅仅使用 \(\mu\) 刻画了每一步的 IS,因为那种 notation 下 \(\t{error}_i\) 不良定义。
-
Near-On-Policy Methods
考虑一种目的是 复用 traj 的 on-policy 算法。按照经验,此时应当引入大方差的 IS。但是,如果考虑以下模式:
- 使用当前策略采样一批 traj。
- 使用其连续跑多个 epoch 的 gradient ascent。
就会发现若干好处:
- IS 的方差能被压制:因为当前 policy 离采样 policy 距离有限。
- 某些裁剪操作的 bias(将在下文分析)有上限。
- Critic——因为用的是旧 policy 的 traj 训练,因此也在拟合旧 policy——更接近 on-policy。
因此不失为一种好主意。
PPO-Penalty
考虑 Eulerian 的 IS 式子
可以证明,只要 \(\t D_\t{TV}(\pi_\theta(\cdot\mid s),\pi_{\theta'}(\cdot\mid s))\) 受限,则 \(\mu_\theta(s)/\mu_{\theta'}(s)\) 亦然。此时可以以一个小 bias 为代价扔掉比值项。
但是 TVD 包括不可导的绝对值,使用 Pinsker 不等式 \(\t D_\t{TV}(p,q)\leq\sqrt{\dfrac12\t D_\t{KL}(p\|q)}\) 转成 KL 散度,即得
还原得到的是
于是即有
但是这个 Trust Region 中的 max 比较难处理。实际选择把 max 放松为期望,并使用 Lagrange 乘子法把 Trust Region 放到目标里,扔掉常数项即得
其中这个 KL 项在离散空间(如 vocab 空间)可以直接对全体 logit 显式求;连续空间一般 action 用 Gaussian 等建模,此时也有闭式解。
然后使用 Coordinate Descent,即分别优化 \(\pi\) 和 \(\beta\) 两维。算法描述为:
- 使用上述 loss(搭配上熵正则,同时更新 critic)跑 \(K\) 步 \(\theta\) 维的梯度上升。
- \(\beta\gets\beta+\alpha(\t D_\t{KL}-\eps)\)。
这种方法被称作 PPO-Penalty。实际上因为还要调 \(\beta\) 和 \(\eps\),所以被下述 PPO-Clip 取代了。
特别地,虽然上式中同时有当前模型 \(\theta\) 以及历史模型 \(\theta'\) 两个模型,但并不需要保存两份权重:反正 rollout 是在 \(\theta'\) 上进行的,在 rollout 时直接存储相关信息即可,不需要存储完整模型。
PPO-Clip
对于
如果使用 \(\beta\) 和 Lagrange 乘子法,则相当于维护一个随时间变化的 penalty;另一种方法是直接 clip。具体地,对 \(\rho_i:=\dfrac{\pi_\theta(a_i\mid s_i)}{\pi_{\theta'}(a_i\mid s_i)}\) clip,有
这个式子看着很臃肿,其实际上可以看做是一种关于 error / advantage 的分类讨论阶段:
- 其为正时,系数是 \(\min(\rho_i,1+\eps)\),求导后就只在 \(<1+\eps\) 时贡献,避免过度乐观。
- 为负时则是 \(\max(\rho_i,1-\eps)\)。
同样,实际会与熵正则一同使用。
特别地,PPO 并不能保证只靠 clip 就能把策略约束到 trust-region 中,实际实现时通常搭配其它细节一同施加约束。
TRPO
除了强行用 Lagrange 乘子外,另一种方法是仍然使用原本的 trust-region formulation。
- 对 KL 散度用二阶 Taylor 展开做近似,其变成了 Fisher 信息矩阵,对应的最速下降是 Natural Gradient Descent。
- 但是 NGD 要对 \(F\) 求逆,因此转而使用共轭梯度!
这就是数学看着很牛的 TRPO,它能保证严格的硬约束。但是它还是打不过简单粗暴的 PPO。
Max-Entropy Based Methods
另一种思路则选择舍弃 Importance Sampling,最终得到以 SAC 为代表的现代 Actor-Critics 方法。
DDPG
在 DQN 中,我们有 Q-Network \(Q_\theta(s,a)\)。但是在状态空间巨大的时候,我们无法遍历所有 \(a\) 并寻找最优 action。这就要求我们使用 Actor 来近似 \(\arg\max_aQ_\theta(s,a)\)。
为了与 Actor-Critic 中的 notation 保持一致,此处我们仍使用 \(\theta\) 表述 actor 参数,并使用 \(Q_\varphi\) 表示 critic。
[!TIP]
可以发现,A2C 和 PPO 一系维护的 critic 是 \(V\),而接下来这一系维护的 critic 是 \(Q\)。
DDPG 使用的是确定性 Actor \(\mu_\theta(s)\)。似乎又出现了与前文中普遍使用的 stationary distribution 撞名的现象,仅本节将其重命名为 \(\nu\)。
因为它的思想直接基于 DQN,所以我们继承 DQN 的两个最重要的技巧:experience replay 和 frozen target network。对 Critic 和 Actor 各自建立 main 和 target 两个网络,一共需要四个网络!
而其更新则依赖于 确定性策略梯度定理,表述为
并且其可以直接通过对
反向传播得到。(事实上,这就是确定性策略梯度定理的证明!)
而其对应的 critic target 是
其中 \(a'_{t+1}=\mu_\theta(s_{t+1})\),因此不一定等于从 replay buffer 里掏出的 \((s_t,a_t,r_{t+1},s_{t+1},a_{t+1})\) 中的 \(a_{t+1}\)。和 DQN 中一样,使用 \(\theta\gets\theta-\alpha'\nabla\t{dist}(\t{SG}(\t{target}_\t{critic})-Q_\varphi(s_t,a_t))\) 拉近二者。从另一个角度说,这个式子更接近 SARSA。
注意到上一段提到了 replay buffer。没错,这个式子天生支持 replay buffer,因为它本质上是 value-based,一切的核心在于 \(Q\)!
SAC
如果我们将 DDPG 扩展到非确定性场景,即回到 \(\pi(s,a)\) 描述动作的模式呢?此时如果还想对
反向传播,会发现一个问题:梯度无法反传给采样。不过这个方法我们已经很熟悉了,直接 reparameterization 即可。另一方面,为了鼓励探索,SAC 又增加了一个熵项,得到
类似有
Interlude: Control as Inference
对带随机化的 RL 分析。
定义一个变量 \(O_t\),有 \(P(O_t=1\mid s_t,a_t)=\exp(r(s_t,a_t))\),表示 \(t\) 时刻认为「处于最优态」的概率。
[!TIP]
这里的 \(r\) 需要是负数才能让概率有意义,不过显然可以通过减去最大值来手动构建负奖励系统。
另一方面,有意义的其实不是绝对概率而是相对概率。具体地,我们希望最大化「所有时刻都最优」的前提下,一条路径出现的概率,即
假设先验路径分布 \(P(\tau)\) 是所有合法的路径均等概率,可以发现此建模会天然偏好高收益路径,但并不忽视低收益路径。
现在考虑对当前行为未来收益的估测。具体地,假设存在一个先验决策分布 \(p(a_t\mid s_t)\),以及客观转移分布 \(p(s_{t+1}\mid s_t,a_t)\),则有
则可以清晰看到,\(\beta_t(s_t,a_t)\) 是类似 \(Q\) 的概念,而 \(\beta_t(s_t)\) 类似 \(V\)。具体地,如果令 \(V_t(s_t)=\log\beta_t(s_t),Q_t(s_t,a_t)=\log\beta_t(s_t,a_t)\),则有
现在把先验决策分布也引入,则有
所以定义 \(\tilde Q(s_t,a_t)=Q(s_t,a_t)+\log p(a_t\mid s_t)\),则有
或者说,可以转而对增强奖励 \(\tilde r(s_t,a_t)\) 讨论。
现在尝试提取 policy,即
仍然作出均匀分布的先验(或使用增强奖励),于是最终有 \(\pi(a_t\mid s_t)\propto\dfrac{\beta_t(a_t,s_t)}{\beta_t(s_t)}\)。代入相应的 \(V,Q\) 定义可知 \(\pi(a_t\mid s_t)\propto\exp(Q_t(s_t,a_t)-V_t(s_t))=\exp(A_t(s_t,a_t))\)。
以上推理中,我们的 policy 是假设当前处于最优态时的策略,即 \(p(a_t\mid s_t,O_{1:T})\)。但是 intuitive 地,它不是一个好的选择:
-
我们假设达到了最优态。这表明我们会忽视客观条件:「既然我最终最优了,那客观条件肯定是偏向我的」,进而忽视风险。
-
形式化地,\(\log\E[\exp(V_{t+1}(s_{t+1}))\geq\E V_{t+1}(s_{t+1})\):倘若有小概率暴富,模型会毫不犹豫地选择该决策,因为它把「成功」当成了先验。
-
具体地,有
\[P(s_{1:T},a_{1:T}\mid O_{1:T})=\prod P(a_t\mid s_t,O_{1:T})P(s_{t+1}\mid a_t,s_t,O_{1:T}) \\=P(s_1)\prod\pi(a_t\mid s_t)P(s_{t+1}\mid a_t,s_t,O_{1:T}) \]所以模型实际看到的动力学是过度乐观的 \(P(s_{t+1}\mid a_t,s_t,O_{1:T})\)。
所以我们希望找到另一个分布 \(q(s_{1:T},a_{1:T})\),其服从正确的转移动力学,即
同时还有 \(q(s_{1:T},a_{1:T})=p(s_{1:T},a_{1:T}\mid O_{1:T})\)。
由 ELBO,有
LLM RL
Introduction
显然,LLM 可以被当成一个经典的 MDP 问题:
-
状态是当前的 token 序列,包括 prompt \(x\) 和已生成的部分 \(y_{1:t-1}\)。
-
动作是下一个 token \(y_t\),转移是 确定 的(直接追加)——这是一个很显著的特征。
-
策略是 auto-regressive LLM 的每一步,即 \(\pi_\theta(y_t\mid x,y_{1:t-1})\)。
-
奖励:LLM 场景最需要关心的问题。
- 来源:human preference、reward model、rule checker、环境反馈等等。
- 奖励粒度:轨迹末端;每个推理步;每一轮交互;每个 token。
- 归因粒度——稀疏的奖励也可以通过各种归因方式产生稠密的梯度。
-
常见奖励列表:
- BT model:人类对同一 prompt 下两个/多个回答的偏好排序。粒度是 per-traj 的。
- 规则化可验证奖励 (RLVR):例如数学答案匹配、单元测试、格式正则等。通常有 \(r\in\cur{0,1}\),或者有答案 + 格式的独立拆分。粒度是 per-traj 的。
- outcome reward model (ORM):预测「当前前缀能达到正确答案」的概率。粒度是 per-token 的,但语义上监督是 per-traj 的。也常常被用来作 BoN 辅助生成。
- LLM-as-judge:让 LLM 判分。粒度默认是 per-traj 的,但也可以支持更细粒度的评分(但质量不一定高)。
- Rubric-based reward:设置一份评分清单 (rubric),每条单独判定后聚合。可以与其它方法结合。
对 LLM 作 RL 时,核心永远是 policy(也即 LLM 本身)。
PPO
首先 PPO 仍然是能用的。具体地,在 LLM 中,critic \(V_\varphi(x,y_{1:t})\) 一般是 base model 外挂一个 MLP 读出,也就是说除了主要优化的 policy 以外,还要再额外多一份同规模、完整或 LoRA 可训的模型。
然而因为 LLM 常常使用 per-traj reward,此时奖励太稀疏了,critic 经常不好训。
此外,为了防止 reward hacking,一般会选择设置一份冻结基线 \(\theta_\t{ref}\),并通过 reverse KL \(\t D_\t{KL}(\pi_\theta\|\pi_{\theta_\t{ref}})\) 进入 loss。
但是具体进入 loss 的模式有两种:
- 作为 正则项,per-traj 地进入 loss,也即常规 PPO loss 上额外多一个 \(\beta\t D_\t{KL}[\pi(\cdot\mid x)\|\pi_\t{ref}(\cdot\mid x)]\) 项(因为 PPO 其实是最大化效用,所以应该是减去这一项)。
- 作为 per-token 的 负 reward。
二者的根本区别在于,后者会进入 GAE 和 critic,而前者不会。于是后者对 critic 更友好,每一步都有非零信号。
形式化地,per-traj KL 使用的式子如下
而 per-token KL 则是每一步使用的
特别地,此处使用单样本 MC 采样(而不是准确的 KL 统计值),因为此处 \(\beta\) 是固定值,不会受到噪声影响。另外,误差也会经由 GAE 被平均。
现在来看一下 LLM PPO 需要哪些模型:
- 一个当前被优化的 policy \(\pi_\theta\)。
- 一个同步优化的 critic \(V_\varphi\)。
- 一个冻结的 ref \(\pi_{\theta_\t{ref}}\)。
- 一个冻结的、训练出的 reward model \(r_\phi\)(非必要,也可以用其它方法获得 reward)。
- 虽然被用于计算 \(\rho\),但是因为可以缓存 logit 所以不用存储的旧权重 \(\pi_{\theta_\t{old}}\)。
因此就有核心的所谓「PPO 的四份权重」。
特别地,工程上 \(\theta_\t{old}\) 的 rollout 由推理引擎完成,而梯度由训练引擎计算,二者可能存在 logprob 不适配,导致 \(\rho\) 从一开始就不等于 \(1\)。此时有两种思路:
- 丢弃推理引擎提供的 logprob,使用训练引擎的 logprob。
- 做一个量级更宽松的 clip。
DPO
有人会从 PPO 的角度理解它,但 PPO 又是 IS 又是 clip 的,翻译成 DPO 时还要把这些东西扔掉,太麻烦了。故直接从更本质的角度理解。
首先,默认考虑 per-traj 的 reward,在 \(\gamma=1\) 的情况下,则可以有 \(\t{error}_i=r(x,y)\)。于是一个基础模式就是最大化
外挂上 per-traj 的 ref KL 正则项,即有
特别地,固定单个 \(x\),可以直接定量刻画最优的 \(\pi\),即为
但是这个 partition function 不好计算。然而可以从任意策略按照这个方式反过来导出使其成为最优的 reward:
于是在 BT model 假设下,也即
于是逻辑链条成立:
- 当前有一个策略 \(\pi\)。
- 策略隐含着相对 \(\pi_\t{ref}\) 的一个难计算的 reward。
- 但是这个 reward 在 BT model 下导出的胜负关系预测是容易计算的。
- 于是关于这个预测作 BCE 即可。
这就是 DPO。然而,这个推导同时也建立在一些有时不可靠的前提上:
- BT 假设。有若干计算经济学论文指出这个假设不牛。
- \(\pi^*\) 是可表达的。在有限 hypothesis class 下,它只能被看做是一种 ERM。
- \(y_w,y_l\) 的数据对来自其它模型或人工,是 off-policy 的,exploration 上会有一些问题。
此外,也有一些潜在的问题:
- 一个捷径是只要 \((y_w,y_l)\) 对出现,就同时打压二者,只不过后者被打压得更狠。因此有使用其它 loss 的模式。
- 只能提供 per-traj 级别的约束,通过自回归摊到每个 token 上,不够精细。
再加上一些问题:
- 没有 critic 既保证轻量级,又限制了模型真正的能力,潜力有限。
- 标注数据可能过时。
所以现在已经没那么热门了。
GRPO
在 PPO 的基础上,使用「组内相对回报」替代 critic。以更多 rollout 为代价,换取不必使用 critic。
事实上,正如前文所说,critic 太难训了,一个学的不好的 critic 能提供的信息本质上就是退化的 baseline,那么不如直接丢弃,改为统计量提供。
形式化地,对于一组「可比」的 traj \(\cur{\tau_1,\dots,\tau_G}\)——其中可比性可能来自它是同一个 prompt 的不同回答、同一个 request 下多轮 tool chain、同一个 user simulator 指引下的多轮对话——使用某种方法,例如上述 RLVR 获取 reward \(\cur{r_1,\dots,r_G}\),然后对应的 advantage 是归一化 reward:
同一条 traj 中所有 step 通常共享同一个 advantage(也可以看做是把 per-traj 的 reward 通过 \(\gamma=1\) 摊到每一步)。然后直接使用标准 PPO \(\rho\) 模式 + 额外的 DPO 式 KL 正则项即可。
形式化地,在 LLM 场景(注意到上述叙述模式并没有限定 LLM),公式如下:
原始 DeepSeekMath 直接显式把 KL 加入 loss,而后来某些变体会削弱 KL 的地位。
特别地,此处有三个不同的策略:
- 当前策略 \(\pi_\theta\)。
- rollout 旧策略 \(\pi_\t{old}\)。
- 锁死的 base 策略 \(\pi_\t{ref}\)。
这个场景下,成功或失败都可以在组内贡献价值——只要组内有方差;无价值的是同一组内全部成功或全部失败,这样组内归一化就失去了价值。
对比 PPO:
- GRPO 的优势:无需 critic;对 per-traj reward 友好。
- GRPO 的劣势:traj 利用率低,需要多次 rollout;reward 归因粗糙;无法利用全对或全错组;对长程任务不友好。
对比 DPO:
- GRPO 的优势:更完整,能鼓励探索、从非零但格式正确的起点出发即可有效提升成功率。
- DPO 的优势:适合已有的高质量偏好对;适合学习人类偏好;更稳定。
不严谨地说,PPO / GRPO 更类似于真正的「搏上限」「懂得探索」的 RL,而 DPO 更类似于对已有规则的蒸馏与对齐。
GSPO
GRPO 有一个问题,就是 ratio \(\rho\) 以及裁剪都是在 token 层面独立发生的,每个 token 的 ratio 都不同,就会出现同一个 traj 中 部分 token 被干掉、另一部分被保留 的场景,这对于以 traj 粒度提供的 reward 是不合理的。
所以 GSPO 对 ratio 做一个几何平均,使用 per-traj 的 ratio
其中做了长度归一化以控制不同长度回答的尺度相近。同一 traj 的所有 token 共享同一个归一化 ratio。
这样 clip 是 以 traj 单位进行 的,对长序列——尤其是 MoE 这种容易不稳定的场景——更友好。但代价是异常 token 可能导致整个 traj 的 ratio 超出 clip 范围而被迫丢弃。
SAPO
把硬的 clip 换成更软的连续衰减。而且 PPO 使用是双侧对称模式,而 SAPO 会对负侧压制更明显,因为负更新会相对抬升大量未采样 token,很容易导致不稳定。
其仍然会执行 token 级别的 gating,但是对 outlier 抑制更好,因此对于 MoE 也很适合。
DAPO
对超长样本(尤其是 CoT 和 agentic 场景),per-traj 的 advantage 导致以下问题:
- 随训练推进,很容易出现组内趋同现象。
- 单个 token 的贡献被稀释。
- 超过文本上限导致的失败可能是错误的负信号。
- 更容易出现 train2val gap。
因此 DAPO 使用以下工程方案:
- 和 SAPO 一样的非对称 clipping,压制负更新,并鼓励正更新(探索)。
- 从序列内部平均改为全 batch 平均,缓解长序列稀释现象。
- 移除 ref KL 项——ref RL 本质上是为了防 reward hack 的,但 DAPO 使用的 reward 来自难以被 hack 的 RLVR,因此可以扔掉。
- 通过 rejection sampling 强制每一组内必须同时有正确和错误样本。
- 对于超过 context length 的回答,屏蔽其 loss,不让其污染梯度。同时惩罚接近长度上限的回答,让模型学会控制长度。
Model Based RL
Introduction
除了直接建模然后跑 MDP 外,其实还存在更多 model based 方法,甚至超脱了 MDP 的框架。
Random Shootings
直接均匀随机挑选策略,计算其平均收益。这一般被当作决策的一个下界——如果你的算法连 Random Shooting 都打不过那还是回家洗洗睡吧。
Cross Entropy Methods
我们的策略归根到底是要最大化收益。假如有 \(T\) 个策略 \(a_1,\dots,a_T\),我们会希望选取其中的 argmax 作为我们的最终策略。
现在我们使用一个参数化的概率分布来生成这些策略,并使用其收益最高的前若干个也即所谓的「精英样本」来更新该概率分布,使概率分布集中于高价值策略附近。
例如,一个最简单的场合是纯粹 Gaussian 分布,那么使用精英样本更新的过程即为计算这些样本的均值和方差,然后以之作为下一轮的 Gaussian。
这样做其实是在使用参数分布拟合极小值处单点分布,最小化二者间的 KL 散度,因此得名 Cross Entropy Methods。

浙公网安备 33010602011771号