从反向传播角度理解 PPO 损失函数
从反向传播角度理解 PPO 损失函数
PPO (Proximal Policy Optimization) 是当前强化学习领域应用最广的算法之一,尤其是在大语言模型的 RLHF 训练中。但很多人看 PPO 论文时,会被那个复杂的损失函数绕晕——为什么有三个部分?为什么要 clip?熵项又是干嘛的?
如果我们把 PPO 放在反向传播的框架下看,这些设计的意图就会清晰很多。本质上,PPO 的损失函数是在反向传播过程中构建了一个受约束的多目标优化系统,三股梯度流同时作用在 Actor 和 Critic 两个网络上。
为什么需要 PPO?
在 PPO 出现之前,策略梯度方法面临一个核心问题:更新步长很难控制。步子太大,策略可能崩掉;步子太小,训练效率太低。TRPO 算法用复杂的 KL 约束来解决这个问题,但计算成本高。
PPO 的思路更简单:用一个巧妙的损失函数,在反向传播时自动限制更新幅度。
PPO 损失函数拆解
核心公式
先看 PPO 的核心部分——Clipped Surrogate Objective:
其中:
$r_t(\theta)$ 是概率比率,表示新策略和旧策略在同一状态下采取同一动作的概率比。如果这个比率是 2,说明新策略对当前动作的信心是旧策略的两倍。
$\hat{A}_t$ 是优势函数,表示当前动作比平均动作好多少。$\hat{A}_t > 0$ 说明这个动作值得加强,$\hat{A}_t < 0$ 说明应该减弱。
优势函数:GAE
优势函数的定义是 $A(s,a) = Q(s,a) - V(s)$,但 $Q(s,a)$ 很难直接计算,实际用的是 GAE(Generalized Advantage Estimation)。
第一步:TD 误差
定义 TD 误差:
这是’一步优势’的近似。
第二步:GAE 加权累积
GAE 将多个 TD 误差加权求和:
展开写成:
第三步:递推实现(代码用的形式)
从后往前递推计算:1
2
3
4
5gae = 0
for t in reversed(range(T)):
delta = r_t + gamma * V(s_{t+1}) - V(s_t)
gae = delta + gamma * lambda * gae
A[t] = gae
λ 的作用
| λ 值 | 含义 |
|---|---|
| λ = 0 | 只用 TD 误差,低方差,高偏差 |
| λ = 1 | 变成 Monte Carlo,无偏,高方差 |
| λ = 0.95(常用) | 折中,平衡偏差和方差 |
本质是控制’看多远未来’——λ 越大,看得越远,偏差越小但方差越大。
第四步:标准化
计算完成后通常要做标准化:1
A = (A - mean) / (std + 1e-8)
这能提高训练稳定性。
Clip 是如何工作的?
假设 $\epsilon = 0.2$,那么 clip 范围是 $[0.8, 1.2]$。
当 $\hat{A}_t > 0$(动作值得加强):
- 如果 $r_t = 1.1$,在 clip 范围内,正常更新
- 如果 $r_t = 1.5$,超过 1.2,clip 后变成 1.2,限制了更新幅度
当 $\hat{A}_t < 0$(动作需要减弱):
- 如果 $r_t = 0.9$,在 clip 范围内,正常更新
- 如果 $r_t = 0.5$,低于 0.8,clip 后变成 0.8,同样限制了幅度
这个设计的巧妙之处在于:当更新方向正确时允许更新,但当更新”过头”时自动刹车。
KL 散度版本的 PPO
除了 Clip 版本,PPO 还有另一种等价的实现思路——KL 散度惩罚版。
从 TRPO 说起
TRPO(Trust Region Policy Optimization)的原始优化目标是:
这是一个硬约束:KL 散度必须小于阈值 $\delta$。但这个约束需要用复杂的二阶优化方法求解,计算成本很高。
KL Penalty 版:把约束变成惩罚
将硬约束转化为软惩罚,就得到了 KL 散度版本的 PPO 损失函数:
其中 $\beta$ 是 KL 惩罚系数。这个式子有两部分:
- 第一项:策略提升项,与普通策略梯度相同,让好的动作概率增加
- 第二项:KL 惩罚项,惩罚新旧策略差异过大
直观理解:你可以让策略变好,但偏离太远就会扣分。
Clip 版 vs KL 版的区别
| 方法 | 思路 | 特点 |
|---|---|---|
| Clip 版 | 硬截断概率比 | 简单、稳定,实现简单 |
| KL Penalty 版 | 软惩罚距离 | 更”连续”、更理论化 |
Clip 版更常用的原因:
- 不需要调 $\beta$(KL 权重)
- 数值更稳定
- 实现更简单
KL 版的问题:
- $\beta$ 很难调
- KL 可能突然爆炸
- 训练不稳定
为什么 KL 版依然重要?
尽管 Clip 版更常见,KL 散度方法在 RLHF(大模型训练) 场景中非常重要:
OpenAI 的 RLHF、Anthropic 的训练方法都强依赖 KL penalty。原因很直接:必须保证模型不会偏离原始语言模型太远。
有些高级实现还会用自适应 KL:动态调整 $\beta$,让 KL 散度保持在某个目标范围内,比固定系数的 Clip 更精细。
clip 与 KL 的数学联系
这两种方法并非毫无关联。一个关键 insight:
概率比率的 clip 和 KL 惩罚,在数学上做着同一件事——限制策略更新幅度。Clip 是这个思想的离散版本,KL Penalty 是连续版本。
这就是为什么很多资料会把两者混着讲:它们本质上是在用不同方式解决同一个问题。
完整损失函数
三项各自负责:
- 策略损失:$-L^{\mathrm{CLIP}}(\theta)$,负号是因为我们要最大化它
- 价值损失:$c_1 L^{\mathrm{VF}}(\phi)$,让 Critic 准确估计状态价值
- 熵正则:$-c_2 H(\pi_{\theta})$,负号表示我们想最大化熵
反向传播视角下的梯度流
Policy 梯度
Actor 的梯度来自两部分:
第一股梯度来自 clip objective,告诉网络哪些动作需要加强或减弱。第二股来自熵项,推动策略保持一定的随机性。
为什么要保持随机性?如果策略过早收敛成确定性策略(某个动作概率接近 1),就失去了探索能力,可能陷入局部最优。熵正则像是一个”探索税”,防止策略变得太自信。
Value 梯度
Critic 的梯度比较直接:
其中:
这就是一个标准的回归损失,让价值函数的预测逼近实际回报。Critic 准确了,Actor 才能依赖优势函数做出正确的更新决策。
训练过程中的动态变化
PPO 的训练不是静态的,三个损失项的权重关系会随时间变化:
初期阶段:策略接近随机,Value Loss 主导。Critic 需要快速学习状态价值,为后续的策略更新提供可靠的信号。
中期阶段:策略开始优化,clip 机制频繁触发。这是 PPO 发挥作用的关键时期,通过限制更新幅度避免策略崩掉。
后期阶段:策略与熵达到平衡。此时策略已经相对稳定,熵正则确保仍有一定的探索空间,避免过拟合到特定策略。
PPO 稳定性的四个来源
- Clipping 限制更新幅度:当策略变化过大时自动截断梯度
- Actor-Critic 解耦:策略优化和价值估计分别进行,互相配合
- 熵正则维持探索:防止策略过早收敛
- 概率比率提供动态约束:$r_t(\theta)$ 本身就是一个变化幅度的度量
实际应用中的调参经验
在 RLHF 训练中,PPO 的超参数选择很有讲究:
- $\epsilon$(clip 范围):通常取 0.1 或 0.2。太小训练慢,太大容易不稳定
- $c_1$(价值系数):一般在 0.5 左右。让 Critic 跟上策略的学习速度
- $c_2$(熵系数):0.01 左右。太小策略坍缩,太大探索效率低
这些值不是固定的,需要根据具体任务和训练阶段调整。有些实现还会让熵系数随训练进程衰减——前期探索为主,后期利用为主。
总结
从反向传播的角度看,PPO 损失函数的设计哲学很清晰:
不是靠硬性约束或复杂算法,而是通过精心设计的损失函数,在梯度层面实现自适应控制。当更新”合理”时,梯度正常流动;当更新”过头”时,clip 机制自动限制;当策略变得太确定时,熵项推一把。
这种设计让 PPO 在保持训练稳定的同时,又能获得不错的样本效率。这也是它成为 RLHF 标准算法的原因——简单、稳定、好用。