01 核心原理(大白话版)

策略梯度(REINFORCE)的问题:更新步幅难以控制——步幅太小训练太慢,步幅太大策略崩溃(一次更新把好策略破坏掉后,之后收集的数据也变差,形成恶性循环)。

TRPO(信任区域策略优化)从数学上限制了策略的更新幅度(KL 散度约束),但计算代价高。PPO 用一个简单的 Clip 操作达到同样效果:直接截断策略比率 r(θ) = π_new/π_old,不让它偏离 1 太远。

PPO 还使用 Actor-Critic 结构:Actor 负责选动作(策略),Critic 负责估计状态价值 V(s),用于计算 Advantage(这个动作比平均好多少)。

从策略梯度到 PPO 的演进

1
策略梯度(REINFORCE)

等整条轨迹结束,用 G_t 更新。问题:方差大,每步数据只用一次,样本效率低。

2
TRPO(2015)

加 KL 散度约束,保证每次更新不偏离旧策略太多。效果好但计算复杂(需要二阶优化)。

3
PPO(2017)

用 Clip 替代 KL 约束,一阶梯度即可,可以多次复用同一批数据,简单高效。

PPO Clip 目标函数

L_CLIP(θ) = E[ min( r(θ)·A, clip(r(θ), 1-ε, 1+ε)·A ) ]
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 = L_CLIP − c₁·L_VF + c₂·H[π]
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 微调中更常用。