PPO
Proximal Policy Optimization,近端策略优化,限制每次策略更新的幅度来提高训练的稳定性。
- on-policy algorithm,支持离散或连续动作空间,以及Spinning Up 实现的 PPO 支持MPI并行计算
通常指的是PPO-Clip,不像TRPO使用复杂二阶方法加 KL 约束,而是在目标函数里用 clipping 去掉“新策略离旧策略太远还能继续获益”的激励。
Advantage estimation using GAE
PPO 通常需要计算 advantage:
A_t = Q(s_t, a_t) - V(s_t)
表示这个动作比当前状态下的平均水平好多少,但真实的 Q 其实不好算,所以常用 GAE,即 Generalized Advantage Estimation。用 value function 降低 policy gradient 的方差,但会引入一定 bias;GAE 用一个指数加权形式在 bias 和 variance 之间折中。不过还是需要学习一个 value function,GAE 大概是:
δ_t = r_t + γ V(s_{t+1}) - V(s_t)
A_t^GAE = δ_t + γλδ_{t+1} + (γλ)^2δ_{t+2} + ...
Policy clipping with ratio limits
目标函数可以写成:
L = min(
r_t(θ) * A_t,
clip(r_t(θ), 1 - ε, 1 + ε) * A_t
)
其中使用一个比率r_t(θ) = π_θ(a_t | s_t) / π_old(a_t | s_t),指示当前策略与旧策略之间的差异,并将此比率裁剪到特定范围,防止策略突然变太多。
clip(ratio, 1 - ε, 1 + ε)
目标 L 简化后可以理解为,当 A 为正时取 min(ratio, 1 + ε),当 A 为负时取 max(ratio, 1 - ε)。
当比率被裁剪时,导数将不是 rt(θ)∗At 的导数,而是 (1−ϵ)∗At 或 (1+ϵ)∗At的导数,而这两者都等于 0。因为此时已经比先前策略有更高的概率在该状态下采取该行动,因此梯度为 0 不去更新权重。
这种裁剪机制虽能在很大程度上保障策略更新的合理性,但仍有可能生成与旧策略差异过大的新策略。各种 PPO实现方案中采用了多种技巧来规避该问题,一种简便的方法是在新旧策略间的平均 KL 散度超过设定阈值,就停止梯度下降迭代,提前终止训练。
Entropy regularization
Entropy 是策略分布的随机性。PPO 里最终目标函数除了上面的 L 还会加上
- coef*value_loss + entropy_coef * entropy
让 value_loss 尽量小用于学习value function,让 entropy 尽量大帮助探索,防止策略太早 collapse 到某几个动作。
GRPO
deepseek的创举,为后来的R1奠定直接的基础,顿悟时刻的揭幕人
Group Relative Policy Optimization,是 PPO 的变体,主要特点是不训练 critic/value model,而是用同一个问题下多个输出的组内奖励来估计 baseline,从而减少 PPO 的内存和计算开销。GRPO 的流程是:
给定一个 state / prompt x
从当前 policy 采样 G 个 actions / responses:
a1, a2, ..., aG
分别得到 reward:
r1, r2, ..., rG
计算组内平均 reward:
mean_r = mean(r1, ..., rG)
每个 action 的 advantage:
A_i = r_i - mean_r
但如果是稀疏奖励,reward全是0 就没有梯度信号了。
后言
后续有空的话也许会尝试在某个小游戏中实现一下ppo?
参考: