从 VPG 到 PPO:策略比(Importance Ratio)数学推导全路径 · 干货攻略
- 链接:https://substack.com/@cwolferesearch/note/c-327280451
- 分类:x-tips
- 来源:X @cwolferesearch
- 作者:Jay
- 更新:2026-09-30
核验说明:本文数学推导基于 Cameron R. Wolfe, Ph.D. (@cwolferesearch) Substack 原文;重要性采样的定义与 PPO 论文(Schulman et al., 2017, arXiv:1707.06347)交叉一致;具体公式形式经 RLHF Book(Nathan Lambert)与 HuggingFace Deep RL 博客补充对齐。
这是什么
PPO(Proximal Policy Optimization,近端策略优化)是 OpenAI 于 2017 年提出的策略梯度算法,被广泛应用于 LLM 的 RLHF 后训练阶段。其核心损失函数为:
L^CLIP(θ) = E[ min(r_t(θ) · A_t, clip(r_t(θ), 1-ε, 1+ε) · A_t) ]
其中 r_t(θ) 即策略比(Importance Ratio / Policy Ratio),是整个 PPO 框架的枢纽概念。
本文覆盖:VPG(Vanilla Policy Gradient)→ 梯度推导 → 重要性采样修正 → PPO 策略比物理意义,完整路径,不跳步。
为什么值得关注
@cwolferesearch(Cameron R. Wolfe,Ph.D.)在 X 和 Substack 长期输出 RL/LLM 后训练深度内容,被认为是该领域最系统的技术写作者之一。他指出:
大多数 PPO 教程直接从 VPG 跳到 PPO 损失函数呈现结果,中间的数学推导路径被跳过了。
理解这个路径,对三件事至关重要:
- 写 RLHF 代码时能 debug:知道 r_t 从哪来、clamp 范围怎么选
- 理解 PPO 与 TRPO 的区别:TRPO 用 KL 约束,PPO 用 clip——根源在重要性采样的问题
- 理解新算法变体(GRPO、CISPO、ReMax):它们都在策略比上做文章
核验过程
官方来源
| 来源 | 用途 |
|---|---|
| arXiv:1707.06347 Schulman et al. 2017 "Proximal Policy Optimization Algorithms" | PPO 原始论文,策略比定义、clip 形式、multiple epochs 机制 |
| RLHF Book Chapter 6 Nathan Lambert | 策略比在 LLM 后训练中的含义,batch 更新机制 |
| HuggingFace Blog: PPO from First Principles | 从 log-derivative trick 到策略比的完整数学推导 |
| Cameron Wolfe Substack | VPG→PPO 桥梁讲解,重要性采样物理意义 |
交叉验证结论
- ✅ PPO 论文确认:策略比 r_t(θ) = π_θ(a_t|s_t) / π_θ_old(a_t|s_t)
- ✅ 论文确认:multiple epochs(多轮梯度更新)使用同一批采样数据是 PPO 的核心创新之一
- ✅ RLHF Book 确认:在 LLM 场景通常做 2-4 个 epoch(部分实现更多)
- ✅ HuggingFace 推导确认:VPG 梯度 ⟶ log-derivative trick ⟶ 重要性加权策略梯度,路径无跳跃
- ⚠️ 原帖未注明 ε 默认值:Schulman 2017 论文建议 ε=0.2(连续控制)或 ε=0.1(离散任务)
上手步骤
第一步:理解 VPG(Vanilla Policy Gradient)
VPG 的目标是最大化期望回报 J(θ),其梯度为:
∇_θ J(θ) = E_τ~π_θ [ ∇_θ log π_θ(τ) · R(τ) ]
其中 τ = (s_0, a_0, s_1, a_1, ...) 是一条完整轨迹。将轨迹拆解为逐 timestep 求和:
∇_θ J(θ) = E_τ~π_θ [ Σ_{t=0}^T ∇_θ log π_θ(a_t | s_t) · R(τ) ]
这就是原始策略梯度——每一步动作的对数概率乘以整条轨迹的回报。
问题:这需要 on-policy(只能用当前策略采集的数据),每轮采样只能做一次梯度更新,sample efficiency 极低。
第二步:引入重要性采样
为了能用旧策略采集的数据做多次更新,引入重要性采样(Importance Sampling)。
在概率论中,重要性采样允许用分布 g(x) 的样本来估计分布 f(x) 的期望:
E_{x~f}[f(x)] = E_{x~g}[ f(x) · (f(x)/g(x)) ]
其中 f(x)/g(x) 就是重要性权重(Importance Weight)。
在 PPO 场景中: - 目标分布 f(x):当前策略 π_θ 产生的 (s_t, a_t) 样本 - 提议分布 g(x):旧策略 π_θ_old 产生、我们实际采集到的样本 - 重要性比 = π_θ(a_t|s_t) / π_θ_old(a_t|s_t) = r_t(θ)
将这个权重乘入 VPG 梯度:
∇_θ J(θ) ≈ E_τ~π_θ_old [ r_t(θ) · ∇_θ log π_θ(a_t | s_t) · A_t ]
这就是重要性加权策略梯度——从旧策略的样本出发,估计当前策略的梯度。
第三步:得到 PPO 策略比
去掉期望符号,写成单步形式(省略了 Σ),得到 PPO 损失函数的核心:
L(θ) = r_t(θ) · A_t
其中 r_t(θ) = π_θ(a_t|s_t) / π_θ_old(a_t|s_t)。
初始时 π_θ = π_θ_old,所以 r_t(θ₀) = 1。随着梯度更新,r_t 偏离 1——这正是 PPO 要控制的核心量。
第四步:clip——为什么 PPO 要截断 r_t
PPO 的完整目标(clip 变体)为:
L^CLIP(θ) = E[ min(r_t(θ) · A_t, clip(r_t(θ), 1-ε, 1+ε) · A_t) ]
clip 的物理意义:当 r_t 偏离 1 太远(即当前策略与采集数据的旧策略差距太大),重要性采样的估计已经不可靠了。此时 PPO 选择忽略这个样本对梯度的贡献(将其 clamp 到固定范围)。
ε 的经验值(Schulman 2017): - 连续控制任务:ε = 0.2 - 离散任务:ε = 0.1 - LLM RLHF 实践:通常 0.1 ~ 0.2,部分实现用 0.13
第五步:完整 PPO 更新流程(LLM 后训练视角)
1. 用当前策略 π_θ_old 采样一批 prompts + responses
2. 计算每个位置的 advantage A_t(常用 GAE)
3. 用 π_θ_old 的 logprobs 作为基准,计算 r_t(θ) = exp(logπ_θ - logπ_θ_old)
4. 执行 K 个 epoch(通常 K=2~4)的 minibatch SGD/Adam:
- 计算 L^CLIP(θ)
- 梯度反向传播更新 θ
5. 用更新后的 π_θ 替换 π_θ_old,回到第 1 步
关键:旧策略不是训练前冻结的参考模型(那是 KL penalty 用的),而是本轮数据采集时用的那个策略版本,每轮 batch 更新后滚动替换。
坑与适用边界
❌ 常见误区 1:混淆「旧策略」和「参考模型」
PPO 中有两个策略: - 旧策略 π_θ_old:本轮数据采集时使用的策略,每 batch 更新一次 - 参考模型 π_ref:通常等于 RL 训练开始前的策略快照,用于 KL penalty 约束
在 LLM 后训练中,参考模型通常就是 SFT 后的模型,用来防止 RL 阶段语言能力崩塌。这是 TRPO/PPO 的标准做法,与旧策略是不同概念。
❌ 常见误区 2:clip 作用于 loss,不是 r_t 本身
PPO clip 的是 r_t · A_t,不是 r_t 本身。如果 advantage A_t > 0(好动作),r_t 被 clamp 到上限意味着不鼓励继续增加该动作概率;如果 A_t < 0,r_t 被 clamp 到下限意味着不鼓励继续减少该动作概率。
⚠️ r_t 的数值范围
理论上 r_t ∈ (0, +∞),实践中: - r_t > 1+ε:当前策略更倾向于该动作 - r_t < 1-ε:当前策略更不倾向于该动作 - r_t 极端大/小时,重要性采样方差爆炸——这就是 clip 的动机
⚠️ 适用边界
PPO 适合:on-policy 场景、需要稳定更新、多轮复用同一批数据。 不适合同策略数据极难采集、或需要完全 off-policy 训练的场景(此时考虑 SAC、TD3 等)。
一句话结论
PPO 的策略比 r_t = π_θ(a_t|s_t) / π_θ_old(a_t|s_t) 来自重要性采样修正,使得多轮梯度更新复用同一批采样数据成为可能;clip 操作则通过限制 r_t 的偏离范围防止策略更新过大,是 PPO 区别于 VPG/TRPO 的核心工程决策。