这篇文章对应视频:“[veRL] 核心强化学习算法,GRPO、RLOO、REINFORCE++、REINFORCE++ baseline”(BV1d4Yvz4EXA)。

但我不会把它写成“视频逐句笔记”,而是把 veRL 里这些算法放到同一个坐标系里讲清楚:

  1. 它们本质上都在解同一个问题:不用训练 critic,也能把 outcome reward 变成稳定的更新信号
  2. 它们真正的差异,主要集中在:baseline 怎么选、advantage 怎么归一、KL 怎么放
  3. 你应该怎么选:不是看算法名字,而是看你的任务 reward 形态(稀疏/密集、噪声/可验证、是否能 group sampling)。

系列导航:

建议先读(打通基础概念与日志诊断):

  1. PG→TRPO→PPO:推导与代码对齐
  2. PG loss 组件详解(PPO-clip / KL / Entropy / 聚合)
  3. veRL 训练参数理解(PPO/GRPO、Batch、KL、Entropy)

0. 资料对齐(视频 + 本地仓库)

视频:

本地仓库(你已下载)里,这篇最相关的材料我建议看这几个(不是必须全看):

  • GRPO 目标与聚合:
    • /Users/wangpeng/Downloads/modern_genai_bilibili-main/agentic_rl/verl/objectives/review_grpo.ipynb
    • /Users/wangpeng/Downloads/modern_genai_bilibili-main/agentic_rl/verl/objectives/agg_loss.ipynb
  • KL 的“in reward vs as loss”、以及 off-policy bias:
    • /Users/wangpeng/Downloads/modern_genai_bilibili-main/agentic_rl/training_practices/review_kl.ipynb
  • 训练崩溃(NaN / ratio 爆炸)的一类典型问题线索:
    • /Users/wangpeng/Downloads/modern_genai_bilibili-main/agentic_rl/verl/训练及调参经验/问题排查.ipynb
  • RLVR 评测侧:为什么这些算法的差异很多时候被“采样效率差距”淹没:

1. 统一坐标系:这些算法到底在优化什么

我们先把“共同的骨架”写下来。对每个 prompt $x$,policy $\pi_\theta$ 会采样输出序列 $y$(LLM 的 token 序列),我们有一个 outcome reward $R(x,y)$(verifiable reward / RM / judge 都可以)。

最原始的目标是最大化期望 reward:

$$J(\theta)=\mathbb{E}_{y\sim\pi_\theta(\cdot|x)}[R(x,y)]$$

用 REINFORCE 的 log-trick,可以得到经典策略梯度形式(省略 $x$ 的条件):

$$\nabla_\theta J(\theta)=\mathbb{E}[R(y)\nabla_\theta\log\pi_\theta(y)]$$

把它写成“最小化 loss”就是:

$$\mathcal{L}_{PG}(\theta)=-\mathbb{E}[R(y)\log\pi_\theta(y)]$$

到这里你会立刻遇到两类工程难题:

  1. 方差太大:reward 是 outcome-level、稀疏、噪声大,直接乘 logprob 会抖到你怀疑人生。
  2. 更新太猛:rollout 很贵,你会复用数据(多 epoch),这会让你从 on-policy 漂到轻度 off-policy,ratio 爆炸、NaN、输出塌缩都可能发生。

因此你看到的 GRPO / RLOO / REINFORCE++,本质上就是在这两个难题之间做取舍:

  • baseline / group relative 降方差(不训练 critic)。
  • clip / KL / 归一化 限制更新幅度,让训练别崩。

2. Baseline 的核心原则:降方差,但别把梯度搞偏

REINFORCE 里,一个重要结论是:你可以减去任何 baseline $b(x)$ 来降方差,只要它不依赖 action(在 LLM 里就是不依赖采样到的 $y$),梯度仍然无偏:

$$\mathbb{E}[(R-b)\nabla\log\pi]=\mathbb{E}[R\nabla\log\pi]$$

所以你会看到三类 baseline:

  1. critic baseline:$b=V_\phi(s)$(PPO/Actor-Critic 路线,稳定但要训练 value model)。
  2. group baseline:对同一 prompt 采样多条 $y_1,\dots,y_G$,用组内统计当 baseline(GRPO/RLOO 的路线)。
  3. batch baseline/whiten:不一定改最优点,只是把更新尺度稳定住(REINFORCE++ baseline 常落在这里)。

这个章节的关键 takeaway 是:

你选择的 baseline 决定了“你到底在把 reward 的哪一部分当作学习信号”。
baseline 选错,最常见的不是不收敛,而是收敛到一种很会骗指标的行为


3. GRPO:Group Relative Policy Optimization(“不用 critic 的 PPO 风格更新”)

3.1 为什么 GRPO 天然适配 RLVR(math/coding)

GRPO 的前提是:对同一 prompt,你愿意采样一个 group(比如 $G=8$ 或 $G=16$):

  • $y_1,\dots,y_G\sim\pi_{\theta_{\text{old}}}(\cdot|x)$
  • reward:$R_i=R(x,y_i)$

然后你用组内的均值/方差做相对化,构造 advantage:

$$\hat A_i=\frac{R_i-\text{mean}(\mathbf R)}{\text{std}(\mathbf R)+\epsilon}$$

直觉:你不再关心“这条输出绝对分数是多少”,而关心“它在同一个 prompt 的候选里排第几”。

这个设计对 RLVR 很友好:

  1. verifiable reward 常常是 0/1(或少数离散档),绝对尺度没什么意义。
  2. 你最终也会做 pass@k 多采样;GRPO 直接把“多采样”引入训练闭环。

3.2 为什么 GRPO 里会出现 PPO-clip 的 ratio

GRPO 在 veRL 的实现里通常仍然是 PPO 风格的 clipped surrogate(用旧策略采样数据,用新策略更新):

$$\rho_{i,t}(\theta)=\exp(\log\pi_\theta(a_{i,t}|s_{i,t})-\log\pi_{\theta_{\text{old}}}(a_{i,t}|s_{i,t}))$$

$$\mathcal{L}_{\text{clip}}=\mathbb{E}\big[\min(\rho\hat A,\ \text{clip}(\rho,1-\varepsilon,1+\varepsilon)\hat A)\big]$$

这里的 “$\rho$” 是 ratio(为了和 reward $R$ 区分,我不写成 $r$)。

3.3 GRPO 最常见的两个坑:std=0 与 ratio overflow

  1. 组内 std=0
    • 如果一个 group 里 reward 全一样(例如全部 0),$\text{std}(\mathbf R)=0$,不加 $\epsilon$ 直接 NaN。
    • 这在稀疏 reward(大部分样本都错)时非常常见。
  2. ratio overflow
    • 如果 $\log\pi_\theta-\log\pi_{\theta_{\text{old}}}$ 变大,$\exp$ 会溢出为 inf,接着 loss/grad 就 NaN。
    • 这类问题在实践里经常被描述成“ratio 爆炸,clamp 不能根治”,根因通常是 更新幅度太大(LR 太大、epoch 太多、adv 尺度太大、聚合方式导致有效学习率变大等)。

如果你看到 NaN,第一反应不是“再加 clamp”,而是回到日志闭环:

  • approx_kl(old,new)clip_fractiongrad_norm 是否同时飙升?
  • group reward 的分布是否极端稀疏(全 0)?

然后再决定是改算法(比如用 REINFORCE++ baseline)还是改参数(更保守的 update)。


4. RLOO:REINFORCE Leave-One-Out(更“守规矩”的 group baseline)

4.1 RLOO 的核心:baseline 不用自己的 reward

GRPO 的组均值 baseline 会把 $R_i$ 自己也包含进去。严格来说,这个 baseline 对样本 $i$ 来说是 action-dependent 的(因为 $R_i$ 取决于 $y_i$),可能引入偏差。

RLOO 的解决办法是:对样本 $i$,baseline 用“除了自己之外的均值”:

$$b_i=\frac{1}{G-1}\sum_{j\ne i}R_j$$

$$A_i=R_i-b_i=\frac{G}{G-1}(R_i-\text{mean}(\mathbf R))$$

你可以把它理解成:

  • 仍然是“组内相对比较”
  • 但 baseline 的定义更符合“baseline 不依赖当前 action”这条经典原则

4.2 RLOO 的真实作用:不是让你更强,而是让信号更干净

在很多任务上,RLOO 的收益不是“指标突然大幅上升”,而是:

  1. 更新更可解释:你更接近在优化“超越组内其他样本的程度”。
  2. 行为更不容易被“自我干扰”:baseline 不被自身 reward 污染。

但它也有代价:

  • 你仍然需要 group sampling(成本不低)。
  • $G/(G-1)$ 的缩放会放大 advantage 的幅度(如果你没有配套的 whiten/clip/KL 约束,训练反而更容易炸)。

所以它通常不是“开箱即用更稳”,而是“把 bias 的锅移开,让你更容易定位稳定性问题来自哪里”。


5. REINFORCE++ baseline:把“归一化的随机性”从 group 挪到 batch

5.1 一句话解释

在工程里,GRPO 最脆的一步往往不是 ratio,也不是 clip,而是 组内 std

  • reward 稀疏时,组内 std 极不稳定,甚至频繁为 0
  • 于是 advantage 会出现 NaN 或极端放大

REINFORCE++ baseline 的常见思路是:

  1. baseline 仍然用组均值(做相对化):
    • $$\tilde A_i=R_i-\text{mean}(\mathbf R)$$
  2. 但归一化不用组内 std,而用 batch 级统计(更稳定):
    • $$\hat A_i=\frac{\tilde A_i}{\text{std}(\tilde A\ \text{over batch})+\epsilon}$$

这会带来一个很现实的收益:

  • 只要你的 batch 足够大,std 就不会频繁为 0;
  • advantage 的尺度在训练过程中更一致,更容易调学习率和 KL 系数。

5.2 这不是“更正确”,而是更可控

把 std 从 group 挪到 batch,本质上是在做一个工程选择:

  • GRPO 的“归一化”更局部、更自洽,但也更不稳定;
  • REINFORCE++ baseline 的“归一化”更全局、更稳定,但它引入了跨 group 的耦合(不同 prompt 的 reward 分布会互相影响尺度)。

你该怎么选?

  1. 如果 reward 稀疏到让组内 std 经常为 0:优先考虑 REINFORCE++ baseline。
  2. 如果你希望每个 prompt 的训练信号都只由自身 group 决定:GRPO 更符合这个直觉。

6. KL 放哪:in reward vs as loss(不要把它当“实现细节”)

在 LLM-RL 里,KL 既可以写进 reward(dense shaping),也可以作为单独 loss(regularization)。这不是语法差异,它会改变训练动态:

  1. KL in reward
    • 你把每一步偏离 ref 的代价当成 reward 的一部分,advantage/return 会被它影响。
    • 好处:更像“每步都扣分”的稠密信号;坏处:它会和 baseline/归一化强耦合,导致你很难判断“到底是任务 reward 在驱动,还是 KL 在驱动”。
  2. KL as loss
    • advantage 主要反映任务 reward,KL 作为独立正则单独控制漂移。
    • 好处:更好调参与诊断;坏处:如果你的任务 reward 极稀疏,单独 KL 可能会让训练更像“什么都不学,只是在原地”。

我更偏向的工程原则是:

  1. 先把 KL 当作独立 loss(便于诊断),把 approx_kl/entropy/clipfrac 闭环跑顺。
  2. 只有当你非常确定“任务 reward 太稀疏”,且你需要更稠密的 shaping,再把 KL 放进 reward(并且要重新校准 baseline/归一的尺度)。

7. 一份更实用的选型指南(给做 agentic RL / deep research 的你)

把这些算法和任务形态对齐,我给你一个不花哨但能落地的建议顺序:

  1. reward 可验证(0/1 或少数离散档),你能 group sampling
    • 先试 GRPO(最接近“无 critic 的 PPO”)
    • 如果经常 std=0 或 NaN,切到 REINFORCE++ baseline(更稳定的尺度)
    • 如果你非常在意 baseline 的无偏性,或者想把 bias 这一项从误差来源里排除,再试 RLOO
  2. reward 噪声大(judge/RM),但你仍然 group sampling
    • 你要先做 reward 的单元测试与对抗样本(否则 RL 一定会放大漏洞)
    • 在算法上,REINFORCE++ baseline 往往比 GRPO 更不容易因为归一化噪声而炸
  3. deep research 这类“多步工具调用 + 长上下文”任务
    • 不建议一上来就把 RL 用在 token policy 上
    • 更现实的路径是:先把 RL 用在“agent 决策层”(检索/阅读/引用/停止/预算分配),让 reward 更可控、更可验证

最后补一句:GRPO/RLOO/REINFORCE++ 解决的主要是 variance/control,不是 capability creation。如果你期待“模型学会以前不会的东西”,你仍然需要:

  • curriculum / distill / tool-augmented data(把新轨迹带进可学习分布)
  • 再用 RL 把采样效率和稳定性做上去

8. 小结

把本文压缩成三句话:

  1. GRPO/RLOO/REINFORCE++ baseline 的核心差异不是“RL 更强”,而是 baseline 与归一化设计
  2. 训练不稳时,优先怀疑 advantage 统计与 ratio 漂移,别先怀疑模型。
  3. 你做 agentic RL 的关键不是挑一个算法名字,而是把 reward 可信度 + 评测闭环 + 日志诊断先搭起来。