土法炼钢兴趣小组的算法知识备份

【强化学习与大模型后训练】05|PPO 深度解剖:裁剪目标、KL 约束与实现陷阱

文章导航

分类入口
rl-posttraining
标签入口
#ppo#trpo#policy-gradient#gae#rlhf#kl-penalty#implementation-details#advantage-normalization

目录

PPO 最容易被误解成一个简单的 clip 技巧。 真正的问题不是把公式背下来,而是理解为什么策略梯度在复用同一批轨迹做多轮 minibatch 更新时会突然变得危险。

这篇文章从 TRPO 的信任域出发,推到 PPO 的重要性采样比率与裁剪目标,再落到代码里的 value clipping、优势归一化、KL 到参考模型惩罚和学习率退火。 读完你应该能看懂一份 PPO/RLHF 训练日志里哪些信号代表正常探索,哪些信号代表策略正在被训坏。

一、从策略梯度到信任域问题

上一篇讨论 Actor-Critic 和 GAE 时,策略更新的核心形式是用优势函数给采样动作加权。 若 \(\theta_{old}\) 是采样轨迹时的策略参数,朴素做法会把这些轨迹当成当前策略的数据反复训练。

问题在于策略梯度是 on-policy 方法。 数据来自旧策略,梯度却作用在新策略上;当新旧策略差距变大,估计偏差会迅速扩大。

PPO 要解决的不是“让更新更大”,而是“在仍然利用 minibatch 多轮训练的情况下,不让策略一步跨出可信范围”。

策略优化的局部目标可以写成:

\[ L^{PG}(\theta)=\mathbb{E}_t[\log \pi_\theta(a_t|s_t)\hat A_t] \]

TRPO 把这件事表述成带约束优化。 它最大化代理目标,同时限制新旧策略的平均 KL 散度不超过一个小半径。

\[ \max_\theta \ \mathbb{E}_t\left[\frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}\hat A_t\right] \quad \text{s.t.}\quad \mathbb{E}_t[D_{KL}(\pi_{\theta_{old}}(\cdot|s_t)\|\pi_\theta(\cdot|s_t))]\le \delta \]

Schulman et al. 2015 的 TRPO 用二阶近似和共轭梯度来解这个信任域问题。 它给出了重要思想,但实现复杂,对深度网络和大规模分布式训练不够友好。

二、重要性采样比率是 PPO 的入口

PPO 的第一个关键量是重要性采样比率。 它衡量同一个动作在新策略和旧策略下概率的相对变化。

\[ r_t(\theta)=\frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)} \]

如果 \(r_t(\theta)=1\),说明新旧策略对这个动作给出的概率相同。 若 \(r_t(\theta)=1.2\),说明新策略把该动作概率提高了 20%。 若 \(r_t(\theta)=0.7\),说明新策略把该动作概率降低到旧策略的 70%。

带比率的代理目标是:

\[ L^{CPI}(\theta)=\mathbb{E}_t[r_t(\theta)\hat A_t] \]

这个目标看似自然,但没有约束。 若 \(\hat A_t>0\),优化器会不断增大 \(r_t\);若 \(\hat A_t<0\),优化器会不断压低 \(r_t\)。 在神经网络参数空间里,这种局部收益可能对应全局分布的大幅漂移。

三、裁剪目标为什么是悲观下界

PPO-Clip 把比率限制在一个局部窗口内。 常见窗口是 \([1-\epsilon,1+\epsilon]\),例如 \(\epsilon=0.2\)

\[ L^{CLIP}(\theta)=\mathbb{E}_t\left[\min\left(r_t(\theta)\hat A_t,\ \mathrm{clip}(r_t(\theta),1-\epsilon,1+\epsilon)\hat A_t\right)\right] \]

这个 min 不是为了数值好看,而是构造一个悲观目标。 它保留对保守更新的奖励,但截断会让目标函数对“过度改变概率”的方向不再继续给梯度收益。

分两种情况看最清楚:

PPO 的直觉可以浓缩成一句话:

同一批轨迹只可信到一个局部邻域;PPO 用裁剪代理目标把“看似有利但跨出邻域”的梯度收益拿掉。

四、完整目标:策略、价值与熵

实际 PPO 不是只优化 \(L^{CLIP}\)。 Actor-Critic 版本还要同时训练价值函数,并用熵奖励延缓策略过早塌缩。

\[ L_t(\theta)=\mathbb{E}_t\left[L_t^{CLIP}(\theta)-c_1L_t^{VF}(\theta)+c_2S[\pi_\theta](s_t)\right] \]

这里 \(L_t^{VF}\) 是 value loss,\(S[\pi_\theta]\) 是策略熵,\(c_1\)\(c_2\) 控制两项权重。 实现里通常把 actor loss、critic loss、entropy bonus 分开记录,而不是只看一个总 loss。

组成 作用 常见日志名 失败信号
policy loss 推动策略提高高优势动作概率 policy_loss clip fraction 长期接近 1 或 KL 突增
value loss 让 critic 拟合回报或 GAE 目标 value_loss 值函数解释不了 reward,优势方差很大
entropy bonus 保持探索,避免过早确定 entropy 熵快速归零,输出模式单一
approx KL 监控新旧策略距离 approx_kl 超过目标 KL 多倍仍继续训练

value clipping 是 PPO 实现里常见但容易漏掉的细节。 它限制新 value 相对旧 value 的变化幅度,防止 critic 在多轮 minibatch 训练里追着噪声回报大幅摆动。

五、KL penalty 版本与自适应系数

PPO 论文同时讨论了 clipped surrogate 和 KL penalty 变体。 KL penalty 版本不直接裁剪 \(r_t\),而是在目标里加入新旧策略的 KL 惩罚。

\[ L^{KLPEN}(\theta)=\mathbb{E}_t\left[r_t(\theta)\hat A_t-\beta D_{KL}(\pi_{\theta_{old}}(\cdot|s_t)\|\pi_\theta(\cdot|s_t))\right] \]

固定 \(\beta\) 简单,但不同任务、不同训练阶段的合适 KL 强度不同。 自适应 KL 方案会根据当前 KL 是否高于目标来增减 \(\beta\)

一个简化控制逻辑如下:

note = "示意:自适应 KL 系数,不是论文或框架源码"
if measured_kl > 1.5 * target_kl:
    beta *= 2.0
elif measured_kl < target_kl / 1.5:
    beta /= 2.0

在 RLHF 里还会出现另一种 KL:policy 到 reference model 的 KL。 它不是 PPO 新旧策略 KL,而是防止模型远离 SFT/reference 分布的奖励惩罚项。

\[ R(x,y)=r_\phi(x,y)-\beta\sum_t\left(\log \pi_\theta(y_t|x,y_{<t})-\log \pi_{ref}(y_t|x,y_{<t})\right) \]

这项 KL-to-reference 在语言模型后训练里至关重要。 它把“让奖励模型给高分”和“不要偏离可读、可控、原有能力分布太远”绑在一起。

六、PPO 更新循环

flowchart TD
    A[收集轨迹] --> B[冻结 old policy logprob]
    B --> C[计算 reward 与 value]
    C --> D[GAE 得到 advantage]
    D --> E[优势归一化]
    E --> F[多轮 minibatch 更新]
    F --> G[计算 ratio 与 clipped loss]
    G --> H[更新 actor critic]
    H --> I{KL 或 clip fraction 过高?}
    I -- 是 --> J[提前停止或降低步长]
    I -- 否 --> K[进入下一批采样]
    J --> K

图里的关键是 old logprob 必须来自采样时的策略,并在整轮 PPO epoch 内保持不变。 若边采样边覆盖旧 logprob,ratio 的含义会被破坏。

七、代码级实现陷阱

Engstrom et al. 2020 的核心提醒是:深度策略梯度的结果很大程度取决于实现细节。 PPO 论文公式只定义了主目标,真正决定训练是否稳定的是一串小开关。

Huang et al. 2024 针对 RLHF with PPO 系统整理了大量实现细节。 语言模型场景比 MuJoCo 更敏感,因为动作空间是词表,轨迹长度可变,reward 来自代理模型,KL 惩罚又改变了每个 token 的回报。

八、逐项实现核对清单

1. 优势归一化

2. value clipping

3. 奖励缩放

4. 观测或输入归一化

5. 学习率退火

6. GAE 的 \(\lambda\)

7. minibatch epochs

8. ratio 计算

9. mask 处理

10. KL 到参考模型

11. 熵奖励

12. 梯度裁剪

13. early stopping

14. 随机种子

15. 分布式同步

16. 长度偏置

九、PPO 在 RLHF 中的特殊性

传统 PPO 面对的是环境给出的 reward。 RLHF PPO 面对的是 reward model、KL-to-reference、长度规范和采样温度共同构成的奖励。

这意味着 PPO 只是优化器,后训练质量还取决于偏好数据、奖励模型校准、reference 选择和评测闭环。 第 09 篇会把这些组件串成完整 RLHF 链路。

十、训练日志判读清单

1. KL 突然升高

2. clip fraction 过高

3. reward 上升但人评下降

4. value loss 不降

5. entropy 过快下降

6. 优势均值偏离零

7. ratio 出现极端值

8. 长度分布漂移

9. 多卡结果不一致

10. 学习率退火过慢

11. GAE 方差过大

12. reference 不匹配

13. RM 延迟过高

14. padding 参与损失

15. reward 尺度换版

16. 样本复用过度

17. 梯度爆炸

18. 评测回归

19. 日志命名混乱

20. 采样温度变化

十一、参考资料

← 上一篇:04|Actor-Critic 与优势函数、GAE | 下一篇:06|后训练全景

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。


By .