后 RL 书

\[\newcommand{\t}{\text} \newcommand{\cur}[1]{\left\{#1\right\}} \newcommand{\co}[2]{{\color{#1}{#2}}} \newcommand{\eps}{\epsilon} \newcommand{\E}{\mathop{\mathbb E}} \newcommand{\p}{\partial} \newcommand{\mat}[1]{\begin{matrix}#1\end{matrix}} \newcommand{\d}{\mathrm d} \newcommand{\c}{\mathcal} \]

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 式子

\[\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 \]

可以证明,只要 \(\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 散度,即得

\[\nabla_\theta J'(\pi_\theta)=\E_{\tau\mid\pi_{\theta'}}\sum_{i=0}^{T-1}\dfrac{\pi_\theta(a_i\mid s_i)}{\pi_{\theta'}(a_i\mid s_i)}\nabla_\theta\log\pi_\theta(a_i\mid s_i)\t{error}_i \]

还原得到的是

\[J'(\pi_\theta)=\E_{\tau\mid\pi_{\theta'}}\sum_{i=0}^{T-1}\dfrac{\pi_\theta(a_i\mid s_i)}{\pi_{\theta'}(a_i\mid s_i)}\t{error}_i \]

于是即有

\[\theta=\arg\max\E_{\tau\mid\pi_{\theta'}}\left[\sum_{i=0}^{T-1}\dfrac{\pi_\theta(a_i\mid s_i)}{\pi_{\theta'}(a_i\mid s_i)}\t{error}_i\right] \\\operatorname{s.t.}\max_s[\t D_\t{KL}(\pi_{\theta'}(\cdot\mid s)\|\pi_\theta(\cdot\mid s))]\leq\eps \]

但是这个 Trust Region 中的 max 比较难处理。实际选择把 max 放松为期望,并使用 Lagrange 乘子法把 Trust Region 放到目标里,扔掉常数项即得

\[\E_{\tau\mid\pi_{\theta'}}\left[\sum_{i=0}^{T-1}\dfrac{\pi_\theta(a_i\mid s_i)}{\pi_{\theta'}(a_i\mid s_i)}\t{error}_i-\beta\t D_\t{KL}(\pi_{\theta'}(\cdot\mid s)\|\pi_\theta(\cdot\mid s))\right] \]

其中这个 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

对于

\[J'(\pi_\theta)=\E_{\tau\mid\pi_{\theta'}}\sum_{i=0}^{T-1}\dfrac{\pi_\theta(a_i\mid s_i)}{\pi_{\theta'}(a_i\mid s_i)}\t{error}_i \]

如果使用 \(\beta\) 和 Lagrange 乘子法,则相当于维护一个随时间变化的 penalty;另一种方法是直接 clip。具体地,对 \(\rho_i:=\dfrac{\pi_\theta(a_i\mid s_i)}{\pi_{\theta'}(a_i\mid s_i)}\) clip,有

\[J_\t{PPO}(\theta)=\E_{\tau\mid\pi_{\theta'}}\sum_{i=0}^{T-1} \min\Big(\rho_i\t{error}_i,\t{clip}(\rho_i,1-\eps,1+\eps)\t{error}_i\Big) \]

这个式子看着很臃肿,其实际上可以看做是一种关于 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 两个网络,一共需要四个网络!

而其更新则依赖于 确定性策略梯度定理,表述为

\[\nabla_\theta J_\t{actor}(\theta)=\E_{\substack{s\sim\nu_\theta\\a\gets\mu_\theta(s)}}\p_aQ_\varphi(s,a)\nabla_\theta\mu_\theta(s) \]

并且其可以直接通过对

\[J'_\t{actor}(\theta)=\E_{\substack{s\sim\nu_\theta}}Q_\varphi(s,\mu_\theta(s)) \]

反向传播得到。(事实上,这就是确定性策略梯度定理的证明!)

而其对应的 critic target 是

\[\t{target}_\t{critic}=r_{t+1}+\gamma Q_\varphi(s_{t+1},a'_{t+1}) \]

其中 \(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)\) 描述动作的模式呢?此时如果还想对

\[J'_\t{actor}(\theta)=\E_{\substack{s\sim\nu_\theta\\a\sim\pi_\theta(s,\cdot)}}Q_\varphi(s,a) \]

反向传播,会发现一个问题:梯度无法反传给采样。不过这个方法我们已经很熟悉了,直接 reparameterization 即可。另一方面,为了鼓励探索,SAC 又增加了一个熵项,得到

\[J_\t{actor}(\theta)=\E_{\substack{s\sim\nu_\theta\\a\sim\pi_\theta(s,\cdot)}}Q_\varphi(s,a)-\alpha\log \pi_\theta(s,a) \]

类似有

\[Q_\varphi(s_t,a_t)\Leftarrow \\\t{target}_\t{critic}=r_{t+1}+\gamma(Q_\varphi(s_{t+1},a'_{t+1})-\alpha\log\pi_\theta(s_{t+1},a_{t+1})) \\(a'_{t+1}\sim\pi_\theta(s_{t+1})) \]

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\mid O_{1:T}=1)=\dfrac{P(\tau)P(O_{1:T}=1\mid\tau)}{P(O_{1:T}=1)} \\\propto P(\tau)\exp\left(\sum r(s_t,a_t)\right) \]

假设先验路径分布 \(P(\tau)\) 是所有合法的路径均等概率,可以发现此建模会天然偏好高收益路径,但并不忽视低收益路径。

现在考虑对当前行为未来收益的估测。具体地,假设存在一个先验决策分布 \(p(a_t\mid s_t)\),以及客观转移分布 \(p(s_{t+1}\mid s_t,a_t)\),则有

\[\beta_t(s_t,a_t):=P(O_{t:T}=1\mid s_t,a_t) \\\beta_t(s_t):=\E_{a_t\sim p(a_t\mid s_t)}\beta_t(s_t,a_t) \\\beta_t(s_t,a_t)=P(O_t=1\mid s_t,a_t)\E_{s_{t+1}\sim p(s_{t+1}\mid s_t,a_t)}\beta_{t+1}(s_{t+1}) \]

则可以清晰看到,\(\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)\),则有

\[V_t(s_t)=\log\int\exp(Q_t(s_t,a_t))\d a_t \\Q_t(s_t,a_t)=r(s_t,a_t)+\log\E[\exp(V_{t+1}(s_{t+1}))] \]

现在把先验决策分布也引入,则有

\[V_t(s_t)=\log\int\exp(Q_t(s_t,a_t))p(a_t\mid s_t)\d a_t \\=\log\int\exp[Q_t(s_t,a_t)+\log p(a_t\mid s_t)]\d a_t \]

所以定义 \(\tilde Q(s_t,a_t)=Q(s_t,a_t)+\log p(a_t\mid s_t)\),则有

\[V_t(s_t)=\log\int\exp\tilde Q_t(s_t,a_t)\d a_t \\\tilde Q(s_t,a_t)=r(s_t,a_t)+\log p(a_t\mid s_t)+\log\E[\exp(V(s_{t+1}))] \]

或者说,可以转而对增强奖励 \(\tilde r(s_t,a_t)\) 讨论。

现在尝试提取 policy,即

\[\begin{align*} \pi(a_t\mid s_t)=P(a_t\mid s_t,O_{1:T}) \\=P(a_t\mid s_t,O_{t:T})&&(\t{Markov}) \\=\dfrac{P(O_{t:T}\mid a_t,s_t)}{P(O_{t:T}\mid s_t)}\dfrac{p(a_t,s_t)}{p(s_t)} \\=\dfrac{\beta_t(a_t,s_t)}{\beta_t(s_t)}p(a_t\mid s_t) \end{align*} \]

仍然作出均匀分布的先验(或使用增强奖励),于是最终有 \(\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)\prod q_t(a_t\mid s_t)p(s_{t+1}\mid a_t,s_t) \]

同时还有 \(q(s_{1:T},a_{1:T})=p(s_{1:T},a_{1:T}\mid O_{1:T})\)

由 ELBO,有

\[\log p(O_{1:T})\geq\E_{s_{1:T},a_{1:T}\sim q}\log p(s_{1:T},a_{1:T},O_{1:T})-\log q(s_{1:T},a_{1:T}) \\=\E_{s_{1:T},a_{1:T}\sim q}\Big[\log\Big[p(s_1)\prod p(O_t\mid s_t,a_t)p(s_{t+1}\mid s_t,a_t)p(a_t\mid s_t)\Big] \\-\log\Big[p(s_1)\prod p(s_{t+1}\mid s_t,a_t)q(a_t\mid s_t)\Big]\Big] \\=\E_{s_{1:T},a_{1:T}\sim q}\left[\sum\log p(O_t\mid s_t,a_t)-\sum\log\dfrac{q(a_t\mid s_t)}{p(a_t\mid s_t)}\right] \\=\sum_t\E_{s_t,a_t\sim q}r(s_t,a_t)-\t{KL}(q(a_t|s_t)\|p(a_t|s_t)) \]

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 使用的式子如下

\[J(\theta)=\E_{\mat{x\sim\c D\\y\sim\pi_{\theta_\t{old}}(\cdot\mid x)}}\sum_{t=1}^{|y|} \min\Big(\rho_tr,\t{clip}(\rho_t,1\pm\eps)r\Big)-\beta\t D_\t{KL}[\pi_\theta\|\pi_{\theta_\t{ref}}] \]

而 per-token KL 则是每一步使用的

\[r_t=1_{t=|y|}\cdot r(x,y)-\beta\log\dfrac{\pi_\theta(y_t\mid x,y_{1:t-1})}{\pi_{\theta_\t{ref}}(y_t\mid x,y_{1:t-1})} \]

特别地,此处使用单样本 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)\)。于是一个基础模式就是最大化

\[\E_{\mat{x\sim\c D\\y\sim \pi_\theta(\cdot\mid x)}}r(x,y) \]

外挂上 per-traj 的 ref KL 正则项,即有

\[\max_\pi\E_{x\sim\c D}\left[\E_{y\sim \pi(\cdot\mid x)}r(x,y)-\beta\t D_\t{KL}[\pi(\cdot\mid x)\|\pi_\t{ref}(\cdot\mid x)]\right] \]

特别地,固定单个 \(x\),可以直接定量刻画最优的 \(\pi\),即为

\[\pi^*(y\mid x)=\dfrac{\pi_\t{ref}(y\mid x)\exp(r(x,y)/\beta)}{\sum_{y'}\pi_\t{ref}(y'\mid x)\exp(r(x,y')/\beta)} \]

但是这个 partition function 不好计算。然而可以从任意策略按照这个方式反过来导出使其成为最优的 reward:

\[r(x,y)=\beta\log\dfrac{\pi^*(y\mid x)}{\pi_\t{ref}(y\mid x)}+\beta\log Z(x) \]

于是在 BT model 假设下,也即

\[p(y_w\succ y_l\mid x)=\dfrac{\exp r(x,y_w)}{\exp r(x,y_w)+\exp r(x,y_l)} \\=\sigma(r(x,y_w)-r(x,y_l)) \\=\sigma\left(\beta\log\dfrac{\pi^*(y_w\mid x)}{\pi_\t{ref}(y_w\mid x)}-\beta\log\dfrac{\pi^*(y_l\mid x)}{\pi_\t{ref}(y_l\mid x)}\right) \]

于是逻辑链条成立:

  • 当前有一个策略 \(\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:

\[A_i=\dfrac{r_i-\bar r}{\sigma_r+\eps} \]

同一条 traj 中所有 step 通常共享同一个 advantage(也可以看做是把 per-traj 的 reward 通过 \(\gamma=1\) 摊到每一步)。然后直接使用标准 PPO \(\rho\) 模式 + 额外的 DPO 式 KL 正则项即可。

形式化地,在 LLM 场景(注意到上述叙述模式并没有限定 LLM),公式如下:

\[J=\E\left[\dfrac1G\sum_{i=1}^G\dfrac1{|y_i|}\sum_{t=1}^{|y_i|}\min(\rho_{i,t}A,\t{clip}(\rho_{i,t},1\pm\eps)A)-\beta\t D_\t{KL}(\pi_\theta\|\pi_\t{ref})\right] \]

原始 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

\[s_i=\left(\dfrac{\pi_\theta(y_i\mid x)}{\pi_{\theta_\t{old}}(y_i\mid x)}\right)^{1/|y_i|} \]

其中做了长度归一化以控制不同长度回答的尺度相近。同一 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。

posted @ 2026-08-31 17:48  Troverld  阅读(15)  评论(0)    收藏  举报