PPO 是 on-policy 还是 off-policy:importance sampling 到底在修正什么
摘要
PPO 的目标函数里有一个重要性比率 ,这让它看起来像是 off-policy 算法。本文论证相反的观点:PPO 在数据采集环节是严格的 on-policy,importance sampling 只是为了让同一批 on-policy 数据能被多轮复用而引入的局部修正,且裁剪机制的存在恰恰是为了阻止这种修正被用到不可信的范围——这与经验回放类算法”让算法适应陈旧数据”的 off-policy 哲学相反。
0. 定义:on-policy 与 off-policy 的判据
0.1 两种范式的定义
on-policy(同策略):用于更新策略的数据必须由待更新的策略自己产生。
off-policy(异策略):用于更新策略的数据可以由任意其它策略产生,包括许多次迭代之前的旧版本策略。
判据不在目标函数长什么样,而在数据的生命周期:一批数据从采集到失效,允许被复用的时间跨度。
例子:同一条轨迹样本 。在 A2C 里,它被用于一次更新后立即作废;在 DQN 里,它进入容量 100 万的经验回放池,平均会被重新采样 8 次、跨越数十万步仍然有效。同一条数据,两种寿命——这就是两种范式的判据。
0.2 记号约定
| 记号 | 含义 |
|---|---|
| 待优化的策略 | |
| 采样数据时的策略快照 | |
| 重要性比率 | |
| 优势函数 | |
| PPO 裁剪范围 |
1. 为什么说 PPO 是 on-policy
要点:PPO 的数据必须来自当前策略快照,一轮 rollout 后整批丢弃,没有任何跨迭代的复用结构;裁剪机制的存在本身就是 on-policy 的证据。
1.1 策略梯度定理的采样要求
策略梯度定理给出
先用大白话翻译式 (1):采到好轨迹,就提高它的概率;采到坏轨迹,就压低它的概率。 但注意期望的下标 ——样本必须来自当前策略。换一种说法:你只能用”自己现在会做出的行为”来改进自己;如果数据是旧版本的你产生的,就需要额外的修正。这正是后文 importance sampling 的来历。
PPO 的训练循环完全遵守这一要求:
- 采样:用当前参数 的策略 与环境交互,收集一批轨迹;
- 优化:在这批数据上做 个 epoch 的梯度上升;
- 丢弃:整批数据作废,,回到第 1 步。
数据只活一轮。 对比 DQN 的经验回放池——其中可能存放着数十万步之前、由几十个不同版本的策略产生的样本——PPO 完全没有这种结构。从数据生命周期的角度看,PPO 是 on-policy 的。
一个常见的误解是”PPO 用旧策略的数据更新新策略,所以是 off-policy”。这个论证不成立:任何 on-policy 算法在参数更新的瞬间,手里的数据都来自上一版策略。 严格的例子:REINFORCE 的 batch 在第一次梯度更新后就已经”过期”—— 变了,样本就不再来自当前策略。它只是选择不用,而不是数据没过期。PPO 与 REINFORCE 的区别不在于”数据是否过期”,而在于”有没有修正过期的机制”。
1.2 裁剪的存在本身是 on-policy 的证据
如果 PPO 真是 off-policy 算法,就不需要裁剪——off-policy 的核心能力恰恰是处理任意程度的分布偏移。
例子:同一条 的样本——某个动作在旧策略下几乎不选,新策略现在很爱选。PPO 的裁剪直接把它停用(梯度为零);DQN 里没有 这个概念,照单全收继续训练。一个在”阻止数据变陈旧”,一个在”适应数据陈旧”。
而 PPO 的裁剪做的事是:一旦新策略偏离采样策略超过 ,就停止该样本的梯度。这是”防止偏移扩大”的机制,与 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 的核心工程决策是:同一批数据训练 个 epoch(典型值 )。
但第 2 个 epoch 开始时, 已经不再是 。数据是 采的,梯度却要按 算。这正是 importance sampling 的登场位置。
2.2 修正推导
对任意函数 ,期望的换分布公式是精确恒等式:
先用直觉理解它:你想算”新策略下某个量的平均值”,但手里的数据是旧策略采的。办法是给每条样本乘一个权重——“新策略选这个动作的概率 ÷ 旧策略选它的概率”。新策略更喜欢的动作权重 >1,往上抬;新策略更冷落的动作权重 <1,往下压。加权平均之后,就相当于从新策略采的样。
例子(验算一遍再信):取 ,,,。左边 ;右边 。两边严格相等——修正是精确的,不是近似的。
代入优势函数即得 PPO 的替代目标(未裁剪形式):
两个观察:
- 第一个 epoch 的第一次更新之前,,每个样本的 ,式 (3) 恰好退化为普通策略梯度——修正系数等于 1,等于没修正;
- 从 开始移动起, 才承担起修正分布偏移的职责。
所以 IS 修正的幅度与偏移量成正比:偏移为零时它退场,偏移增大时它介入,偏移过大时它失效(见 §2.3)。PPO 对它的使用始终停留在第二档——这正是”局部修正”的含义。
2.3 修正的适用边界
式 (2) 是精确恒等式,但对有限样本的估计量而言,修正后的方差随偏移增大而爆炸。
数字算例:设某状态下有两个动作,,。采样 100 条轨迹,按期望有 2 条采到 。
- 若更新后 ,则这两条轨迹的 ;而 样本的 。总权重中 样本占 ——2% 的样本承载了近 40% 的总权重;
- 若更新幅度再大些,,则 , 样本的 。此时 2 条 样本占总权重的 ——估计量几乎完全由这 2 条样本决定,方差大到失去意义。
这个算例说明 IS 修正像一台放大镜:偏移小时放大倍数接近 1,成像正常;偏移大时放大倍数失控,画面全是噪点。§3 的裁剪就是用来把放大倍数钉在安全范围内的。
3. 裁剪:给修正划定可信范围
要点:裁剪作用于 本身,约束的不是参数,而是 IS 修正的可信范围。裁剪与 IS 是一对配套机制,不可分割。
3.1 裁剪的目标函数
先用大白话翻译式 (4) 里的 :它在”原样修正”和”截断修正”两个值之间取较小的那个。为什么要取较小?因为修正一旦可疑,宁可少更新一点(悲观),也不愿被可疑的修正带飞。
把 截断到 ( 常取 0.2)。按优势符号与比率位置展开共四种情形:
| 优势 | 比率区间 | 无裁剪时的行为 | 含 后的行为 |
|---|---|---|---|
| 持续增大该动作概率,单步更新过大 | 梯度为零,停止鼓励 | ||
| — | 取 项,仍产生梯度 | ||
| 持续压低该动作概率 | 梯度为零,停止压低 | ||
| — | 取较悲观项,仍产生梯度 |
结论是: 落在区间内时式 (4) 就是普通 IS 修正目标;超出区间后,仅保留使目标变差方向的梯度(单边惩罚)。逐情形的讨论见本博客 PPO/DPO/GRPO 笔记 §1.3。
3.2 裁剪与 IS 的绑定关系
这条设计链的每一步都由上一步的失效模式驱动:
- 要复用数据(多 epoch)→ 需要 IS 修正;
- IS 修正只在偏移小时可信(§2.3)→ 需要限制偏移;
- 限制偏移最直接的对象就是 → 裁剪。
因此裁剪是 IS 修正的配套机制:它保证在 个 epoch 内,修正始终在可信区间内运作。
例子:耦合关系可以量化。设每个 epoch 使动作概率相对变化约 10%。 时,第 3 个 epoch 起 , 样本的梯度开始被截断; 时 ,后半程几乎全程处于截断态。 决定累积偏移, 决定截断阈值,两者共同决定”第几个 epoch 开始梯度被停”。
3.3 数字算例:裁剪如何遏制方差
接 §2.3 的例子,,某条采到 的轨迹优势 ,设 。
- 无裁剪:若更新后 ,该轨迹贡献 ;
- 有裁剪: 被截断为 ,贡献 ,权重下降 16 倍以上。且此时 取裁剪项,其梯度为零——这条高方差样本被完全停用。
裁剪在方差控制上的效果是立竿见影的:它不试图”修正”高方差样本,而是直接停用它们。
4. 对比:不同算法的数据复用哲学
| 算法 | 数据来源 | 复用跨度 | 修正机制 | 数据失效方式 |
|---|---|---|---|---|
| REINFORCE/A2C | 当前策略 | 用一次即弃 | 无 | 立即失效 |
| PPO | 当前策略 | 个 epoch | IS + 裁剪 | 偏移超出 后被停用 |
| DQN/SAC | 任意历史策略 | 数十万步 | 经验回放 + 目标网络 | 原则上不失效 |
| DPO | 静态偏好数据集 | 整个训练过程 | 无(不需要修正) | 不失效 |
表中最关键的是 PPO 与 DQN 在”失效方式”上的对比:PPO 的数据会主动失效——裁剪在偏移过大时自动停用样本;DQN 的数据原则上不失效,算法必须学会在”数据旧了”与”数据有用”之间权衡,经验回放的容量、采样策略、目标网络的更新频率都是为这个权衡服务的。
DPO 则是另一个极端:它把 RL 问题转化为静态偏好数据上的分类问题,数据从头到尾不变,连”新鲜度”这个概念都不存在。它不需要 IS 修正,代价是分布外退化——降低 的概率不等于提升 的概率,而是提升了除 之外的所有候选,其中可能包含更差的回答(见 PPO/DPO/GRPO 笔记 §2.5)。
一句话概括三种数据哲学:PPO 把数据当生鲜——采下即用、用几次就扔,裁剪是保鲜膜;DQN 把数据当罐头——存进回放池慢慢吃;DPO 更彻底,数据是静态偏好集,从头到尾不会过期。
5. 结论
- PPO 是 on-policy 算法:数据必须来自当前策略快照,一轮 rollout 后整批丢弃,没有跨迭代的经验复用结构;
- importance sampling 是局部修正:它服务于”同一批数据训练 个 epoch”这一工程决策,只负责修正”刚过几个梯度步”的微小偏移,不负责把任意旧数据变为可训练数据;
- 裁剪与 IS 是配套机制:IS 修正只在偏移小时可信,裁剪直接把 限制在可信范围内,两者不可分割,超参数 与 必须联合调节;
- PPO 处于 on-policy 与 off-policy 的中间地带:采集是 on-policy 的,利用是”局部 off-policy”的。理解这一点,才能理解它的稳定性从何而来、边界在哪里;
- 与真正的 off-policy 算法(DQN、SAC、DPO)相比,PPO 的哲学是”让数据保持新鲜”,而不是”让算法适应陈旧数据”。
参考文献
- Schulman et al. Proximal Policy Optimization Algorithms. arXiv:1707.06347, 2017.
- Sutton & Barto. Reinforcement Learning: An Introduction, 2nd Edition. MIT Press, 2018.(第 5.5 节讨论 on/off-policy 与重要性采样)
- Kakade & Langford. Approximately Optimal Approximate Reinforcement Learning. ICML 2002.(替代目标的理论基础)
- Mnih et al. Human-level control through deep reinforcement learning. Nature, 2015.(经验回放)
- Rafailov et al. Direct Preference Optimization: Your Language Model is Secretly a Reward Model. arXiv:2305.18290, 2023.