从 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 损失函数呈现结果,中间的数学推导路径被跳过了。

理解这个路径,对三件事至关重要:

  1. 写 RLHF 代码时能 debug:知道 r_t 从哪来、clamp 范围怎么选
  2. 理解 PPO 与 TRPO 的区别:TRPO 用 KL 约束,PPO 用 clip——根源在重要性采样的问题
  3. 理解新算法变体(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 的核心工程决策。