LLM 强化学习算法谱系:从 REINFORCE 到 GDPO
这是我系统梳理大语言模型强化学习(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: 多奖励 │
│ │ │ 分别归一 │
└─────────────────┴─────────────────┴─────────────────┘
- Variance 维度:怎么让梯度估计的方差更小、信号更干净。REINFORCE 的 baseline → PPO 的 advantage → GRPO 的组内相对优势。
- Trust Region 维度:怎么防止一步更新走太远把策略训崩。PPO 的 clip → DAPO 的 clip-higher → GSPO 把比值从 token 级换到 sequence 级。
- Reward 结构维度:奖励本身怎么组织。GDPO 处理的是多奖励场景下的归一化问题。
1. REINFORCE (Williams, 1992):策略梯度的原点
要解决的问题:奖励 是环境给的一个分数,它不是网络参数的可微函数,没法直接对它求导。
REINFORCE 的核心思想是绕开"对奖励求导",改成"对动作的概率求导"。目标是最大化期望回报:
策略梯度定理给出:
直觉:回报高的轨迹,就提高它出现的概率;回报低的,就压低。论文里的更新式逐项拆开是
关键的 是 baseline(基线)。减去它不改变梯度的期望(无偏),却能大幅降低方差——这是后面所有算法"advantage"的雏形:我们真正在乎的不是绝对回报,而是比平均好多少。
2. PPO (Schulman et al., 2017):给 REINFORCE 打三个补丁
PPO 本质上是 REINFORCE 的三个补丁:
- 用 advantage 替代原始 return(GAE 估计)→ 降方差;
- 引入重要性采样,允许在同一批数据上做多次 epoch 更新 → 提高数据利用率;
- clip 把策略更新限制在信赖域内 → 防止走太远训崩。
在 RLHF-PPO 里,场景中有四个模型:
| 模型 | 角色 |
|---|---|
| Actor(策略) | 正在训练的 LLM |
| Critic(价值网络) | 估计每个 token 的 value,用来算 advantage |
| Reward Model | 给完整回答打分 |
| Reference | 冻结的初始策略,KL 约束的锚点 |
PPO 的裁剪目标函数:
其中 是重要性比。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 采样一组 个回答 ,用组内归一化当优势:
整条回答里所有 token 共享这同一个标量优势 。这样既不需要 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 级重要性比 ,从数学原理上就是错的,不是调参能救的。
回忆重要性采样的原理:它是为了用分布 A 的样本去估计分布 B 下的期望,整体(sequence 级)才是良定义的。而 GRPO 在每个 token 上单独算比值再相乘/裁剪,等价于在 token 级做 IS——但 token 级的分布匹配根本没有对应的期望意义,长序列上这些比值连乘会带来剧烈的方差与偏置。
GSPO 的修法:把重要性比定义在整条回答上(sequence-level),用序列似然比并做长度归一:
优势仍是组内归一的标量(注意下标只有 ,没有 ):
一个我一开始搞混的点:GSPO 的优势本来就是 sequence 级标量(整条回答共享),这点和 GRPO 一样;GSPO 真正改的是重要性比——从 token 级换成 sequence 级。别把"优势"和"重要性比"混为一谈。
6. GDPO (NVIDIA, 2026):多奖励,分别归一再相加
GDPO 换了战场:multi-reward(多奖励)。真实 Agent 训练常常要同时满足好几个目标——答案正确、格式合规、长度受控、工具调用合法、代码无 bug……
过去的做法是先加和再归一化:
NVIDIA 证明这是错的:不同奖励的量纲和方差不同,简单加和后再归一化,会发生 advantage 塌缩——方差大的那个奖励主导一切,其它奖励的信号被压平、几乎学不到。
GDPO 的修法:每个奖励分别归一化,再相加。
这样每个目标都贡献一个"自己尺度下"的干净优势信号,互不淹没。
7. 补课:信用分配与 V / Q / A
读到 GSPO 反复出现"整条轨迹所有 token 共享同一个优势,模型分不清哪一步是功臣",我意识到这就是经典 RL 的**信用分配(credit assignment)**问题。补两块基础。
7.1 V、Q、A 三个价值量
设状态 (LLM 里 = prompt + 已生成 token)、动作 (= 下一个 token)、策略 :
- 状态价值 :在状态 下,按 走到底的期望回报。
- 动作价值 :在 下先强制走动作 ,之后按 的期望回报。
- 优势 :动作 比平均水平好多少。
优势正是前面所有算法的核心——REINFORCE 的 、GRPO 的组内归一,都是在估这个"比平均好多少"。
7.2 HCA (Harutyunyan et al., NeurIPS 2019)
经典 RL 用价值函数做信用分配,但价值函数把整条轨迹的回报"摊平",分不清功臣。Hindsight Credit Assignment 反过来问:已知最终成功了,反推回去——哪个动作真正提升了成功概率? 它通过对"未来结果做条件"来估计动作的相关性 ,是把信用精确分配到 step 的奠基性思路。
7.3 HCAPO (Tan, 2026):把 HCA 搬进 LLM Agent
原始 HCA 要额外训练一个模型去估 ,在 LLM 上不现实。HCAPO 最大的工程贡献是不训练任何新模型,直接让 LLM 自己当"事后诸葛"——用模型自身在"已知结果"条件下的概率来近似 hindsight 相关性。
⚠️ 粒度澄清:HCAPO 工作在 step(动作)级而非 token 级。这里一个"动作"就是 agent 在一个 turn 里产生的完整决策(如点击一个按钮、发出一次搜索查询)。论文把任务建模成 POMDP,每个时间步 agent 收到观测 ,生成动作 ,得到长度 的轨迹。
一句话总结表
| 算法 | 在哪个维度 | 关键改动 |
|---|---|---|
| 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 的一次学习会话,论文均下载精读。如有理解偏差欢迎指正。)