PPO:近端策略优化
PPO 是目前最常用的 on-policy 算法之一:用 clip 限制策略更新幅度,训起来稳、调参友好。
Actor-Critic 结构
| 组件 | 输出 | 作用 |
|---|---|---|
| Actor π_θ(a|s) | 高斯分布 N(μ(s), σ) | 选连续力 |
| Critic V_φ(s) | 标量价值 | 估计期望回报,降低方差 |
本仓库实现见 src/ppo/networks.py:两套 MLP,log_std 为可学习参数。
采集轨迹 → GAE
- 用当前策略在环境里滚
steps_per_env步,存 (s,a,r,done,logπ,V)。 - 用 GAE(λ) 算优势 Â:结合时序差分与多步回报,偏差-方差可调。
- 回报目标 R̂ = Â + V(s),用来监督 Critic。
δ_t = r_t + γ V(s_{t+1})(1−d_t) − V(s_t)
A_t = δ_t + γλ(1−d_t) A_{t+1}
A_t = δ_t + γλ(1−d_t) A_{t+1}
Clip 目标(核心)
r_t(θ) = π_θ(a_t|s_t) / π_θ_old(a_t|s_t)
L^CLIP = E[ min( r_t Â_t , clip(r_t, 1−ε, 1+ε) Â_t ) ]
L^CLIP = E[ min( r_t Â_t , clip(r_t, 1−ε, 1+ε) Â_t ) ]
当新策略相对旧策略偏离过大时,clip 截断梯度,避免一次更新毁掉已学行为。 ε 默认 0.2。本实现总损失还加价值 MSE 与熵奖励:
L = −L^CLIP + c_v L^VF − c_e H[π]
训练时看哪些量
- mean reward / ep length:任务是否变好(主指标)。
- approx KL / clip fraction:更新是否过大。
- entropy:探索是否枯竭;过早下降可略增 entropy_coef。
对照阅读:
src/ppo/algorithm.py 的 update() 几乎就是上面公式的直译。