从 PPO 到 RSPO:大模型 RL 对齐算法演进全解
五算法原理、公式推导与场景选择——附完整数学细节
大模型训练通常分三个阶段:预训练(学知识)→ SFT(学对话)→ RL 对齐(学偏好)。前两步大家很熟了,而 RL 对齐这一步——也就是让模型学会"什么样的回答是好的"——是近年演进最快的领域。
本文沿着 PPO → DPO → SimPO → GRPO → RSPO 五条技术分支,把每个算法的目标函数、推导过程、核心公式、实现伪代码、以及它们之间的演进关系讲透。
目标读者:想要亲自实现 RLHF 或理解 DeepSeek-R1 训练原理的工程师。
一张图看发展脉络
PPO — OpenAI (Schulman et al.)
通用 RL 算法。后被引入 ChatGPT RLHF,成为工业标准。
DPO — Stanford (Rafailov et al.)
用 Bradley-Terry 偏好模型消除 Reward Model。RLHF 不再必须用 RL。
SimPO — Princeton (Meng et al.)
以平均 log prob 替代 reference model。消除长度偏差,训练推理一致。
GRPO — DeepSeek (Shao et al.)
组内标准化优势 + 在线采样。DeepSeek-R1 的核心训练算法。
RSPO — Kuaishou (Xue et al.)
List-wise NDCG 优化。推荐/广告场景的生成式 RL 新范式。
一条清晰的演进方向:越来越少的外部依赖,越来越直接的优化目标。从需要 4 个模型到只要 1 个,从间接的 per-token reward 到直接的 list-wise NDCG。
一、PPO:一切开始的地方
1.1 背景:Policy Gradient 的不稳定性
强化学习的基本框架是:智能体在状态 s 下采取动作 a,获得奖励 r。策略 πθ(a|s) 是给定状态选择动作的概率分布。Policy Gradient 直接对策略参数 θ 求梯度:
问题在哪?想象你在调一个老式收音机旋钮。Policy Gradient 的更新等价于:往上次能得到好信号的方向拧一下。但拧多少?原始 REINFORCE 不控制步长——拧太少训练太慢,拧太多策略"崩了"(模型开始胡说八道)。PPO 的核心贡献就是给这个旋钮加了一个"阻尼器"。
1.2 两个关键技术前提
前提 1:Advantage 函数(GAE)
原始 REINFORCE 用累积奖励 Rt 作为优化信号,方差很大。PPO 改用 Advantage 函数 At:这个动作比"平均水平"好多少?
其中 δt = rt + γ · V(st+1) - V(st) 是 TD 误差
这也是为什么 PPO 需要 Value Model——它负责估计"当前状态大概能拿多少分",有了它才能算 advantage。
前提 2:重要性采样比率
PPO 是在线策略算法:模型自己生成数据,然后用这些数据更新自己。但更新后策略变了,旧数据的采样分布就不准了。解决方法是重要性采样比率:
1.3 PPO-Clip:核心创新
有了 rt(θ) 和 At,最朴素的更新是 rt(θ) · At——好的动作放大,差的动作缩小。但没有任何限制,rt 可以跑到 100 甚至 1000,导致策略剧烈跳变。PPO 的做法是 clip 截断:
这个 min(·, clip(·)) 结构是 PPO 的灵魂。分两种情况理解:
📐 情况分析——为什么 min + clip 能防止策略崩塌?
因为 At > 0,clip 的上限生效:rt 最大被限制为 1+ε。也就是说,即使新策略对这个动作的偏好是旧策略的 10 倍(rt=10),loss 也只按 1+ε 计算,阻止策略对这个好动作过于激进地加码。
因为 At < 0,clip 的下限生效:rt 最小被限制为 1-ε。也就是说,即使新策略对这个动作的偏好降到旧策略的 0.01 倍(rt=0.01),loss 也只按 1-ε 计算,阻止策略完全遗忘这个动作。
直观理解:把策略想象成一个天平。At > 0 的动作想往右移,At < 0 的动作想往左移。PPO 的 clip 机制给两边都画了一道"勿越"的红线——你可以调,但不能一次调太多。
1.4 PPO 在 RLHF 中的完整 Loss
在大模型 RLHF 中,PPO 通常有三个分量:
项 2:KL 散度惩罚,防止策略偏离初始 SFT 模型太远("遗忘"通用能力)
项 3:预训练损失(auxiliary PTX loss),保持语言建模能力
这就是 InstructGPT / ChatGPT 的训练方案。四项同时加载:策略模型、参考模型、Reward Model、Value Model——4 个模型,显存爆炸。但当时没有更好的方案。
1.5 PPO 实现伪代码
PPO for RLHF — 单步训练循环
1.6 PPO 的优缺点总结
✅ 优势
- Clip 机制保证训练稳定,不易崩塌
- 在线采样 → 策略可以自我探索,逐步改善
- 理论上可以优化任意 reward function
- 工业验证充分(ChatGPT / Claude 早期均基于此)
❌ 缺陷
- 需要同时跑 4 个模型,工程复杂度极高
- Reward Model 可能被"刷分"攻破(reward hacking)
- 超参数多:clip ε、KL β、GAE (γ,λ)、学习率、epoch 数 K
- 采样-训练-更新循环慢,迭代周期长
二、DPO:数学消除 Reward Model
2.1 核心洞察:Reward Model 可以被解出来
DPO 的作者做了一个关键的数学观察。RLHF 的优化目标是:
这个带 KL 约束的优化问题有闭式解!最优策略 π* 的表达式中,reward 函数可以被反解出来。然后代入 Bradley-Terry 偏好模型(人类偏好概率模型),reward 项就神奇地消掉了。
2.2 完整推导
📐 DPO 推导四步走
其中 Z(x) 是配分函数(归一化常数)。
reward 可以完全用策略比率表达。
Bradley-Terry 模型假设:人类偏好 yw 胜 yl 的概率为:
σ 是 sigmoid 函数。
log Z(x) 消掉了!不需要知道它的值。
最终得到 DPO 的损失函数——它等价于优化 RLHF 目标,但不再需要 Reward Model!
其中 ρθ = log πθ(yw|x)/πref(yw|x) - log πθ(yl|x)/πref(yl|x)
β 控制偏好强度——β 越小,偏好信号越弱(需要更多的偏好差异才能产生有效梯度);β 越大,偏好信号越强(但可能过拟合标注偏差)。
2.3 DPO 的梯度分析——模型实际学到了什么?
对 θ 求梯度,得到:
· 当模型已经很好地偏好 yw 时(ρθ 很大),σ(-β·ρθ) → 0,梯度很小 → 不需要再学
· 当模型分不清 yw 和 yl 时(ρθ ≈ 0),σ(-β·ρθ) ≈ 0.5,梯度最大 → 重点学这些难的
· 当模型错误地偏好 yl 时(ρθ < 0),σ(-β·ρθ) → 1,梯度最强 → 需要纠正
这个自适应权重机制是 DPO 稳定好用的关键——它自动把训练资源集中在"分不清"和"分错了"的样本上。
2.4 DPO 实现伪代码
DPO 训练步骤
2.5 DPO 的局限
- 仍需 Reference Model:虽然干掉了 RM,但
πref还在,两模型同时加载 - Pairwise 信号信息量有限:只知道"谁更好",不知道"好多少"
- β 是全局超参:对所有样本同一种偏好强度,无法自适应调节
- 训练-推理不一致:训练时算相对概率(rel. to
πref),推理时只用πθ,存在 mismatch
三、SimPO:再砍掉 Reference Model
3.1 动机:DPO 里的 Reference Model 带来什么麻烦?
DPO 的目标中始终存在 log πθ(y)/πref(y) 这一项。两个问题:
- 显存:两个模型(策略 + 参考)同时驻留 GPU,限制了可训练的模型规模
- 长度偏差(Length Bias):DPO 已被大量实验证实会偏向生成更长的回答。原因在于:
3.2 SimPO 的核心设计
SimPO 的做法极其简洁:用策略自己生成回答的平均 log probability 作为 reward。不需要任何参考模型。
3.3 SimPO Loss
β 是 scaling factor,控制整体偏好信号的强弱。
对比 DPO 和 SimPO 的梯度:
其中 Δr = r(x, yw) - r(x, yl)
关键区别:SimPO 的梯度天然做了长度归一化,不会偏向长回答。
3.4 SimPO 的关键改进
| 改进点 | DPO | SimPO |
|---|---|---|
| Reward 定义 | log πθ/πref(相对参考模型) | (1/|y|)·Σ log πθ(绝对平均 log prob) |
| GPU 模型数 | 2 个(策略 + 参考) | 1 个(仅策略) |
| 长度偏差 | 存在,偏向长回答 | 无,平均 log prob 天然校正 |
| 训练-推理一致 | 不一致(训练时用 πref,推理时不用) | 一致(训练和推理用同一个 reward 定义) |
| Margin | 无 | 有(γ),要求好回答显著优于差回答 |
四、GRPO:组内互比,在线探索
4.1 动机:离线偏好数据的局限
DPO 和 SimPO 处理的都是离线偏好数据——需要事先标注好"A 比 B 好"的数据集。问题在于:
- 标注昂贵:高质量偏好标注需要专业人士,难以规模化
- 离线数据固定:训练中用的对比都是"别人的判断",模型无法自己探索
- 偏好信号弱:只有二元对比(好 vs 差),信息量有限
GRPO 回到在线 RL 的思路,但用了一个巧妙的 trick 绕过了 Value Model。
4.2 GRPO 的核心思想
PPO 需要 Value Model 是因为它要估计 advantage——"这个动作比平均水平好多少?" PPO 的答案是:训练一个神经网络(Value Model)来做这个估计。
GRPO 给了一个更简单的答案:同一个 prompt,生成 G 条 response,组内互相比较。不需要 Value Model,组内均值就是 baseline。
4.3 GRPO 完整公式
其中:
ri,t(θ) = πθ(oi,t | x, oi,<t) / πθ_old(oi,t | x, oi,<t) ← 重要性比率(和 PPO 一样)
Âi,t = (Ri - μgroup) / σgroup ← 组内标准化的优势(和 PPO 不同!)
μgroup = (1/G)·ΣjRj,σgroup = std(R1, ..., RG)
DKL 是 KL 散度惩罚(可选,用于防止遗忘)
📐 GRPO vs PPO —— 关键差异
GRPO 的做法本质上是用 多个 sample 之间的方差 替代了 PPO 中 Value Model 的方差估计。当 G 足够大(如 16~64),组内标准化就能提供稳定的优势信号。
类比:PPO 是你找了一个专业评委(Value Model)坐在场边实时打分。GRPO 是让同一组选手(G 条 response)比完赛,按排名发奖——第一名加分,最后一名扣分。不用评委,自己跟同龄人比。
4.4 GRPO 训练流程(DeepSeek-R1 方案)
GRPO 完整训练步骤(以推理增强为例)
4.5 GRPO vs DPO vs PPO 对比
| 特性 | PPO | DPO | GRPO |
|---|---|---|---|
| Reward Model | ✅ 需要 | ❌ 不需要(数学消除) | ❌ 不需要(但需 rule-based reward) |
| Reference Model | ✅ 需要(KL 约束) | ✅ 需要(DPO loss) | 可选(KL 惩罚可关) |
| Value Model | ✅ 需要(GAE) | ❌ 不需要 | ❌ 不需要(组内标准化) |
| 在线采样 | ✅ | ❌(离线数据) | ✅(G 路并行采样) |
| 偏好数据需求 | 少量(训练 RM) | 大量(所有训练数据) | 无(rule-based reward) |
| 训练复杂度 | 极高(4 模型 + 多轮循环) | 低(类似 SFT) | 中(G 路采样 + clip 更新) |
| 最适合 | 通用对齐 | 偏好数据充足的对齐 | 推理/数学/代码增强 |
4.6 GRPO 的局限
- 依赖 rule-based reward:必须有客观评判标准(数学答案、代码测试)。"写文章好不好"这种开放性任务,reward 设计仍然困难
- 组内采样成本:G=16 意味着每个 prompt 要推理 16 次,训练速度是普通 SFT 的 1/16
- Pairwise/Group-wise 的天花板:当优化目标是排序质量时(如推荐系统),组内对比无法刻画 list-level 的信号
五、RSPO:从 Pairwise 到 List-wise 的升维
5.1 前面所有算法的共同盲区
PPO 优化 per-token reward。DPO/SimPO 优化 pairwise 偏好。GRPO 优化 group-wise 优势。
但它们都在回答同一个问题:"这个回答/这个 item 好不好?"
在推荐系统和广告排序中,你面对的是完全不同的场景:
给定 500 个候选广告,请按 eCPM 排出 top 10。这 10 个 item 作为一个整体的收入,不是 10 个独立 item 的收入之和。因为位置决定了点击率——排第 1 的和排第 10 的,曝光量差一个数量级。
这就是 list-wise 优化——优化的不是"哪个 item 好",而是"这个列表排得对不对"。
5.2 RSPO 的前置知识:NDCG 和 LambdaRank
NDCG 是什么?
NDCG@k = DCG@k / IDCG@k (IDCG 是理想排序下的 DCG,用于归一化到 [0, 1])
NDCG ∈ [0, 1],越大表示排序越好。
通俗例子:推荐 3 篇文章 A(5 分)、B(4 分)、C(1 分)。
- 排 [A, B, C] → NDCG = 1.0(完美)
- 排 [B, A, C] → NDCG ≈ 0.95(A、B 交换,还好不算太差)
- 排 [C, A, B] → NDCG ≈ 0.65(C 排第一,很糟糕)
NDCG 天然捕捉了"好 item 排前面更重要"这一直觉。
LambdaRank:排序学习的基石
NDCG 不可导怎么办?LambdaRank 的核心 trick:不用直接优化 NDCG,而是定义每对 item 的"交换代价":
如果 i 是高分 item 排在后面、j 是低分 item 排在前面,Δij 很大 → 这对要重点优化。
5.3 RSPO:将 LambdaRank 融入 RL 对齐
RSPO 的关键贡献:把 LambdaRank 的 pairwise 交换代价,升维到 list-wise 的 RL 偏好优化中。
其中:
ρij = log πθ(yi|x) / πref(yi|x) - log πθ(yj|x) / πref(yj|x) ← 和 DPO 结构一致
Δij = |ΔNDCGij| ← Lambda 权重,这是 RSPO 独有的
ŷ<i = { y1, ..., yi-1 } ← 已生成的序列前缀
📐 RSPO vs DPO —— 关键公式对比
区别就一个:Δij。DPO 对所有对比对平等对待,RSPO 用 NDCG 变化量给每对区别对待。模型会把更多训练资源花在"错位代价大"的 item 对上。
直觉:回到 3 篇文章的例子。RSPO 会比 DPO 更"着急"地告诉我们:A(5 分) 排到第 3 位是灾难,但 B(4 分) 和 C(1 分) 的先后顺序没那么重要。DPO 只知道"A > B, A > C, B > C"三个对比,RSPO 额外知道"纠正 A<->C 的错位,比纠正 B<->C 的错位重要得多"。
5.4 Reference 门控机制
GR4AD 的训练数据来自多个异构管道。有些是模型自己生成的(分布内),有些来自其他推荐管道(分布外)。对所有数据都用 reference model 约束不合适。
log πθ(yi) / πref(yi) - log πθ(yj) / πref(yj), if DKL(πθ || πref) < τ 分布偏移小 → 用 reference
log πθ(yi) - log πθ(yj), else 分布偏移大 → 退化到 SimPO 模式
5.5 RSPO 的理论保证
论文证明了 ℒRSPO 是 NDCGcost 的上界:
而 PPO/DPO/GRPO 都没有这个性质——它们优化的目标和 NDCG 之间没有数学绑定关系。
5.6 VSL + RSPO 双目标动态平衡
GR4AD 中还有一个巧妙设计:
其中 rp 是模型预测的排名,rv 是价值模型给出的真实排名。
A(i) 小 → 已对齐 → 增加 RSPO(RL)权重,进一步优化 NDCG
这就像教练教你投篮——姿势不对时先纠正姿势(VSL),姿势对了再让你加大训练量(RSPO)。
六、五算法全貌对比
| 维度 | PPO | DPO | SimPO | GRPO | RSPO |
|---|---|---|---|---|---|
| 优化粒度 | per-token | pairwise | pairwise | group-wise | list-wise |
| Reward 来源 | Reward Model | 无(数学消除) | 平均 log prob | Rule-based / RM | Value Model 排序 |
| 需 Reference | ✅ KL 约束 | ✅ DPO loss | ❌ | 可选 | 门控(可选) |
| 需 Value Model | ✅ GAE | ❌ | ❌ | ❌(组内标准化) | ❌ |
| 需 Reward Model | ✅ | ❌ | ❌ | ❌(可 rule) | ❌ |
| 在线采样 | ✅ | ❌ 离线 | ❌ 离线 | ✅ | ✅(异步) |
| 核心创新 | Clip 稳定训练 | RM 数学消除 | Ref 消除 + 长度归一化 | 组内标准化替代 Value | NDCG 直接优化 |
| 最适合 | 通用 RLHF | 偏好数据对齐 | 去长度偏差对齐 | 推理/代码增强 | 推荐/广告排序 |
七、实际场景怎么选?
🔹 通用对话模型对齐(ChatGPT 类)
推荐 DPO 或 SimPO。如果你有大量偏好标注数据,DPO;如果模型喜欢输出超长废话,SimPO。两条路都很成熟,训练像 SFT 一样简单。
🔹 数学/代码推理增强
推荐 GRPO。有明确的对错标准(答案对不对、测试过不过),rule-based reward 天然适配。DeepSeek-R1 已经充分验证了这条路。
🔹 推荐系统/广告排序
推荐 RSPO。当优化目标是 NDCG/收入这种 list-wise 指标时,PPO/DPO/GRPO 都力不从心。RSPO 是目前唯一专门为此设计的生成式 RL 算法。
🔹 资源受限,想快速实验
推荐 SimPO。只加载一个模型,loss 简单,超参少(基本只需要调 β 和 γ),结果是 SOTA 级别的。
八、演进趋势与思考
回头看这五个算法的演进,本质都在追求同一件事:用最少的外部依赖,做最直接的优化。
Step 1 · 稳定化
PPO 用 clip 机制解决 RL 训练中的不稳定性。代价是需要 4 个模型协同工作,工程极重。
Step 2 · 去 Reward Model
DPO 用 Bradley-Terry 模型的数学技巧把 RM 消除。但 reference model 还在,而且引入了训练-推理不一致。
Step 3 · 去 Reference + 消除偏差
SimPO 用平均 log prob 替代 reference model,同时解决了长度偏差问题。只加载一个模型,训练和推理终于一致。
Step 4 · 在线探索
GRPO 回到在线 RL,但用组内标准化绕过了 Value Model。让模型自己生成、自己比较、自己优化——自我博弈比离线学习更有效。
Step 5 · 升维优化
RSPO 将优化粒度从 pairwise/group-wise 升维到 list-wise,直接优化排序指标并给出理论保证。当你的业务目标是"一组 item 的整体排名质量"时,这是唯一正确的选择。
算法演进的根本驱动力,不是数学变得更复杂,而是我们越来越理解"到底要优化什么"。从"让模型变得更好"到"让排序更正确",从间接的 per-token reward 到直接的 list-wise NDCG——每一步都在逼近真实的优化目标。这个趋势不会停止。下一个要"砍掉"的外挂模型是什么?你的场景里还藏着什么没被直接优化的目标?
📎 相关论文:PPO (2017) · DPO (2023) · SimPO (2024) · GRPO / DeepSeekMath (2024) · RSPO / GR4AD (2026)