← 返回列表

PPO 是 on-policy 还是 off-policy:importance sampling 到底在修正什么

摘要

PPO 的目标函数里有一个重要性比率 ρ\rho,这让它看起来像是 off-policy 算法。本文论证相反的观点:PPO 在数据采集环节是严格的 on-policy,importance sampling 只是为了让同一批 on-policy 数据能被多轮复用而引入的局部修正,且裁剪机制的存在恰恰是为了阻止这种修正被用到不可信的范围——这与经验回放类算法”让算法适应陈旧数据”的 off-policy 哲学相反。

0. 定义:on-policy 与 off-policy 的判据

0.1 两种范式的定义

on-policy(同策略):用于更新策略的数据必须由待更新的策略自己产生。

off-policy(异策略):用于更新策略的数据可以由任意其它策略产生,包括许多次迭代之前的旧版本策略。

判据不在目标函数长什么样,而在数据的生命周期:一批数据从采集到失效,允许被复用的时间跨度。

例子:同一条轨迹样本 (s,a,r)(s,a,r)。在 A2C 里,它被用于一次更新后立即作废;在 DQN 里,它进入容量 100 万的经验回放池,平均会被重新采样 8 次、跨越数十万步仍然有效。同一条数据,两种寿命——这就是两种范式的判据。

0.2 记号约定

记号含义
πθ\pi_\theta待优化的策略
πθold\pi_{\theta_{\mathrm{old}}}采样数据时的策略快照
ρ(θ)\rho(\theta)重要性比率 πθ/πθold\pi_\theta / \pi_{\theta_{\mathrm{old}}}
A(s,a)A(s,a)优势函数
ε\varepsilonPPO 裁剪范围

1. 为什么说 PPO 是 on-policy

要点:PPO 的数据必须来自当前策略快照,一轮 rollout 后整批丢弃,没有任何跨迭代的复用结构;裁剪机制的存在本身就是 on-policy 的证据。

1.1 策略梯度定理的采样要求

策略梯度定理给出

∇J(θ)=Eτ∼πθ[∇log⁡πθ(τ)⋅R(τ)](1)\nabla J(\theta)=\mathbb{E}_{\tau\sim\pi_\theta}\big[\nabla\log\pi_\theta(\tau)\cdot R(\tau)\big] \tag{1}
(1)

先用大白话翻译式 (1):采到好轨迹,就提高它的概率;采到坏轨迹,就压低它的概率。 但注意期望的下标 τ∼πθ\tau\sim\pi_\theta——样本必须来自当前策略。换一种说法:你只能用”自己现在会做出的行为”来改进自己;如果数据是旧版本的你产生的,就需要额外的修正。这正是后文 importance sampling 的来历。

PPO 的训练循环完全遵守这一要求:

  1. 采样:用当前参数 θold\theta_{\mathrm{old}} 的策略 πθold\pi_{\theta_{\mathrm{old}}} 与环境交互,收集一批轨迹;
  2. 优化:在这批数据上做 KK 个 epoch 的梯度上升;
  3. 丢弃:整批数据作废,θold←θ\theta_{\mathrm{old}}\leftarrow\theta,回到第 1 步。

数据只活一轮。 对比 DQN 的经验回放池——其中可能存放着数十万步之前、由几十个不同版本的策略产生的样本——PPO 完全没有这种结构。从数据生命周期的角度看,PPO 是 on-policy 的。

一个常见的误解是”PPO 用旧策略的数据更新新策略,所以是 off-policy”。这个论证不成立:任何 on-policy 算法在参数更新的瞬间,手里的数据都来自上一版策略。 严格的例子:REINFORCE 的 batch 在第一次梯度更新后就已经”过期”——θ\theta 变了,样本就不再来自当前策略。它只是选择不用,而不是数据没过期。PPO 与 REINFORCE 的区别不在于”数据是否过期”,而在于”有没有修正过期的机制”。

1.2 裁剪的存在本身是 on-policy 的证据

如果 PPO 真是 off-policy 算法,就不需要裁剪——off-policy 的核心能力恰恰是处理任意程度的分布偏移。

例子:同一条 ρ=20\rho=20 的样本——某个动作在旧策略下几乎不选,新策略现在很爱选。PPO 的裁剪直接把它停用(梯度为零);DQN 里没有 ρ\rho 这个概念,照单全收继续训练。一个在”阻止数据变陈旧”,一个在”适应数据陈旧”。

而 PPO 的裁剪做的事是:一旦新策略偏离采样策略超过 [1−ε, 1+ε][1-\varepsilon,\,1+\varepsilon],就停止该样本的梯度。这是”防止偏移扩大”的机制,与 off-policy”适应任意偏移”的哲学相反。

off-policy 算法当然也有自己的稳定化手段(经验回放、目标网络、优先采样),但那些手段服务于”从陈旧数据中提取信号”;PPO 的裁剪服务于”阻止数据变陈旧”。两种设计的出发点截然不同。

2. importance sampling 从哪来:多 epoch 复用

要点:IS 修正在 PPO 中是局部的——它不负责把任意旧数据变为可训练数据,只负责把”刚采的、只过了几个梯度步”的数据修正到当前策略下。

2.1 动机:on-policy 的样本效率困境

如果严格按式 (1) 执行——每做一步梯度更新就丢弃全部数据重新采样——对语言模型而言每次采样等于完整跑一次推理,代价不可接受。

例子:量化一下这个代价。一个 rollout batch 256 条 prompt × 平均 512 token ≈ 13 万 token 的自回归生成。REINFORCE 用它做 1 步更新;PPO 用 K=4 个 epoch——同样的 13 万 token,梯度步数翻 4 倍,等于采样成本摊薄到 1/4。这就是”多 epoch”这个决策的全部动机。

PPO 的核心工程决策是:同一批数据训练 KK 个 epoch(典型值 K=4K=4)。

但第 2 个 epoch 开始时,θ\theta 已经不再是 θold\theta_{\mathrm{old}}。数据是 πθold\pi_{\theta_{\mathrm{old}}} 采的,梯度却要按 πθ\pi_\theta 算。这正是 importance sampling 的登场位置。

2.2 修正推导

对任意函数 ff,期望的换分布公式是精确恒等式:

Ea∼πθ[f(a)]=Ea∼πθold[πθ(a∣s)πθold(a∣s)⏟ρ(θ)⋅f(a)](2)\mathbb{E}_{a\sim\pi_\theta}\big[f(a)\big]=\mathbb{E}_{a\sim\pi_{\theta_{\mathrm{old}}}}\Big[\underbrace{\frac{\pi_\theta(a\mid s)}{\pi_{\theta_{\mathrm{old}}}(a\mid s)}}_{\textstyle \rho(\theta)}\cdot f(a)\Big] \tag{2}
(2)

先用直觉理解它:你想算”新策略下某个量的平均值”,但手里的数据是旧策略采的。办法是给每条样本乘一个权重——“新策略选这个动作的概率 ÷ 旧策略选它的概率”。新策略更喜欢的动作权重 >1,往上抬;新策略更冷落的动作权重 <1,往下压。加权平均之后,就相当于从新策略采的样。

例子(验算一遍再信):取 πθold=(0.5,0.5)\pi_{\theta_{\mathrm{old}}}=(0.5,0.5),πθ=(0.8,0.2)\pi_\theta=(0.8,0.2),f(a1)=1f(a_1)=1,f(a2)=0f(a_2)=0。左边 Ea∼πθ[f]=0.8\mathbb{E}_{a\sim\pi_\theta}[f]=0.8;右边 0.5×0.80.5×1+0.5×0.20.5×0=0.80.5\times\frac{0.8}{0.5}\times1+0.5\times\frac{0.2}{0.5}\times0=0.8。两边严格相等——修正是精确的,不是近似的。

代入优势函数即得 PPO 的替代目标(未裁剪形式):

L(θ)=Ea∼πθold[ρ(θ)⋅A(s,a)](3)L(\theta)=\mathbb{E}_{a\sim\pi_{\theta_{\mathrm{old}}}}\big[\rho(\theta)\cdot A(s,a)\big] \tag{3}
(3)

两个观察:

  • 第一个 epoch 的第一次更新之前,θ=θold\theta=\theta_{\mathrm{old}},每个样本的 ρ=πθold/πθold=1\rho=\pi_{\theta_{\mathrm{old}}}/\pi_{\theta_{\mathrm{old}}}=1,式 (3) 恰好退化为普通策略梯度——修正系数等于 1,等于没修正;
  • 从 θ\theta 开始移动起,ρ\rho 才承担起修正分布偏移的职责。

所以 IS 修正的幅度与偏移量成正比:偏移为零时它退场,偏移增大时它介入,偏移过大时它失效(见 §2.3)。PPO 对它的使用始终停留在第二档——这正是”局部修正”的含义。

2.3 修正的适用边界

式 (2) 是精确恒等式,但对有限样本的估计量而言,修正后的方差随偏移增大而爆炸。

数字算例:设某状态下有两个动作,πθold(a1)=0.02\pi_{\theta_{\mathrm{old}}}(a_1)=0.02,πθold(a2)=0.98\pi_{\theta_{\mathrm{old}}}(a_2)=0.98。采样 100 条轨迹,按期望有 2 条采到 a1a_1。

  • 若更新后 πθ(a1)=0.4\pi_\theta(a_1)=0.4,则这两条轨迹的 ρ=0.4/0.02=20\rho=0.4/0.02=20;而 a2a_2 样本的 ρ=0.6/0.98≈0.612\rho=0.6/0.98\approx0.612。总权重中 a1a_1 样本占 2×20/(2×20+98×0.612)≈40%2\times20/(2\times20+98\times0.612)\approx40\%——2% 的样本承载了近 40% 的总权重;
  • 若更新幅度再大些,πθ(a1)=0.9\pi_\theta(a_1)=0.9,则 ρ=45\rho=45,a2a_2 样本的 ρ≈0.102\rho\approx0.102。此时 2 条 a1a_1 样本占总权重的 2×45/(2×45+98×0.102)≈90%2\times45/(2\times45+98\times0.102)\approx90\%——估计量几乎完全由这 2 条样本决定,方差大到失去意义。

这个算例说明 IS 修正像一台放大镜:偏移小时放大倍数接近 1,成像正常;偏移大时放大倍数失控,画面全是噪点。§3 的裁剪就是用来把放大倍数钉在安全范围内的。

3. 裁剪:给修正划定可信范围

要点:裁剪作用于 ρ\rho 本身,约束的不是参数,而是 IS 修正的可信范围。裁剪与 IS 是一对配套机制,不可分割。

3.1 裁剪的目标函数

LCLIP(θ)=E[min⁡(ρ(θ) A,  clip(ρ(θ), 1−ε, 1+ε)⋅A)](4)L^{\mathrm{CLIP}}(\theta)=\mathbb{E}\Big[\min\big(\rho(\theta)\,A,\ \ \mathrm{clip}(\rho(\theta),\,1-\varepsilon,\,1+\varepsilon)\cdot A\big)\Big] \tag{4}
(4)

先用大白话翻译式 (4) 里的 min⁡\min:它在”原样修正”和”截断修正”两个值之间取较小的那个。为什么要取较小?因为修正一旦可疑,宁可少更新一点(悲观),也不愿被可疑的修正带飞。

clip\mathrm{clip} 把 ρ\rho 截断到 [1−ε, 1+ε][1-\varepsilon,\,1+\varepsilon](ε\varepsilon 常取 0.2)。按优势符号与比率位置展开共四种情形:

优势比率区间无裁剪时的行为含 min⁡\min 后的行为
A>0A>0ρ>1+ε\rho>1+\varepsilon持续增大该动作概率,单步更新过大梯度为零,停止鼓励
A>0A>0ρ<1−ε\rho<1-\varepsilon—取 ρA\rho A 项,仍产生梯度
A<0A<0ρ<1−ε\rho<1-\varepsilon持续压低该动作概率梯度为零,停止压低
A<0A<0ρ>1+ε\rho>1+\varepsilon—取较悲观项,仍产生梯度

结论是:ρ\rho 落在区间内时式 (4) 就是普通 IS 修正目标;超出区间后,仅保留使目标变差方向的梯度(单边惩罚)。逐情形的讨论见本博客 PPO/DPO/GRPO 笔记 §1.3。

3.2 裁剪与 IS 的绑定关系

这条设计链的每一步都由上一步的失效模式驱动:

  1. 要复用数据(多 epoch)→ 需要 IS 修正;
  2. IS 修正只在偏移小时可信(§2.3)→ 需要限制偏移;
  3. 限制偏移最直接的对象就是 ρ\rho → 裁剪。

因此裁剪是 IS 修正的配套机制:它保证在 KK 个 epoch 内,修正始终在可信区间内运作。

例子:耦合关系可以量化。设每个 epoch 使动作概率相对变化约 10%。K=4K=4 时,第 3 个 epoch 起 ρ≈1.13≈1.33>1.2\rho\approx1.1^3\approx1.33>1.2,A>0A>0 样本的梯度开始被截断;K=8K=8 时 ρ≈1.95\rho\approx1.95,后半程几乎全程处于截断态。KK 决定累积偏移,ε\varepsilon 决定截断阈值,两者共同决定”第几个 epoch 开始梯度被停”。

3.3 数字算例:裁剪如何遏制方差

接 §2.3 的例子,πθold(a1)=0.02\pi_{\theta_{\mathrm{old}}}(a_1)=0.02,某条采到 a1a_1 的轨迹优势 A=+1A=+1,设 ε=0.2\varepsilon=0.2。

  • 无裁剪:若更新后 πθ(a1)=0.4\pi_\theta(a_1)=0.4,该轨迹贡献 ρA=20\rho A=20;
  • 有裁剪:ρ\rho 被截断为 1.21.2,贡献 1.21.2,权重下降 16 倍以上。且此时 min⁡\min 取裁剪项,其梯度为零——这条高方差样本被完全停用。

裁剪在方差控制上的效果是立竿见影的:它不试图”修正”高方差样本,而是直接停用它们。

4. 对比:不同算法的数据复用哲学

算法数据来源复用跨度修正机制数据失效方式
REINFORCE/A2C当前策略用一次即弃无立即失效
PPO当前策略KK 个 epochIS + 裁剪偏移超出 [1−ε,1+ε][1-\varepsilon,1+\varepsilon] 后被停用
DQN/SAC任意历史策略数十万步经验回放 + 目标网络原则上不失效
DPO静态偏好数据集整个训练过程无(不需要修正)不失效

表中最关键的是 PPO 与 DQN 在”失效方式”上的对比:PPO 的数据会主动失效——裁剪在偏移过大时自动停用样本;DQN 的数据原则上不失效,算法必须学会在”数据旧了”与”数据有用”之间权衡,经验回放的容量、采样策略、目标网络的更新频率都是为这个权衡服务的。

DPO 则是另一个极端:它把 RL 问题转化为静态偏好数据上的分类问题,数据从头到尾不变,连”新鲜度”这个概念都不存在。它不需要 IS 修正,代价是分布外退化——降低 yly_l 的概率不等于提升 ywy_w 的概率,而是提升了除 yly_l 之外的所有候选,其中可能包含更差的回答(见 PPO/DPO/GRPO 笔记 §2.5)。

一句话概括三种数据哲学:PPO 把数据当生鲜——采下即用、用几次就扔,裁剪是保鲜膜;DQN 把数据当罐头——存进回放池慢慢吃;DPO 更彻底,数据是静态偏好集,从头到尾不会过期。

5. 结论

  1. PPO 是 on-policy 算法:数据必须来自当前策略快照,一轮 rollout 后整批丢弃,没有跨迭代的经验复用结构;
  2. importance sampling 是局部修正:它服务于”同一批数据训练 KK 个 epoch”这一工程决策,只负责修正”刚过几个梯度步”的微小偏移,不负责把任意旧数据变为可训练数据;
  3. 裁剪与 IS 是配套机制:IS 修正只在偏移小时可信,裁剪直接把 ρ\rho 限制在可信范围内,两者不可分割,超参数 KK 与 ε\varepsilon 必须联合调节;
  4. PPO 处于 on-policy 与 off-policy 的中间地带:采集是 on-policy 的,利用是”局部 off-policy”的。理解这一点,才能理解它的稳定性从何而来、边界在哪里;
  5. 与真正的 off-policy 算法(DQN、SAC、DPO)相比,PPO 的哲学是”让数据保持新鲜”,而不是”让算法适应陈旧数据”。

参考文献

  1. Schulman et al. Proximal Policy Optimization Algorithms. arXiv:1707.06347, 2017.
  2. Sutton & Barto. Reinforcement Learning: An Introduction, 2nd Edition. MIT Press, 2018.(第 5.5 节讨论 on/off-policy 与重要性采样)
  3. Kakade & Langford. Approximately Optimal Approximate Reinforcement Learning. ICML 2002.(替代目标的理论基础)
  4. Mnih et al. Human-level control through deep reinforcement learning. Nature, 2015.(经验回放)
  5. Rafailov et al. Direct Preference Optimization: Your Language Model is Secretly a Reward Model. arXiv:2305.18290, 2023.