从 PPO 到 RSPO:大模型 RL 对齐算法演进全解
原理、场景与一条未完的进化链
假设你是一个老师,你现在要给一个聪明但迷茫的学生打分。你有两个选择:
方案 A · 请评委打分
先训练一个"评委模型",让它学会判断答案好不好。学生每次答题,评委打分,学生根据评分调整策略。
方案 B · 直接比大小
不训练评委。让学生写两份答案,你直接说"左边比右边好"。学生自己琢磨为什么,调整策略。
这,就是大模型 RL 对齐的两条路线——PPO 路线(训练 reward model 打分)和DPO 路线(直接用偏好对比学习)。
本文沿着这条演化线索,把 PPO → DPO → SimPO → GRPO → RSPO 五个算法的原理、场景和关系讲清楚。不讲虚的,每个算法都用例子让你感受它解决的核心矛盾。
一张图看发展脉络
PPO — OpenAI
通用 RL 算法,解决策略更新不稳定的问题。后被用于 ChatGPT RLHF。
DPO — Stanford
干掉 reward model,直接用偏好数据优化策略。RLHF 从此不再必须用 RL。
SimPO — Princeton
再干掉 reference model。以序列平均 log prob 作为隐式奖励。更简洁,更直接。
GRPO — DeepSeek
组内相对优势,同一 prompt 多条 response 互相比。DeepSeek-R1 的核心训练方法。
RSPO — Kuaishou
从 pairwise 升维到 list-wise,直接优化排序指标 NDCG。推荐/广告场景的 RL 新范式。
一条清晰的演进方向:越来越少的外部依赖,越来越多的直接优化。从"请个评委(reward model)"到"自己比(DPO)"到"组内互比(GRPO)"到"排序直接优化(RSPO)"。
一、PPO:一切开始的地方
它解决了什么问题?
在 PPO 之前,用 Policy Gradient 训练策略有个大问题:更新步长不好控制。
想象你在调一个老式收音机旋钮。拧一点点没变化,拧多了直接跳台。PPO 做的就是给旋钮加了个"阻尼器"——不管你力气多大,每次只能转一点点。
PPO 怎么做的?
Step 1 · 训练 Reward Model
先找人标注数据:对同一个 prompt,人类说"回答 A 比回答 B 好"。用这些偏好数据训练一个 reward model,让它能给任何回答打分。
Step 2 · 策略优化(重点)
模型生成回答 → reward model 打分 → 计算 advantage(这个回答比平均好多少)→ 用 PPO 更新模型参数。PPO 的核心是 clip 机制:
rt(θ) = 新策略概率 / 旧策略概率。如果新旧策略偏差超过 ε(通常 0.2),直接截断。这就是"阻尼器"。
Step 3 · KL 惩罚
额外加一个 KL 散度项,防止模型偏离原始预训练分布太远。这就是 PPO-ptx(InstructGPT 的做法)。
PPO 的优点
- 训练稳定,不容易崩 —— 这正是当年 ChatGPT 能成功的前提
- 在线策略,可以用当前模型实时生成样本
- 理论上可以优化任意 reward function
PPO 的痛点
❌ 需要训练 Reward Model
- RM 本身会过拟合人类标注的偏好
- RM 的 reward 信号可能被模型"刷分"攻破(reward hacking)
- 训练和维护 RM 本身是一笔额外开销
❌ 需要同时跑 4 个模型
- 策略模型(被训练的)
- 参考模型(算 KL 的)
- Reward Model(打分的)
- Value Model(算 advantage 的)
4 个模型同时加载 → 显存爆炸 → 工程复杂度极高。这就是为什么开源社区对 PPO RLHF 又爱又恨。
二、DPO:砍掉 Reward Model
核心洞察
DPO 的作者发现了一件优雅的事:RLHF 的目标函数可以被重写,Reward Model 其实不需要显式存在。
β 控制偏好强度,πθ 是当前策略,πref 是参考策略。本质上就是最大化"好回答与差回答的相对概率差"。
类比:PPO 是你请了个裁判站在场边给每个动作打分。DPO 是直接把两场比赛录像放在一起,告诉模型"左边这场打得更好",模型自己反推什么动作是对的。
为什么 DPO 成为主流?
| 维度 | PPO | DPO |
|---|---|---|
| 需要 Reward Model | ✅ 必须 | ❌ 不需要 |
| 同时加载模型数 | 4 个 | 2 个(策略 + 参考) |
| 训练稳定性 | 需要调 clip/kl/学习率 | 类似监督学习,很稳定 |
| 数据要求 | 偏好数据(训练 RM)+ 在线采样 | 只需要偏好数据 |
| 代表应用 | ChatGPT RLHF | Llama 3, Qwen 2, Mistral |
DPO 的局限
- 仍然需要 reference model(参考模型还得加载)
- pairwise 偏好只关注"相对好坏",不关注"具体好在哪里"
- 偏好强度由 β 控制,但 β 是全局超参,无法针对不同样本自适应
- 在需要多候选排序的场景(推荐系统),pairwise 信号信息量不足
三、SimPO:再砍掉 Reference Model
DPO 还留了什么?
DPO 虽然干掉了 reward model,但 loss 里还有一个 πref(reference model)。这带来了两个问题:
- 显存:两个模型(策略+参考)同时加载
- 训练-推理不一致:训练时算的是 relative log prob(相对参考模型),但推理时直接输出 token。这个 mismatch 会导致模型对长度产生偏好偏差
SimPO 怎么做?
通俗理解:DPO 问的是"你的回答比参考模型强多少?"SimPO 问的是"你对自己的回答有多自信?"——用序列平均 log prob 直接当分数。
SimPO Loss
γ 是 target reward margin,要求好的回答不仅要分高,还要高出一个"及格线"。
SimPO 解决了什么?
- 最长长度偏差:DPO 容易偏向长回答(因为 reference model 可能低估长序列),SimPO 用序列平均 log prob 天然做了长度归一化
- 训练-推理一致:训练时用的 reward 定义和推理时的生成过程完全对齐
- 更少的显存:只加载一个模型
四、GRPO:组内互比,不用外面找人
DPO/SimPO 还有什么问题?
DPO 和 SimPO 处理的都是离线偏好数据——需要事先标注好的"哪个回答更好"的数据集。但:
- 偏好数据标注贵:每条都需要人工对比
- 离线数据是固定的:模型训练中用到的对比,都是别人的判断,不是自己生成的
- 无法在线探索:模型不能自己尝试不同回答然后自我评估
GRPO 怎么做的?
类比:DPO 是你对比"张三的回答 vs 李四的回答"。GRPO 是让同一个同学写 8 份答案,组里自己比——写得好的加分,写得差的扣分。
GRPO Loss
其中 Âi,t = (ri - μgroup) / σgroup,即组内标准化后的相对优势。
GRPO 的两阶段训练(DeepSeek-R1 的做法)
- 冷启动 SFT:先用几千条高质量的 Chain-of-Thought 数据微调
- GRPO 强化学习:
- 对每个 math/coding 问题,模型生成 16 条 reasoning path
- 用基于规则的奖励(答案对错、格式合规)给每条打分
- 组内标准化计算优势,更新模型
GRPO vs DPO vs PPO
| 特性 | PPO | DPO | GRPO |
|---|---|---|---|
| Reward Model | ✅ 需要 | ❌ 不需要 | ❌ 不需要 |
| Reference Model | ✅ 需要 | ✅ 需要 | ❌ 不需要 |
| 在线采样 | ✅ | ❌ 离线数据 | ✅ |
| 优势估计 | Value Model (GAE) | 无(pairwise 对比) | 组内标准化 |
| 适合的场景 | 通用对齐 | 通用对齐 | 推理/数学/代码增强 |
GRPO 的局限
GRPO 虽然强大,但它仍有隐藏的"评委"——rule-based reward 需要明确的对错标准。数学题有对错,代码有测试用例,但"写一篇文章好不好"、"推荐这个商品合不合适"——这些开放场景的 reward 设计仍然困难。
另外,GRPO 和 DPO 一样,操作的是 成对或成组对比。当场景是"100 个候选中排出 top 10",pairwise 或 group-wise 信号无法直接刻画 list 的整体质量。
五、RSPO:从 Pairwise 到 List-wise 的升维
前面所有算法的共同盲区
PPO、DPO、SimPO、GRPO——它们优化的是什么?单个回答(或成对回答)的质量。
但在推荐系统和广告排序中,你面对的不是"这个回答好不好",而是:
"给定 500 个候选广告,请按 eCPM 从高到低排出前 10 个。这 10 个作为一个整体,它们能带来多少收入?"
这就是 list-wise 优化,也是 RSPO 诞生的原因。
RSPO 如何做 list-wise 优化?
核心矛盾:推荐系统产出的是一个排序列表,优化目标是NDCG(衡量排序质量的指标),但现有 RL 算法(DPO、GRPO 等)只能优化 per-item 的 reward。
RSPO 的解决方案:
Step 1 · Lambda 权重
对列表中的每一对 item (i, j),计算一个排序权重 Δij。如果 i 和 j 交换位置会大幅改变 NDCG,Δij 就大;如果换不换无所谓,Δij 就小。
Step 2 · Softmax 聚合
对每个候选 item,把所有排名低于它的 item 作为负样本,用 softmax 加权聚合。这样就得到了一个 list-level 的优化信号——不是"这个好不好",而是"它在这个列表里的位置好不好"。
Step 3 · Reference 门控
实际训练数据来自多个异构管道。对 GR4AD 自己产生的数据,用 reference model 做约束;对其他管道的数据,退化为 reference-free 模式(类似 SimPO 去掉 reference)。
一个例子感受区别
假设你要推荐 3 篇文章给用户:
| 文章 | 真实相关度 | DPO 判断 | GRPO 判断 | RSPO 考虑 |
|---|---|---|---|---|
| A | 5/5 | ✅ 好 | A > B, A > C | 应该排第 1 位 |
| B | 4/5 | ✅ 好 | B > C | 应该排第 2 位 |
| C | 1/5 | ❌ 差 | C 最差 | 应该排末位 |
DPO 只知道"A 比 C 好",但不知道 "A 和 B 谁更好?"。RSPO 关心的是完整的排序 A > B > C——而且每一步错误排序的代价不一样(A 掉到第 3 位的影响远大于 B 和 C 交换)。RSPO 通过 Lambda 权重精确捕捉了这个差异。
VSL + RSPO:双目标的动态平衡
GR4AD 中还有一个巧妙设计:对齐分数 A(i) = |rp - rv| / (n-1) 动态调节 VSL(监督学习)和 RSPO(强化学习)的权重:
- A(i) 大 → 模型预测的排序和真实排序偏差大 → 增加 VSL 权重(先学会模仿)
- A(i) 小 → 模型已经会排了 → 增加 RSPO 权重(进一步优化)
这就像一个教练,看你投篮姿势不对就先纠正动作(VSL),姿势对了才让你加大训练量(RSPO)。
六、五算法全貌对比
| 算法 | Reward Model | Reference Model | 优化粒度 | 核心创新 | 最好用的场景 |
|---|---|---|---|---|---|
| PPO | 需要 | 需要 | per-token | Clip 机制稳定训练 | 通用 RLHF、在线探索 |
| DPO | 不需要 | 需要 | pairwise | RM 数学等价消除 | 偏好转为对齐、SFT 增强 |
| SimPO | 不需要 | 不需要 | pairwise | 平均 log prob 作隐式奖励 | 偏好对齐、去长度偏差 |
| GRPO | 不需要 | 不需要 | group-wise | 组内标准化优势、在线采样 | 推理/数学/代码增强 |
| RSPO | 不需要 | 可选(门控) | list-wise | NDCG 直接优化、排序损失 | 推荐/广告排序 |
七、实际场景怎么选?
🔹 场景 1:通用对话模型对齐(ChatGPT 类)
推荐 DPO 或 SimPO。训练简单,显存友好,效果够好。如果你发现模型喜欢输出超长废话,选 SimPO。
🔹 场景 2:数学/代码推理增强
推荐 GRPO。有明确的对错评判标准(答案对不对、测试过不过),rule-based reward 天然适配。DeepSeek-R1 已经证明了这条路。
🔹 场景 3:推荐系统/广告排序
推荐 RSPO。当你的优化目标是 NDCG/收入这一类 list-wise 指标时,PPO/DPO/GRPO 的 per-item 信号都不够用。RSPO 是第一个专门为此设计的 RL 算法。
🔹 场景 4:资源受限,想快速实验
推荐 SimPO。只加载一个模型,loss 简单,超参少,结果是 SOTA 级别。
八、演进趋势与思考
回头看这五个算法的演进,有一条清晰的逻辑链:
Step 1 · 稳定化
PPO 用 clip 机制解决 RL 训练中的不稳定性。这是工业级 RLHF 的基石。
Step 2 · 去 Reward Model
DPO 用数学技巧把 RM 消除掉。发现:偏好数据比想象中信息更丰富。
Step 3 · 去 Reference Model
SimPO 用平均 log prob 替代 reference。发现:模型自己比参考模型更了解自己。
Step 4 · 组内探索
GRPO 让模型对同一问题生成多条回答,组内互比。发现:自我博弈比对着别人的答案学更有效。
Step 5 · 升维优化
RSPO 将 pairwise/pointwise 升维到 list-wise。发现:有些场景的优化目标天然是排序,你不能拆成单点去搞。
算法演进的本质,是不断逼近"用最少的外部依赖,做最直接的优化"。从需要 4 个模型到只要 1 个,从间接的 per-token reward 到直接的 list-wise NDCG。这个趋势不会停。
📎 相关论文:PPO · DPO · SimPO · GRPO (DeepSeekMath) · RSPO (GR4AD)