PPO 原理与应用
1. PPO 在 RLHF 里到底是干什么的?
在 RLHF 里,我们通常已经有了一个经过 SFT 的模型。这个模型已经比较会回答问题了,但还不一定最符合人类偏好。
于是我们再训练一个奖励模型 Reward Model,让它模仿人类判断:
这个回答好不好?然后 PPO 做的事情就是:
让当前大模型不断生成回答,再让奖励模型打分。
如果回答分数高,就提高模型以后生成类似回答的概率;
如果回答分数低,就降低模型以后生成类似回答的概率。
但 PPO 不会让模型一下子改得太猛,它会限制每次更新的幅度。
这就是 PPO 名字里的Proximal,意思是“近端的、不要离太远”。
2. PPO 的核心直觉
你可以把 PPO 想成一个“带安全绳的强化学习微调”。
普通强化学习可能会这样:
只要奖励高,就疯狂往那个方向更新。
这样很容易出问题,比如:
- 模型变得极端啰嗦;
- 模型学会讨好奖励模型;
- 模型输出格式崩坏;
- 模型偏离原来的语言能力;
- 模型为了高分学出奇怪套路。
PPO 的思想是:
可以朝更高奖励方向更新,但每一步不要走太远。
就像训练一个学生:
- 如果他答得好,就鼓励;
- 答得不好,就纠正;
- 但不能一天之内把他的所有表达习惯都彻底推翻。
3. PPO 需要理解的几个基础概念
3.1 Policy,策略模型
在 RLHF 中,policy就是当前正在训练的大语言模型。
它的作用是:
输入 prompt → 生成回答比如:
用户:请解释 LoRA 模型:LoRA 是一种参数高效微调方法……从强化学习角度看,模型每生成一个 token,都是在做一次“动作选择”。
3.2 Action,动作
在普通强化学习里,动作可能是:
- 向左走
- 向右走
- 跳跃
- 开火
在语言模型里,动作就是:
生成下一个 token。
比如模型生成:
LoRA 是 一 种 参数 高效 微调 方法每一个 token 都可以看作一次动作。
3.3 State,状态
在语言模型里,状态可以理解成:
当前已经看到的上下文。
比如模型已经生成了:
LoRA 是一种那么下一步生成什么 token,就取决于当前上下文状态。
3.4 Reward,奖励
在 RLHF 中,奖励通常来自奖励模型。
模型生成一个完整回答后,奖励模型给它打分:
问题 + 回答 → 奖励分数例如:
| 回答 | 奖励模型评分 |
|---|---|
| “LoRA 是低秩适配方法……” | 8.5 |
| “LoRA 是一个很厉害的东西……” | 4.0 |
PPO 的目标就是让模型更倾向于生成高奖励回答。
3.5 Value,价值函数
PPO 通常是 Actor-Critic 方法。
- Actor:策略模型,负责生成回答;
- Critic:价值模型,负责估计当前状态未来大概能获得多少奖励。
价值函数记作:V(s)。
它表示:
在状态 s 下,预计后面能拿到多少奖励。
在 RLHF 中,通常会在语言模型后面加一个value head,用来预测每个 token 位置的价值。
3.6 Advantage,优势函数
优势函数是 PPO 里非常重要的概念。
它大概表示:
这次实际生成的结果,比模型原本预期的好多少?
公式可以简单理解为:A = R - V(s)。
其中:
- R:实际获得的奖励;
- V(s):价值模型原本预计的奖励;
- A:优势。
如果 A > 0,说明这次回答比预期好,应该增加生成它的概率。
如果 A < 0,说明这次回答比预期差,应该降低生成它的概率。
4.PPO 在 RLHF 中的完整流程
下面是经典 PPO-RLHF 的训练流程。
第一步:准备 SFT 模型
先有一个经过监督微调的模型:
SFT Model它已经能基本按照指令回答。
第二步:复制一个 Reference Model
把 SFT 模型复制一份,作为参考模型:
Reference Model这个模型不训练,保持固定。
它的作用是:
约束当前策略模型不要偏离原来的 SFT 模型太远。
第三步:准备 Reward Model
奖励模型输入:
prompt + response输出一个分数:
reward score它负责模拟人类偏好。
第四步:Policy Model 生成回答
当前正在训练的模型,也就是 policy model,会对一批 prompt 生成回答。
例如:
Prompt:请解释什么是 PPO Response:PPO 是一种强化学习算法……第五步:奖励模型打分
奖励模型给这个回答打分:
Reward Model(prompt, response) = 7.8这个分数代表回答质量。
第六步:计算 KL 惩罚
RLHF 里通常不仅看奖励模型分数,还会看当前模型和参考模型的差异。
如果当前模型偏离参考模型太远,就惩罚它。
通常奖励会变成:
Reward=RM_score−β⋅KL(πθ∣∣πref) Reward = RM\_score - \beta \cdot KL(\pi_\theta || \pi_{ref})Reward=RM_score−β⋅KL(πθ∣∣πref)
其中:
- RM_score:奖励模型分数;
- πθ:当前策略模型;
- πref:参考模型;
- KL:两个模型输出分布的差异;
- β:控制惩罚强度。
这个 KL 惩罚非常重要。
它防止模型为了骗奖励模型而变得奇怪。
第七步:计算 advantage
用实际奖励和价值模型预测值计算优势:A = R - V(s)。
如果实际奖励比预测高,说明这次生成比预期好,应该鼓励。
如果实际奖励比预测低,说明这次生成比预期差,应该削弱。
第八步:用 PPO 更新模型
最后用 PPO 的 clipped objective 更新模型参数。
实际训练时,损失函数通常包括三部分:Loss = Policy Loss + Value Loss + KL/Entropy Terms。
更具体地说:
| 部分 | 作用 |
|---|---|
| Policy Loss | 让模型更倾向于高优势回答 |
| Value Loss | 训练价值模型,让它更准确预测奖励 |
| KL Penalty | 防止模型偏离参考模型太远 |
| Entropy Bonus | 有时用于鼓励探索,避免输出过早僵化 |
5. PPO 中的 KL 和 clipping 有什么区别?
这是一个很重要的问题。
PPO 里有两个“限制模型别变太猛”的机制:
- clipping
- KL penalty
它们很像,但不是一回事。
5.1clipping 限制的是新旧策略的更新比例
PPO 的 clipping 主要限制新旧策略概率比:πθ(a|s) / πold(a|s)。
也就是:
当前训练这一步,新模型相对于旧模型,变化不能太大。
它关注的是训练更新的稳定性。
5.2KL penalty 限制的是当前模型和参考模型的距离
KL penalty 限制:KL(πθ|| πref)。
也就是:
当前模型不要偏离 SFT reference model 太远。
它关注的是对齐后模型不要走偏。
5.3 简单区分
| 机制 | 限制对象 | 目的 |
|---|---|---|
| PPO clipping | 当前模型 vs 上一轮旧模型 | 防止每次更新太猛 |
| KL penalty | 当前模型 vs SFT 参考模型 | 防止整体偏离原模型太远 |
一句话:
clipping 管“每一步别迈太大”,KL 管“整体别跑太远”。
6. PPO 为什么适合 RLHF?
| 语言模型和 RLHF 的特点 | PPO 的对应作用 |
|---|---|
| 输出是离散 token | 把每个 token 视为一次动作选择,用策略优化调整生成概率 |
| 最终质量通常要看完整回答 | 用奖励模型对完整回答打分,再把整体奖励分配到生成过程 |
| 人类偏好难以写成标准答案 | 用奖励信号表达偏好,而不是只模仿固定参考答案 |
| 奖励模型给的是整体评价 | 结合 value 和 advantage 判断哪些生成行为值得强化 |
| 训练容易不稳定 | 用 clipping 限制单次更新幅度,用 KL penalty 限制偏离参考模型的程度 |
所以早期 RLHF 里,PPO 是非常核心的方法。
7. 一个完整例子:PPO 如何优化回答
假设 prompt 是:
请用简单的话解释什么是 LoRA。当前模型生成回答 A:
LoRA 是一种参数高效微调方法,它通过训练两个小矩阵来近似模型权重的更新,从而减少训练成本。奖励模型给分:
8.5参考模型认为这个回答也比较自然,KL 不大。
最终 reward 较高。
那么 PPO 会做:
增加模型以后在类似上下文中生成这类清晰、准确回答的概率。
另一个回答 B:
LoRA 是一种很强大的 AI 技术,它可以让模型变得更好。奖励模型给分:
4.0这个回答空泛,信息不足。
那么 PPO 会做:
降低模型以后生成类似空泛表达的概率。
但注意,PPO 不知道“LoRA 的真实原理”是什么,它只是根据奖励信号调整概率。
8. PPO 的训练数据是什么?
PPO 阶段通常不直接用传统的:
输入 → 标准答案而是用 prompt 集合。
例如:
[{"prompt":"请解释什么是 LoRA"},{"prompt":"帮我写一封道歉邮件"},{"prompt":"总结下面这段话"},{"prompt":"如何学习机器学习"}]然后模型自己生成 response。
奖励模型给这些 response 打分。
所以 PPO 阶段的数据更像:
prompt → 模型采样回答 → 奖励模型评分 → PPO 更新而不是单纯模仿标准答案。
9. PPO 和 SFT(监督微调) 的区别
| 对比项 | SFT | PPO |
|---|---|---|
| 训练目标 | 模仿人工答案 | 最大化奖励模型评分 |
| 数据形式 | prompt + 标准回答 | prompt + 模型自己生成的回答 |
| 是否需要奖励模型 | 不需要 | 需要 |
| 是否是强化学习 | 不是 | 是 |
| 更新依据 | 标准答案 token | reward 和 advantage |
| 风险 | 过拟合示范数据 | 奖励黑客、训练不稳定 |
| 作用 | 让模型会按指令回答 | 让模型更符合偏好 |
简单说:
SFT 是“模仿好答案”,PPO 是“探索并强化更受偏好的答案”。
10. PPO 的可替代策略
| 策略 | 核心思路 | 相比 PPO 的特点 |
|---|---|---|
| DPO | 直接用偏好数据优化模型,让被偏好的回答概率高于被拒绝的回答 | 不需要单独训练奖励模型,也不需要复杂的在线强化学习流程 |
| IPO | 把偏好学习写成更稳定的目标函数,降低过度追求偏好差距的问题 | 训练形式接近 DPO,但更强调目标函数稳定性 |
| KTO | 用“好”和“不好”的样本信号训练模型,不强依赖成对偏好数据 | 数据组织更灵活,适合偏好标注不完整的场景 |
| ORPO | 把监督微调和偏好优化合在一个训练目标中 | 流程更简单,适合在 SFT 阶段直接加入偏好约束 |
| Rejection Sampling | 让模型生成多个回答,再用奖励模型挑选高分回答继续训练 | 实现简单,但探索能力和训练效率通常不如完整策略优化 |
这些方法的共同目标都是让模型更符合人类偏好。区别在于,PPO 采用强化学习方式更新策略,而 DPO、IPO、KTO、ORPO 等方法更偏向直接用偏好数据构造训练目标。
11. PPO 的主要风险
11.1 奖励黑客
模型可能不是学会真正变好,而是学会骗奖励模型。
比如奖励模型偏好长回答,模型就疯狂变长。
11.2 训练不稳定
PPO 比 SFT 难调很多。
可能出现:
- reward 上升但实际效果下降;
- KL 爆炸;
- 输出变得模式化;
- 模型重复生成;
- 语言能力退化。
11.3 过度优化奖励模型
奖励模型本身不完美。
如果 PPO 优化太久,模型可能越来越适应奖励模型的漏洞,而不是真正符合人类偏好。
11.4 对超参数敏感
尤其是:
- 学习率太大;
- KL 惩罚太小;
- reward scale 不合理;
- rollout 数据质量差。
这些都会让训练崩掉。
12. 一句话总结 PPO
PPO 是一种稳定的策略优化算法,在 RLHF 中,它让语言模型通过奖励模型的反馈逐步提高生成高质量回答的概率,同时用 clipping 和 KL 约束防止模型更新过猛、偏离原来的 SFT 模型。
