← all notes

LLM 强化学习算法谱系:从 REINFORCE 到 GDPO

RLLLMPPOGRPO

这是我系统梳理大语言模型强化学习(LLM RL)算法脉络的笔记。我把 REINFORCE、PPO、GRPO、DAPO、GSPO、GDPO 一篇篇读下来,发现它们其实在三个互相独立的维度上各自演进。先把这张总图放在最前面,后面每个算法都对号入座。

一张图理清三条主线

策略梯度方法可以拆成三个正交的设计维度,每个算法都是在某一维上往前走了一步:

                     策略梯度的三个维度
   ┌─────────────────┬─────────────────┬─────────────────┐
   │  Variance 控制   │  Trust Region    │  Reward 结构     │
   │  (方差缩减)     │  (信赖域)       │  (奖励聚合)     │
   ├─────────────────┼─────────────────┼─────────────────┤
   │ REINFORCE        │                  │                  │
   │   baseline       │                  │                  │
   │      ↓           │                  │                  │
   │ PPO: advantage   │ PPO: clip ratio  │                  │
   │      ↓           │      ↓           │                  │
   │ GRPO: group-rel  │ DAPO: clip-higher│                  │
   │   advantage      │      ↓           │                  │
   │                  │ GSPO: sequence-  │                  │
   │                  │   level ratio    │ GDPO: 多奖励      │
   │                  │                  │   分别归一        │
   └─────────────────┴─────────────────┴─────────────────┘

1. REINFORCE (Williams, 1992):策略梯度的原点

要解决的问题:奖励 rr 是环境给的一个分数,它不是网络参数的可微函数,没法直接对它求导。

REINFORCE 的核心思想是绕开"对奖励求导",改成"对动作的概率求导"。目标是最大化期望回报:

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

策略梯度定理给出:

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

直觉:回报高的轨迹,就提高它出现的概率;回报低的,就压低。论文里的更新式逐项拆开是

Δwij=αij学习率  (rbij)这次比平时好多少  wlogπ往这个动作的方向\Delta w_{ij} = \underbrace{\alpha_{ij}}_{\text{学习率}}\; \underbrace{(r - b_{ij})}_{\text{这次比平时好多少}}\; \underbrace{\nabla_{w}\log \pi}_{\text{往这个动作的方向}}

关键的 bbbaseline(基线)。减去它不改变梯度的期望(无偏),却能大幅降低方差——这是后面所有算法"advantage"的雏形:我们真正在乎的不是绝对回报,而是比平均好多少


2. PPO (Schulman et al., 2017):给 REINFORCE 打三个补丁

PPO 本质上是 REINFORCE 的三个补丁:

  1. 用 advantage A^t\hat A_t 替代原始 return(GAE 估计)→ 降方差;
  2. 引入重要性采样,允许在同一批数据上做多次 epoch 更新 → 提高数据利用率;
  3. clip 把策略更新限制在信赖域内 → 防止走太远训崩。

在 RLHF-PPO 里,场景中有四个模型

模型 角色
Actor(策略) 正在训练的 LLM
Critic(价值网络) 估计每个 token 的 value,用来算 advantage
Reward Model 给完整回答打分
Reference 冻结的初始策略,KL 约束的锚点

PPO 的裁剪目标函数:

LCLIP(θ)=Et ⁣[min ⁣(ρtA^t,  clip(ρt,1ϵ,1+ϵ)A^t)]L^{\text{CLIP}}(\theta) = \mathbb{E}_t\!\left[ \min\!\Big( \rho_t \hat A_t,\; \text{clip}(\rho_t, 1-\epsilon, 1+\epsilon)\, \hat A_t \Big) \right]

其中 ρt=πθ(atst)πθold(atst)\rho_t = \dfrac{\pi_\theta(a_t\mid s_t)}{\pi_{\theta_{\text{old}}}(a_t\mid s_t)} 是重要性比。clip 的作用:一旦新旧策略偏离太远,就把比值"夹住",不让这一步更新继续放大,从而保持在信赖域内。

PPO 的两个痛点恰恰成为后续工作的切入口:Critic 太贵(又一个大模型),token 级 value 难学(LLM 通常只有最后一个 token 才有 reward)。


3. GRPO (DeepSeekMath, Shao et al., 2024):删掉 Critic

一句话:GRPO = 把 PPO 里那个又贵又难训的 Critic 删掉,改用"同一道题多答几遍、互相比一比"来算 advantage。

GRPO 第一刀就砍掉 Critic,只剩 Actor / Reward Model / Reference 三个模型。它怎么算 advantage?对同一个 prompt 采样一组 GG 个回答 {y1,,yG}\{y_1,\dots,y_G\},用组内归一化当优势:

A^i=rimean{r1,,rG}std{r1,,rG}\hat A_i = \frac{r_i - \text{mean}\{r_1,\dots,r_G\}}{\text{std}\{r_1,\dots,r_G\}}

整条回答里所有 token 共享这同一个标量优势 A^i\hat A_i。这样既不需要 Critic,又天然带了 baseline(组内均值)。重要性比和 clip 几乎照搬 PPO。

GRPO 简单高效,但在大规模长 CoT 训练里暴露出新问题——这就是 DAPO 的舞台。


4. DAPO (ByteDance Seed, 2025):四个工程补丁

DAPO 不是新算法,而是给 GRPO 打的四个补丁。名字本身就是其中两个补丁的缩写:Decoupled clip And dynamic samPling Policy Optimization。

病灶 现象 解药
熵塌缩 训练几百步后 entropy 暴跌、采样高度趋同 Clip-Higher:把上下裁剪边界解耦,给"探索方向"更大的上界
梯度浪费 组内全对/全错 → advantage 全为 0,整组没梯度 Dynamic Sampling:动态重采样,剔除全对/全错的组
长度偏置 长样本被 sample 级平均稀释,长 CoT 学不动 Token-level loss:损失在 token 级聚合而非 sample 级
超长惩罚突变 截断惩罚是硬阶跃,噪声大 Overlong Reward Shaping:把超长惩罚做成软的渐变

这四个补丁的共同点:都是大规模、长推理训练里才会暴露的坑。骨架仍是 GRPO(组内比较算优势 + clip 更新)。


5. GSPO (Qwen Team, 2025):掀桌子,比值从 token 级换到 sequence 级

前面 DAPO 是"打补丁",GSPO 是掀桌子。Qwen 团队(训出 Qwen3 的算法)直接说:GRPO/DAPO 共用的那个 token 级重要性比 ρi,t\rho_{i,t},从数学原理上就是错的,不是调参能救的。

回忆重要性采样的原理:它是为了用分布 A 的样本去估计分布 B 下的期望,整体(sequence 级)才是良定义的。而 GRPO 在每个 token 上单独算比值再相乘/裁剪,等价于在 token 级做 IS——但 token 级的分布匹配根本没有对应的期望意义,长序列上这些比值连乘会带来剧烈的方差与偏置。

GSPO 的修法:把重要性比定义在整条回答上(sequence-level),用序列似然比并做长度归一:

si(θ)=(πθ(yix)πθold(yix))1/yis_i(\theta) = \left( \frac{\pi_\theta(y_i\mid x)}{\pi_{\theta_{\text{old}}}(y_i\mid x)} \right)^{1/|y_i|}

优势仍是组内归一的标量(注意下标只有 ii,没有 tt):

A^i=r(x,yi)mean{r(x,yj)}std{r(x,yj)}\hat A_i = \frac{r(x,y_i) - \text{mean}\{r(x,y_j)\}}{\text{std}\{r(x,y_j)\}}

一个我一开始搞混的点:GSPO 的优势本来就是 sequence 级标量(整条回答共享),这点和 GRPO 一样;GSPO 真正改的是重要性比——从 token 级换成 sequence 级。别把"优势"和"重要性比"混为一谈。


6. GDPO (NVIDIA, 2026):多奖励,分别归一再相加

GDPO 换了战场:multi-reward(多奖励)。真实 Agent 训练常常要同时满足好几个目标——答案正确、格式合规、长度受控、工具调用合法、代码无 bug……

过去的做法是先加和再归一化

rsum=r1+r2++rn,A^=rsummeanstdr_{\text{sum}} = r_1 + r_2 + \cdots + r_n,\qquad \hat A = \frac{r_{\text{sum}} - \text{mean}}{\text{std}}

NVIDIA 证明这是错的:不同奖励的量纲和方差不同,简单加和后再归一化,会发生 advantage 塌缩——方差大的那个奖励主导一切,其它奖励的信号被压平、几乎学不到。

GDPO 的修法:每个奖励分别归一化,再相加

A^=k=1nrkmean(rk)std(rk)\hat A = \sum_{k=1}^{n} \frac{r_k - \text{mean}(r_k)}{\text{std}(r_k)}

这样每个目标都贡献一个"自己尺度下"的干净优势信号,互不淹没。


7. 补课:信用分配与 V / Q / A

读到 GSPO 反复出现"整条轨迹所有 token 共享同一个优势,模型分不清哪一步是功臣",我意识到这就是经典 RL 的**信用分配(credit assignment)**问题。补两块基础。

7.1 V、Q、A 三个价值量

设状态 xx(LLM 里 = prompt + 已生成 token)、动作 aa(= 下一个 token)、策略 π\pi

优势正是前面所有算法的核心——REINFORCE 的 (rb)(r-b)、GRPO 的组内归一,都是在估这个"比平均好多少"。

7.2 HCA (Harutyunyan et al., NeurIPS 2019)

经典 RL 用价值函数做信用分配,但价值函数把整条轨迹的回报"摊平",分不清功臣。Hindsight Credit Assignment 反过来问:已知最终成功了,反推回去——哪个动作真正提升了成功概率? 它通过对"未来结果做条件"来估计动作的相关性 hzh_z,是把信用精确分配到 step 的奠基性思路。

7.3 HCAPO (Tan, 2026):把 HCA 搬进 LLM Agent

原始 HCA 要额外训练一个模型去估 hh,在 LLM 上不现实。HCAPO 最大的工程贡献是不训练任何新模型,直接让 LLM 自己当"事后诸葛"——用模型自身在"已知结果"条件下的概率来近似 hindsight 相关性。

⚠️ 粒度澄清:HCAPO 工作在 step(动作)级而非 token 级。这里一个"动作"就是 agent 在一个 turn 里产生的完整决策(如点击一个按钮、发出一次搜索查询)。论文把任务建模成 POMDP,每个时间步 agent 收到观测 oto_t,生成动作 ata_t,得到长度 TT 的轨迹。


一句话总结表

算法 在哪个维度 关键改动
REINFORCE Variance baseline,把"绝对回报"换成"比平均好多少"
PPO Variance + Trust Region advantage + 重要性采样 + clip
GRPO Variance 删 Critic,组内归一当优势
DAPO Trust Region (+工程) 四补丁:clip-higher / 动态采样 / token-level loss / 超长 shaping
GSPO Trust Region 重要性比从 token 级 → sequence 级
GDPO Reward 结构 多奖励分别归一再相加,防优势塌缩
HCA / HCAPO Credit Assignment 用"事后视角"把信用精确分到每个 step

做 Agent RL 的实战选型直觉:单奖励、对算力敏感 → GRPO;大规模长 CoT 训练 → 在 GRPO 上叠 DAPO 的补丁;序列很长、追求稳定 → 上 GSPO 的 sequence-level 比值;多目标奖励 → 用 GDPO 的分别归一;需要更细粒度的功劳归属 → 借鉴 HCAPO 的 hindsight 思路。

(本文整理自我和 Claude Code 的一次学习会话,论文均下载精读。如有理解偏差欢迎指正。)