Diffusion-RL 复习(一):PPO 与 GRPO

4 minute read

Published:

目录


背景

鉴于新开始的项目,需要系统复习一下 Diffusion-RL 相关知识。本文先从强化学习中的基础 policy optimization 方法出发,整理 PPOGRPO 的核心思想、关键公式和训练流程。


一、PPO 算法

1. PPO 的目标

PPO 的目标是让 policy 更新更加稳定。

更具体地说,PPO 通过限制每一步 policy 的更新幅度,防止 policy 在单次更新中发生过大突变,从而提升训练稳定性。


2. 采样轨迹

首先,旧策略 $\pi_{\text{old}}$ 与环境交互,收集 $T$ 步轨迹:

\[\tau = (s_0, a_0, r_0), (s_1, a_1, r_1), \cdots\]

其中:

  • $s_t$:第 $t$ 步的状态;
  • $a_t$:第 $t$ 步采取的动作;
  • $r_t$:第 $t$ 步获得的奖励;
  • $\pi_{\text{old}}$:采样数据时使用的旧策略。

3. 计算 Advantage

3.1 TD 残差

先计算 TD 残差:

\[\delta_t = Q(s_t, a_t) - V_\phi(s_t)\]

在实际估计时,也常写成:

\[\delta_t = r_t + \gamma V_\phi(s_{t+1}) - V_\phi(s_t)\]

它表示:当前 action 相比当前状态下平均水平到底好多少。


3.2 GAE Advantage

使用 GAE(Generalized Advantage Estimation)估计 advantage:

\[\hat A_t = \sum_{l=0}^{T-t}(\gamma\lambda)^l\delta_{t+l}\]

其中:

  • $\gamma$:折扣因子;
  • $\lambda$:GAE 平滑系数;
  • $\delta_{t+l}$:未来 timestep 的 TD 残差。

当 $\lambda \to 0$ 时:

\[\hat A_t \approx \delta_t\]

此时更接近单步 TD,具有 低方差、高偏差 的特点。

当 $\lambda \to 1$ 时:

\[\hat A_t \approx \sum_{l=0}^{T-t}\gamma^l\delta_{t+l}\]

此时更接近 Monte Carlo 估计,具有 高方差、低偏差 的特点。

需要注意的是,这里的 $\lambda$ 建模的是从当前 $t$ 开始,后续每个 timestep 的 TD 残差贡献。

如果 policy 更新之后,后续状态分布和动作分布都会发生变化,那么旧数据里的 $\delta_{t+l}$ 就不一定能反映新策略下真实的 TD 残差。因此 PPO 仍然需要多轮与环境交互,持续收集新数据。


4. 概率比

对每一批数据,PPO 会做 $k$ 次 minibatch 更新。由于数据是由旧策略 $\pi_{\text{old}}$ 采集的,而当前要更新的是新策略 $\pi_\theta$,因此需要计算概率比:

\[r_t(\theta) = \frac{\pi_\theta(a_t \mid s_t)}{\pi_{\text{old}}(a_t \mid s_t)}\]

它表示:

新旧 policy 对同一个 action 概率的相对变化。

如果:

\[r_t(\theta) > 1\]

说明新策略比旧策略更倾向于选择该动作。

如果:

\[r_t(\theta) < 1\]

说明新策略比旧策略更不倾向于选择该动作。


5. Clip Loss

PPO 的 clipped objective 可以写成:

\[L^{\text{CLIP}}(\theta) = \mathbb{E}_t \left[ \min \left( r_t(\theta)\hat A_t, \operatorname{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)\hat A_t \right) \right]\]

训练时通常最大化该目标:

\[\max_\theta L^{\text{CLIP}}(\theta)\]

其中:

\[\operatorname{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)\]

表示把概率比限制在:

\[[1-\epsilon, 1+\epsilon]\]

例如,当 $\epsilon = 0.2$ 时:

\[r_t(\theta) \in [0.8, 1.2]\]

6. PPO 目标从哪里来

强化学习真正想最大化的是新策略下的期望回报:

\[J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta}[R(\tau)]\]

策略梯度定理给出:

\[\nabla_\theta J(\theta) = \mathbb{E}_{s_t, a_t \sim \pi_\theta} \left[ \nabla_\theta \log \pi_\theta(a_t \mid s_t) A^{\pi_\theta}(s_t, a_t) \right]\]

也就是说:

  • 当 $A_t > 0$ 时,说明该动作比平均水平好,希望提高它的概率;
  • 当 $A_t < 0$ 时,说明该动作比平均水平差,希望降低它的概率。

但是 PPO 手里的数据来自旧策略:

\[s_t, a_t \sim \pi_{\text{old}}\]

而不是当前新策略:

\[s_t, a_t \sim \pi_\theta\]

所以需要用重要性采样思想,把新策略下的期望改写成旧策略数据上的期望。

固定状态 $s_t$ 时,有:

\[\mathbb{E}_{a_t \sim \pi_\theta}[f(a_t)] = \mathbb{E}_{a_t \sim \pi_{\text{old}}} \left[ \frac{\pi_\theta(a_t \mid s_t)}{\pi_{\text{old}}(a_t \mid s_t)} f(a_t) \right]\]

令:

\[f(a_t) = \hat A_t\]

得到 PPO 的基础 surrogate objective:

\[L^{\text{PG}}(\theta) = \mathbb{E}_t\left[r_t(\theta)\hat A_t\right]\]

其中:

\[r_t(\theta) = \frac{\pi_\theta(a_t \mid s_t)}{\pi_{\text{old}}(a_t \mid s_t)}\]

这个目标可以理解为:

\[\text{新策略对该动作的偏好变化} \times \text{该动作在旧数据中看起来有多好}\]

7. 为什么需要 Clip

如果只使用基础目标:

\[L^{\text{PG}}(\theta) = \mathbb{E}_t\left[r_t(\theta)\hat A_t\right]\]

那么当 $\hat A_t > 0$ 时,优化器会倾向于让:

\[r_t(\theta) > 1\]

也就是提高该动作概率。

当 $\hat A_t < 0$ 时,优化器会倾向于让:

\[r_t(\theta) < 1\]

也就是降低该动作概率。

问题在于,某一次采样中 $\hat A_t > 0$,并不代表这个 action 永远是好的。如果没有限制,策略可能会把某个动作的概率从很小一下子推得很大,导致 policy 更新过猛、训练不稳定。

因此 PPO 引入 clip:

\[\operatorname{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)\]

使得:

\[r_t(\theta) \in [1-\epsilon, 1+\epsilon]\]

这样可以限制 policy 的更新幅度,防止

\[\frac{\pi_\theta(a_t \mid s_t)}{\pi_{\text{old}}(a_t \mid s_t)}\]

数值过于离谱。

外层取 $\min$ 的作用是:当概率比变化过大时,不再给策略继续扩大变化的额外收益,从而稳定训练。


8. 关于 KL Divergence 的补充

有 clip 往往不能完全保证 $\pi_\theta$ 和 $\pi_{\text{old}}$ 的整体 KL divergence 一定很小。

原因是:

clip 主要作用在当前采样到的 action 上,只能限制该 action 的概率比变化。

但是神经网络参数一旦更新,其他没有被当前样本直接约束的 action 分布也可能受到影响。

因此,即使某些 sampled action 的 ratio 被限制了,整体策略分布仍然可能发生较大变化,导致 KL divergence 变大。

也就是说:

\[\operatorname{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)\]

并不是一个严格的整体 KL 约束。


二、GRPO 算法

GRPO,全称 Group Relative Policy Optimization,可以看作是 PPO 在大语言模型场景中的一种重要变体。

它的核心思想是:

不训练额外的 value function,而是对同一个 prompt 生成多个回答,让这些回答在组内互相比较。


1. 从 PPO 的 Advantage 说起

在 PPO 中,计算 advantage 时通常需要 value function:

\[A_t = Q(s_t, a_t) - V(s_t)\]

一种近似写法是:

\[A_t \approx r_t + \gamma V(s_{t+1}) - V(s_t)\]

其中:

  • $Q(s_t, a_t)$:在状态 $s_t$ 下采取动作 $a_t$ 后的期望回报;
  • $V(s_t)$:状态 $s_t$ 的价值函数;
  • $A_t$:该动作相对于当前状态平均水平的优势。

因此,PPO 通常需要训练一个 value function 或 critic:

\[V_\phi(s)\]

但对于 LLM 来说,额外训练一个 value model 的成本往往很高。


2. GRPO 的核心思路

GRPO 不再训练 $V(s)$。

它不是问:

这个答案比 value function 估计的平均水平好多少?

而是问:

这个答案比同一个 prompt 下的其他答案好多少?

也就是说,GRPO 对同一个问题生成多条回答,然后做组内比较。

假设同一个 prompt 为:

\[q\]

模型生成 $G$ 个回答:

\[o_1, o_2, \dots, o_G\]

然后对每个回答打分:

\[r_1, r_2, \dots, r_G\]

3. 组内平均 Reward

对于同一个 prompt 下的一组回答,先计算组内平均 reward:

\[\bar r = \frac{1}{G}\sum_{i=1}^{G} r_i\]

再计算 reward 的标准差:

\[\sigma_r = \sqrt{\frac{1}{G}\sum_{i=1}^{G}(r_i - \bar r)^2}\]

4. 组内归一化 Advantage

GRPO 用组内归一化后的 reward 作为 advantage:

\[A_i = \frac{r_i - \bar r}{\sigma_r + \epsilon}\]

其中:

  • $r_i$:第 $i$ 个回答的 reward;
  • $\bar r$:同组回答的平均 reward;
  • $\sigma_r$:同组 reward 的标准差;
  • $\epsilon$:防止除零的小常数。

直观理解:

  • 如果 $A_i > 0$,说明该回答比同组平均水平更好;
  • 如果 $A_i < 0$,说明该回答比同组平均水平更差;
  • 如果 $A_i \approx 0$,说明该回答接近同组平均水平。

5. 为什么还需要重要性采样

GRPO 和 PPO 类似,也会使用旧策略生成样本,再用这些样本更新当前策略。

因此需要重要性采样概率比:

\[r_i(\theta) = \frac{\pi_\theta(o_i \mid q)}{\pi_{\theta_{\text{old}}}(o_i \mid q)}\]

其中:

  • $\pi_{\theta_{\text{old}}}$:生成回答时的旧策略;
  • $\pi_\theta$:当前正在更新的新策略;
  • $o_i$:第 $i$ 个回答;
  • $q$:prompt。

基础优化目标可以理解为:

\[\mathbb{E}[r_i(\theta) A_i]\]

也就是:

如果某个回答的组内 advantage 为正,就提高它的概率;

如果某个回答的组内 advantage 为负,就降低它的概率。


6. GRPO 的 Clip Objective

和 PPO 一样,GRPO 也需要限制策略更新幅度。

因此目标函数中也会使用 clipped ratio:

\[\min \left( r_i(\theta)A_i, \operatorname{clip}(r_i(\theta), 1-\epsilon, 1+\epsilon)A_i \right)\]

完整目标可以写成:

\[J_{\text{GRPO}}(\theta) = \mathbb{E} \left[ \frac{1}{G} \sum_{i=1}^{G} \min \left( r_i(\theta)A_i, \operatorname{clip}(r_i(\theta), 1-\epsilon, 1+\epsilon)A_i \right) - \beta D_{\mathrm{KL}}(\pi_\theta \Vert \pi_{\text{ref}}) \right]\]

其中:

  • $\epsilon$:clip 范围;
  • $\beta$:KL 惩罚系数;
  • $\pi_{\text{ref}}$:参考模型,通常是 SFT 模型或初始策略模型;
  • $D_{\mathrm{KL}}(\pi_\theta \Vert \pi_{\text{ref}})$:当前策略和参考策略之间的 KL 散度。

7. KL 惩罚项的作用

目标中的 KL 项:

\[-\beta D_{\mathrm{KL}}(\pi_\theta \Vert \pi_{\text{ref}})\]

主要有两个作用:

  1. 限制当前策略不要偏离参考模型太远;
  2. 防止模型在强化学习过程中出现灾难性遗忘。

如果没有 KL 约束,模型可能为了追求 reward 而破坏原本的语言能力、格式能力或安全对齐能力。


8. GRPO 训练流程

GRPO 的训练流程可以总结为:

  1. 采样 prompt 从训练集中采一个问题: \(q\)
  2. 生成多个回答 对同一个 prompt 生成 $G$ 个回答: \(o_1, o_2, \dots, o_G\)
  3. 给每个回答打分 使用 reward model、规则验证器或人工偏好模型得到: \(r_1, r_2, \dots, r_G\)
  4. 组内归一化 advantage 计算: \(A_i = \frac{r_i - \bar r}{\sigma_r + \epsilon}\)
  5. 更新 policy 使用 GRPO objective 更新策略: \(J_{\text{GRPO}}(\theta)\)