PPO:Proximal Policy Optimization
用概率比率裁剪限制策略单次更新幅度的 on-policy Actor-Critic 方法。
学习目标
- 理解 clipped surrogate 的单侧激励限制,避免误称为硬性策略距离约束。
- 独立复核“正负优势下的裁剪方向不同”的输入、计算和解释。
- 裁剪限制进一步改善方向上的激励。
为什么重要
理解 clipped surrogate 的单侧激励限制,避免误称为硬性策略距离约束。
学习前需要掌握
背景与问题
直接对同一批好动作大幅提高概率,可能让策略迅速失去原有能力。PPO 在新旧策略概率比率上构造裁剪代理目标,用有限轮小批量优化提高数据利用率,同时监测实际更新是否过大。
概念定义
PPO 的常见 clip 版本固定采样策略的旧对数概率与优势,优化新旧动作概率比率乘优势的保守代理目标。它通常配合 GAE、价值损失和熵项;数据来自近期策略,并不支持无限复用任意历史 replay。
直观理解
对好动作增加概率有收益,但增加到某程度后,这个样本不再给额外奖励;对坏动作也有对应的单侧限制。限制的是代理目标的激励,不是把整个新策略锁在固定距离球内。
核心原理
比率为 exp(new_log_prob−old_log_prob),旧概率必须来自生成该数据的策略并保持固定。若每轮都重算并覆盖旧概率,比率会错误地回到 1,失去对更新幅度的参照。
优势为正时,过大的比率被截去额外收益;优势为负时,过小的比率被限制。min 作用和优势符号必须一起理解,不能先裁剪比率就宣称与原始 min 公式在所有方向等价。
裁剪不保证每个状态的概率比率或 KL 都被硬性约束。多轮更新、共享价值梯度和批外状态仍可能导致明显变化,所以常结合近似 KL、clip fraction、熵与早停诊断。
数学表达
PPO clipped objective
取未裁剪与裁剪目标的较小值。
变量含义
r_t(θ)新旧策略对已采样动作的概率比。Â_tAdvantage 估计,常用 GAE。εclip range。π_old收集当前 rollout 的旧策略。
计算步骤
- 1正优势项取 min(1.5×2,1.2×2)=2.4。
- 2负优势项取 min(0.5×−2,0.8×−2)=−1.6。
- 3两项平均代理目标为 0.4;这是构造批次的目标值。
代码对应位置
示例 1PPO clipped surrogate objective:直接计算概率比率、未裁剪目标和裁剪目标。
变量解释
| 变量 | 含义 |
|---|---|
r_t(θ) | 新旧策略对已采样动作的概率比。 |
Â_t | Advantage 估计,常用 GAE。 |
ε | clip range。 |
π_old | 收集当前 rollout 的旧策略。 |
完整数值示例
正负优势下的裁剪方向不同
已知条件
- 两个样本概率比率为 1.5、0.5,优势为 +2、−2。
- 裁剪区间为 0.8 到 1.2。
计算步骤
- 正优势项取 min(1.5×2,1.2×2)=2.4。
- 负优势项取 min(0.5×−2,0.8×−2)=−1.6。
- 两项平均代理目标为 0.4;这是构造批次的目标值。
计算结果
裁剪后两项为 2.4、−1.6,平均为 0.4。
处理前后对比
- 裁剪限制进一步改善方向上的激励。
- 示例输出的 policy loss 为负代理目标,符号来自最小化约定。
计算与实现步骤
- 用 old policy 收集 rollout
- 估计 returns/GAE
- 保存 old log probability
- 多 epoch mini-batch
- 优化 clipped policy loss + value loss − entropy bonus
- 丢弃旧 rollout 再采样
代码实现
示例 1
PPO clipped surrogate objective
example_01.py用途:直接计算概率比率、未裁剪目标和裁剪目标。
import torch
old_log_prob = torch.log(torch.tensor([0.40, 0.55, 0.25]))
new_log_prob = torch.log(torch.tensor([0.52, 0.45, 0.50], requires_grad=True))
advantage = torch.tensor([1.2, -0.7, 0.4])
clip_range = 0.2
ratio = torch.exp(new_log_prob - old_log_prob)
unclipped = ratio * advantage
clipped_ratio = torch.clamp(ratio, 1 - clip_range, 1 + clip_range)
clipped = clipped_ratio * advantage
policy_loss = -torch.minimum(unclipped, clipped).mean()
policy_loss.backward()
print('ratio:', ratio.detach())
print('clipped ratio:', clipped_ratio.detach())
print('loss:', round(policy_loss.item(), 4))代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
直接计算概率比率、未裁剪目标和裁剪目标。
mean- 训练特征逐列均值。
loss- 当前预测与目标之间的损失值。
Step 1 · 1–1 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import torchStep 2 · 3–6 行
clamp 将比率限制在 [1−ε,1+ε];minimum 构造保守代理目标。
old_log_prob = torch.log(torch.tensor([0.40, 0.55, 0.25]))
new_log_prob = torch.log(torch.tensor([0.52, 0.45, 0.50], requires_grad=True))
advantage = torch.tensor([1.2, -0.7, 0.4])
clip_range = 0.2Step 3 · 8–13 行
只从训练数据逐列计算均值与标准差,对应标准化公式中的 μ 和 σ。
ratio = torch.exp(new_log_prob - old_log_prob)
unclipped = ratio * advantage
clipped_ratio = torch.clamp(ratio, 1 - clip_range, 1 + clip_range)
clipped = clipped_ratio * advantage
policy_loss = -torch.minimum(unclipped, clipped).mean()
policy_loss.backward()Step 4 · 15–17 行
计算当前预测误差,把模型表现压缩成可优化的标量损失。
print('ratio:', ratio.detach())
print('clipped ratio:', clipped_ratio.detach())
print('loss:', round(policy_loss.item(), 4))代码与数学原理
减去训练均值并除以训练标准差,对应代码中的 mean/std 或 StandardScaler。
平方误差代码对应均方损失。
预期输出或运行结果
ratio: tensor([1.3000, 0.8182, 2.0000]) clipped ratio: tensor([1.2000, 0.8182, 1.2000]) loss: -0.4491
常见错误 · 4 条
- 不要在测试集上调用 fit 或 fit_transform;测试集只能复用训练参数。
- 用新策略覆盖采样时的旧概率。
- 忽略负优势时 min 的符号效应。
- 把 clip 范围当作全策略 KL 的严格保证。
实际应用
- 序贯决策
- 控制与资源分配
常见错误
- 用新策略覆盖采样时的旧概率。
- 忽略负优势时 min 的符号效应。
- 把 clip 范围当作全策略 KL 的严格保证。
扩展内容说明
本页数值均为解释机制的构造案例,不能解读为真实训练或基准性能。定义和适用条件参见 Schulman 等:Proximal Policy Optimization Algorithms。
算法属性与数据边界
目标函数
clipped surrogate + value loss + entropy bonus
Advantage
常用 GAE
Clip Range
常见 0.1–0.2,需按任务调节
与 DQN、SAC 及相邻方法对照
- 传统意义策略优化算法
- on-policy
- 通常不使用跨 rollout replay buffer
失败模式、风险与性能
失败模式
- 用新策略覆盖采样时的旧概率。
- 忽略负优势时 min 的符号效应。
- 把 clip 范围当作全策略 KL 的严格保证。
风险
- 奖励函数与真实目标不一致会诱发奖励黑客。
- 部署策略的行动权限必须由环境和应用层约束。
性能考虑
- 样本效率、墙钟时间和显存占用需要分别报告。
- 应使用多个随机种子、置信区间和固定评测策略。
常见问题
PPO 能反复训练同一个数据集吗?
通常只对近期 rollout 做有限轮优化,再重新采样。长期固定数据会出现策略分布与覆盖问题,PPO clip 本身不能将其变成可靠离线算法。
网页是否会训练模型?
不会。所有图表使用固定种子或解析公式在浏览器本地计算,不执行页面中的示例代码。
推荐学习资料
Spinning Up in Deep RL
从术语、数学背景和算法分类进入 VPG、TRPO、PPO、DDPG、TD3 与 SAC。
OpenAI · OpenAI
资料笔记
Hugging Face Deep Reinforcement Learning Course
从 Q-Learning、DQN、Policy Gradient 和 Actor-Critic 逐步进入 PPO 与多智能体。
Hugging Face · Hugging Face
资料笔记
Proximal Policy Optimization Algorithms
提出基于概率比率裁剪的策略优化目标,限制单次更新幅度并复用 rollout。
Schulman et al. · arXiv
资料笔记
vwxyzjn/cleanrl
以单文件实现和实验报告呈现 DQN、PPO、SAC 等深度强化学习算法。
CleanRL Contributors · GitHub
仓库信息
阅读可复现的单文件 RL 算法实现
主要语言:Python包含数据集或实验需要额外环境