PPO(Proximal Policy Optimization) 是 OpenAI 于 2017 年提出的策略梯度算法,它解决了传统策略梯度方法"步长敏感"和 TRPO 实现复杂的问题,成为当前 RLHF(人类反馈强化学习)训练大语言模型的事实标准。
一、背景:从 TRPO 到 PPO
策略梯度的致命问题
标准策略梯度(REINFORCE)的目标函数为:
LPG(θ)=Et[logπθ(at∣st)⋅A^t]L^{PG}(\theta) = \mathbb{E}t \left[ \log \pi\theta(a_t|s_t) \cdot \hat{A}_t \right]LPG(θ)=Et[logπθ(at∣st)⋅A^t]
问题:步长(learning rate)极其敏感。
- 步长太小:训练像蜗牛,样本效率极低
- 步长太大:策略更新过猛,新策略与旧策略分布差异过大(KL 散度爆炸),导致性能断崖式崩溃,且无法恢复
TRPO 的优雅与沉重
TRPO(Trust Region Policy Optimization)用约束优化解决此问题:
maxθ Et[πθ(at∣st)πθold(at∣st)A^t]s.t.Et[DKL(πθold∥πθ)]≤δ\max_\theta \; \mathbb{E}t \left[ \frac{\pi\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)} \hat{A}t \right] \quad \text{s.t.} \quad \mathbb{E}t \left[ D{KL}(\pi{\theta_{old}} \| \pi_\theta) \right] \leq \deltaθmaxEt[πθold(at∣st)πθ(at∣st)A^t]s.t.Et[DKL(πθold∥πθ)]≤δ
问题:需要计算 Fisher 信息矩阵、共轭梯度法,实现复杂,难以与大规模神经网络(如 Transformer)结合。
PPO 的洞见
用一阶优化的复杂度,实现近似二阶优化的稳定性。
二、核心原理:两种实现方式
方式一:PPO-Clip(主流,OpenAI 采用)
1. 概率比(Probability Ratio)
rt(θ)=πθ(at∣st)πθold(at∣st)r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}rt(θ)=πθold(at∣st)πθ(at∣st)
- r=1r = 1r=1:新策略与旧策略对该动作的概率相同
- r>1r > 1r>1:新策略更倾向该动作
- r<1r < 1r<1:新策略更抑制该动作
2. Clip 目标函数(核心创新)
LCLIP(θ)=Et[min(rt(θ)A^t, clip(rt(θ),1−ϵ,1+ϵ)⋅A^t)]L^{CLIP}(\theta) = \mathbb{E}_t \left[ \min\left( r_t(\theta)\hat{A}_t, \; \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) \cdot \hat{A}_t \right) \right]LCLIP(θ)=Et[min(rt(θ)A^t,clip(rt(θ),1−ϵ,1+ϵ)⋅A^t)]
其中 ϵ\epsilonϵ 通常取 0.1 或 0.2。
3. Clip 机制的直觉解释
| 情况 | 优势 A^t\hat{A}_tA^t | 概率比 rtr_trt | 行为 | Clip 是否生效 |
|---|---|---|---|---|
| 动作好 | >0>0>0 | >1+ϵ>1+\epsilon>1+ϵ(过度增加概率) | 截断为 (1+ϵ)A^(1+\epsilon)\hat{A}(1+ϵ)A^ | ✅ 限制过度优化 |
| 动作好 | >0>0>0 | <1<1<1(反而降低概率) | 取 rA^r\hat{A}rA^(正常更新) | ❌ 不限制 |
| 动作差 | <0<0<0 | <1−ϵ<1-\epsilon<1−ϵ(过度降低概率) | 截断为 (1−ϵ)A^(1-\epsilon)\hat{A}(1−ϵ)A^ | ✅ 限制过度优化 |
| 动作差 | <0<0<0 | >1>1>1(反而增加概率) | 取 rA^r\hat{A}rA^(正常更新) | ❌ 不限制 |
核心逻辑 :Clip 只干预**"朝优势方向过度激进"的更新,不干预"已经走错方向"**的更新。这保证了策略不会在一次更新中突变。
4. 完整目标函数(含价值函数与熵)
LTOTAL(θ)=Et[LCLIP−c1⋅(Vϕ(st)−Vttarget)2+c2⋅H(πθ(⋅∣st))]L^{TOTAL}(\theta) = \mathbb{E}t \left[ L^{CLIP} - c_1 \cdot (V\phi(s_t) - V_t^{target})^2 + c_2 \cdot H(\pi_\theta(\cdot|s_t)) \right]LTOTAL(θ)=Et[LCLIP−c1⋅(Vϕ(st)−Vttarget)2+c2⋅H(πθ(⋅∣st))]
- 第一项:Clip 策略损失(最大化)
- 第二项:价值函数 MSE(Critic 拟合回报)
- 第三项:策略熵(鼓励探索,防止过早收敛)
方式二:PPO-Penalty(早期版本,较少使用)
动态调整 KL 惩罚系数 β\betaβ:
LKLPEN(θ)=Et[rt(θ)A^t−β⋅DKL(πθold∥πθ)]L^{KLPEN}(\theta) = \mathbb{E}t \left[ r_t(\theta)\hat{A}t - \beta \cdot D{KL}(\pi{\theta_{old}} \| \pi_\theta) \right]LKLPEN(θ)=Et[rt(θ)A^t−β⋅DKL(πθold∥πθ)]
β\betaβ 根据实际 KL 散度与目标值的偏差动态增减。实现复杂,效果不如 Clip 稳定,OpenAI 在后续工作中全面转向 Clip。
三、OpenAI 在 RLHF 中的 PPO 流程
这是 PPO 最广为人知的应用------训练 ChatGPT/InstructGPT/Claude 等对齐模型。
三阶段流程
阶段 1: 预训练(Pretrain)
GPT 在大量文本上训练语言模型 → 得到 Base Model
阶段 2: SFT(Supervised Fine-Tuning)
用高质量人工标注的 (Prompt, Response) 对微调 → 得到 SFT Model
阶段 3: RLHF(核心,PPO 登场)
用人类偏好数据训练 Reward Model
用 PPO 优化 SFT Model,最大化 Reward 同时保持与参考模型的 KL 距离
PPO 在 RLHF 中的特殊架构
| 组件 | 角色 | 说明 |
|---|---|---|
| Actor(策略网络) | πθ\pi_\thetaπθ | 当前正在训练的语言模型,生成回答 |
| Critic(价值网络) | VϕV_\phiVϕ | 估计每个 token 位置的未来累积奖励,用于计算优势函数 A^\hat{A}A^ |
| Reward Model | RRR | 冻结的奖励模型,对人类偏好打分(通常输出标量奖励) |
| Reference Model | πref\pi_{ref}πref | 冻结的 SFT 模型,防止 Actor 偏离太远 |
RLHF-PPO 的目标函数
J(θ)=Ex∼D,y∼πθ[R(x,y)−β⋅DKL(πθ(y∣x)∥πref(y∣x))]J(\theta) = \mathbb{E}{x \sim D, y \sim \pi\theta} \left[ R(x,y) - \beta \cdot D_{KL}(\pi_\theta(y|x) \| \pi_{ref}(y|x)) \right]J(θ)=Ex∼D,y∼πθ[R(x,y)−β⋅DKL(πθ(y∣x)∥πref(y∣x))]
KL 惩罚项是 OpenAI 的关键技巧:
- 没有它,模型会为了骗高 Reward 而输出乱码(Reward Hacking)
- β\betaβ 控制"对齐程度" vs "语言能力" 的 trade-off
优势函数计算:GAE(Generalized Advantage Estimation)
OpenAI 采用 GAE 计算 A^t\hat{A}_tA^t,平衡偏差与方差:
A^tGAE(γ,λ)=∑l=0∞(γλ)lδt+l\hat{A}t^{GAE(\gamma,\lambda)} = \sum{l=0}^{\infty} (\gamma\lambda)^l \delta_{t+l}A^tGAE(γ,λ)=l=0∑∞(γλ)lδt+l
其中 δt=rt+γV(st+1)−V(st)\delta_t = r_t + \gamma V(s_{t+1}) - V(s_t)δt=rt+γV(st+1)−V(st) 是 TD 误差。
- λ=0\lambda = 0λ=0:纯 TD(低方差高偏差)
- λ=1\lambda = 1λ=1:纯蒙特卡洛(高方差低偏差)
- 实践中 λ=0.95\lambda = 0.95λ=0.95
四、关键超参数(OpenAI 实践)
| 参数 | 典型值 | 作用 |
|---|---|---|
| ϵ\epsilonϵ (Clip) | 0.1 ~ 0.2 | 策略变化容忍度 |
| γ\gammaγ | 0.99 | 折扣因子 |
| λ\lambdaλ (GAE) | 0.95 | 优势估计偏差-方差权衡 |
| c1c_1c1 (Value Loss) | 0.5 ~ 1.0 | 价值函数损失权重 |
| c2c_2c2 (Entropy) | 0.01 | 熵奖励系数(鼓励探索) |
| β\betaβ (KL Penalty) | 0.01 ~ 0.2 | RLHF 中防止偏离参考模型 |
| 每批数据更新次数 | 3 ~ 10 | 利用样本多次梯度上升 |
| Mini-batch Size | 64 ~ 512 | 取决于模型规模 |
五、PPO vs TRPO 对比
| 维度 | TRPO | PPO |
|---|---|---|
| 优化阶数 | 二阶(Fisher 矩阵) | 一阶(普通梯度下降) |
| 实现复杂度 | 高(需共轭梯度、线搜索) | 低(几行代码即可实现) |
| 与深度学习兼容性 | 差(难以处理大网络) | 优(直接对接 PyTorch/TensorFlow) |
| 样本效率 | 高 | 高(相当) |
| 超参数敏感度 | 低 | 低(Clip 机制鲁棒) |
| 大规模部署 | 困难 | 容易(OpenAI 生产标配) |
六、局限性与现代演进
PPO 的固有问题
- On-policy 样本浪费:必须用当前策略采样,旧数据不能重用(对比 Q-learning 的 off-policy)
- RLHF 中的模式崩溃:即使加了 KL 惩罚,模型仍可能学会"讨好 Reward Model"而非真实有用(如过度道歉、冗长回答)
- Critic 训练困难 :在大语言模型中,价值函数 VϕV_\phiVϕ 的拟合极其不稳定
现代替代方案
| 算法 | 改进点 | 代表应用 |
|---|---|---|
| DPO(Direct Preference Optimization) | 直接用偏好数据优化,无需 Reward Model 和 PPO | Stanford, HuggingFace TRL |
| IPO(Identity Preference Optimization) | DPO 的正则化版本,防止过拟合 | 学术研究 |
| KTO(Kahneman-Tversky Optimization) | 只需二元反馈(好/坏),无需成对偏好 | Contextual AI |
| GRPO(Group Relative Policy Optimization) | 无需 Critic 网络,用组内相对奖励估计优势 | DeepSeek-R1(2025) |
DeepSeek-R1 的 GRPO 是对 PPO 的重大简化:去掉 Critic 网络,对同一问题采样多个回答,用组内奖励的均值和标准差来归一化优势函数。这大幅降低了显存占用,使推理模型的 RL 训练成本下降一个数量级。
总结
PPO 的本质是"带安全带的策略梯度":用 Clip 机制将概率比限制在 [1−ϵ,1+ϵ][1-\epsilon, 1+\epsilon][1−ϵ,1+ϵ] 区间内,防止策略在一次更新中突变崩溃。在 RLHF 中,它通过 Actor-Critic 架构 + KL 惩罚,让大语言模型在"讨好人类偏好"和"保持语言能力"之间找到稳定平衡。