PPO 近端策略优化
给策略更新加"保险丝"——步幅太大就截断,既不保守也不冒进,这就是 PPO 的核心
01 核心原理(大白话版)
策略梯度(REINFORCE)的问题:更新步幅难以控制——步幅太小训练太慢,步幅太大策略崩溃(一次更新把好策略破坏掉后,之后收集的数据也变差,形成恶性循环)。
TRPO(信任区域策略优化)从数学上限制了策略的更新幅度(KL 散度约束),但计算代价高。PPO 用一个简单的 Clip 操作达到同样效果:直接截断策略比率 r(θ) = π_new/π_old,不让它偏离 1 太远。
PPO 还使用 Actor-Critic 结构:Actor 负责选动作(策略),Critic 负责估计状态价值 V(s),用于计算 Advantage(这个动作比平均好多少)。
从策略梯度到 PPO 的演进
等整条轨迹结束,用 G_t 更新。问题:方差大,每步数据只用一次,样本效率低。
加 KL 散度约束,保证每次更新不偏离旧策略太多。效果好但计算复杂(需要二阶优化)。
用 Clip 替代 KL 约束,一阶梯度即可,可以多次复用同一批数据,简单高效。
PPO Clip 目标函数
r(θ) = π_θ(a|s) / π_θ_old(a|s),ε 通常取 0.2
步骤1:策略比率 r(θ) = π_new / π_old
步骤2:Clip 目标函数——给更新加保险丝
步骤3:Advantage 估计(GAE)
GAE(广义优势估计)用 λ 在 TD 误差和 MC 回报之间平衡偏差与方差:
步骤4:PPO 完整训练(Actor-Critic + Clip)
在 GridWorld 上训练 Actor-Critic,观察 PPO 如何比 REINFORCE 更稳定:
为什么 PPO 无处不在? ChatGPT 的 RLHF(从人类反馈中强化学习)阶段就使用 PPO:用人类偏好信号训练奖励模型,再用 PPO 优化语言模型策略。PPO 的稳定性和简单性让它成为了 RL Fine-tuning 的默认选择。
02 代码
修改 EPSILON(截断范围)和 PPO_EPOCHS(每批更新次数),观察对训练稳定性的影响。
03 学术性讲解
为什么 Clip 有效?
当 A > 0(好动作),r 超过 1+ε 后梯度变为 0——已经足够好了,不再继续增大比率; 当 A < 0(坏动作),r 低于 1-ε 后梯度也变为 0——不过度惩罚。 这相当于在目标函数上加了一个隐式的"KL 惩罚",但实现比 TRPO 简单得多。
PPO 的完整损失函数
L_VF:Critic 均方误差;H[π]:策略熵(鼓励探索);c₁≈0.5,c₂≈0.01
关键超参数
ε(截断范围)
通常 0.1~0.3,越小越保守。ε=0.2 是 OpenAI 原论文默认值,大多数任务适用。
GAE λ
通常 0.9~0.99。λ 越小偏差越大但方差小;λ=1 等于 MC,方差最大。
PPO Epochs
每批数据重复更新的次数,通常 3~10。太多会让新策略偏离旧策略太远(Clip 失效)。
PPO vs 其他算法
vs REINFORCE
PPO 可复用数据(off-policy 近似),更新更稳定,样本效率更高。
vs TRPO
效果相近,但 PPO 只需一阶梯度,代码简单,可在分布式环境中轻松扩展。
vs SAC(连续动作)
SAC(Soft Actor-Critic)在连续控制任务中通常优于 PPO,但 PPO 在离散动作和 LLM 微调中更常用。