← 返回列表

详解 PPO:损失函数逐项拆解与 GAE 的 λ 权衡

摘要

PPO 的损失函数由三个部件组成:裁剪后的策略损失(决定策略怎么改)、价值损失(校准裁判)、熵奖励(防止策略过早僵化)。三个部件各管一件事,拼起来才是完整的 PPO。

其中价值损失的回归目标有一个隐藏的自由度:让裁判学”真实回报”(蒙特卡洛,方差大偏差小),还是学”自己的旧估计”(时序差分,方差小偏差大)?广义优势估计(GAE)用参数 λ\lambda 把从 1 步到无穷步的所有候选目标指数加权混合,λ\lambda 就是”信裁判还是信样本”的旋钮。本文逐项拆解损失函数,并给出一条 4-token 轨迹在 λ=0,0.5,0.95,1\lambda=0,0.5,0.95,1 下的完整数值走查。

前置阅读:裁剪机制的动机见《从 Trust Region 到 PPO》,逐 token 奖励的构造见《PPO、DPO 与 GRPO》§1.4,本文直接引用结论。

0. 记号与问题设定

0.1 记号约定

记号含义
sts_t第 tt 个 token 处的状态(提示 + 已生成的 tt 个 token)
rtr_t第 tt 个 token 的奖励(逐 token 奖励的构造见 §0.2)
πθ\pi_\theta待优化的策略;πθold\pi_{\theta_{\mathrm{old}}} 为采样时的快照
VψV_\psi价值网络(critic),估计”从 sts_t 起能拿多少回报”
ρt\rho_t第 tt 个 token 处的重要性比率 πθ/πθold\pi_\theta/\pi_{\theta_{\mathrm{old}}}
δt\delta_t时序差分误差(TD error),见 §3.1
AtA_t优势估计
γ\gamma折扣因子(任务属性);λ\lambda
ε\varepsilon裁剪范围;c1,c2c_1, c_2

0.2 上下文:从一条 rollout 到损失

假设我们已完成一轮采样:用 πθold\pi_{\theta_{\mathrm{old}}} 生成了一批回答。对每个 token 位置,我们手里有:

  1. 奖励 rtr_t。在 RLHF 中它由两部分构成:逐 token 的 KL 惩罚 + 仅在末尾给一次的奖励模型分数(构造见《PPO、DPO 与 GRPO》式 (5));
  2. 旧策略的对数概率 log⁡πθold(at∣st)\log\pi_{\theta_{\mathrm{old}}}(a_t\mid s_t),用于计算重要性比率。

本文要回答的问题:从这些原料出发,损失函数怎么一步步算出来。

1. 损失函数全景:三个部件,各管一件事

要点:PPO 的总损失是三个部件的加权和——策略损失管”策略怎么改”,价值损失管”裁判怎么校准”,熵项管”别太死板”。

1.1 总损失公式

L(θ,ψ)=E^[LtCLIP(θ)+c1⋅(Vψ(st)−Rt)2−c2⋅S[πθ](⋅∣st)](1)\mathcal{L}(\theta,\psi)=\hat{\mathbb{E}}\Big[L^{\mathrm{CLIP}}_t(\theta)+c_1\cdot\big(V_\psi(s_t)-R_t\big)^2-c_2\cdot S[\pi_\theta](\cdot\mid s_t)\Big] \tag{1}
(1)

先用大白话翻译式 (1):对 rollout 里的每个 token 位置,算三个数,加权求和,交给 Adam 做梯度下降。 E^\hat{\mathbb{E}} 表示对这批样本取平均。注意本文采用实现中的”最小化”形式——原始论文写的是最大化 E^[LCLIP−c1LVF+c2S]\hat{\mathbb{E}}[L^{\mathrm{CLIP}}-c_1L^{\mathrm{VF}}+c_2S],两边乘个负号就是式 (1),符号相反但完全等价,别被吓到。

三个部件逐项看:

1.2 部件一:策略损失(管策略怎么改)

LtCLIP(θ)=min⁡(ρt At,  clip(ρt, 1−ε, 1+ε)⋅At)(2)L^{\mathrm{CLIP}}_t(\theta)=\min\Big(\rho_t\,A_t,\ \ \mathrm{clip}(\rho_t,\,1-\varepsilon,\,1+\varepsilon)\cdot A_t\Big) \tag{2}
(2)

这一项的任务:用优势 AtA_t 加权,把好的 token 概率拉高、坏的压低,同时用裁剪防止单步走太远。裁剪的四种情形与动机已在《从 Trust Region 到 PPO》§4 和《PPO 是 on-policy 还是 off-policy》§3 详细讨论,此处不重复。唯一的衔接点是:式 (2) 里的 AtA_t 不是天上掉下来的——它的构造正是本文后半部分的主角。

1.3 部件二:价值损失(管裁判怎么校准)

LtVF(ψ)=(Vψ(st)−Rt)2(3)L^{\mathrm{VF}}_t(\psi)=\big(V_\psi(s_t)-R_t\big)^2 \tag{3}
(3)

式中 RtR_t 是价值网络的回归目标,即”正确答案”。critic 的任务是估计”从 sts_t 出发,按当前策略继续,最终能拿多少回报”,RtR_t 就是对这个量的某种估计。

关键在于 RtR_t 怎么选。这是一个隐藏的自由度:可以用真实采样到的回报(准但有噪声),也可以用 critic 自己的旧估计(稳但有偏差)。§2 专门展开,这是理解 GAE 的钥匙。

1.4 部件三:熵奖励(管别太死板)

S[πθ](⋅∣st)=−∑aπθ(a∣st)log⁡πθ(a∣st)(4)S[\pi_\theta](\cdot\mid s_t)=-\sum_a\pi_\theta(a\mid s_t)\log\pi_\theta(a\mid s_t) \tag{4}
(4)

熵衡量一个分布”多犹豫”:分布越平均熵越大,越集中熵越小。例子:三个 token 的概率为 [0.9,0.05,0.05][0.9,0.05,0.05] 时熵约为 0.39;[0.4,0.3,0.3][0.4,0.3,0.3] 时熵约为 1.09——后者更”犹豫”。

式 (1) 中熵项带负号(最小化目标),所以它的作用是鼓励熵变大:防止策略过早收敛到确定性输出,保留探索空间。系数 c2c_2 常取 0.01 左右,是一个”调味级”的小项——主要探索压力来自采样本身,熵项只是托底。

2. 价值网络的回归目标:MC、TD 与 n-step

要点:回归目标是一族选择——一端全信真实回报(方差大偏差小),一端全信裁判旧估计(方差小偏差大),中间是 n-step 折中。GAE 做的就是把这一族目标按 λ 加权混合。

2.1 三种候选目标

设一条轨迹的奖励为 rt,rt+1,rt+2,…r_t, r_{t+1}, r_{t+2},\dots,对状态 sts_t,价值网络可以学的”正确答案”至少有三个版本:

版本一:蒙特卡洛回报(MC)。把之后所有真实奖励加起来:

Gt=rt+γrt+1+γ2rt+2+⋯(5)G_t=r_t+\gamma r_{t+1}+\gamma^2 r_{t+2}+\cdots \tag{5}
(5)

版本二:一步时序差分目标(TD(0))。只信一个真实奖励,剩下的交给裁判自己的旧估计:

RtTD=rt+γVψ(st+1)(6)R^{\mathrm{TD}}_t=r_t+\gamma V_\psi(s_{t+1}) \tag{6}
(6)

版本三:n-step 目标。前 nn 步信真实奖励,之后信裁判:

Rt(n)=∑l=0n−1γlrt+l+γnVψ(st+n)(7)R^{(n)}_t=\sum_{l=0}^{n-1}\gamma^l r_{t+l}+\gamma^n V_\psi(s_{t+n}) \tag{7}
(7)

大白话对比:MC 是”一路走到黑,用真实结果当答案”;TD(0) 是”只走一步,剩下的问裁判”;n-step 是”走 n 步再问裁判”。nn 从 1 到 ∞,这一族目标的两端就是 TD(0) 与 MC。

2.2 数字算例:同一状态,三个目标差多少

设一条 4-token 轨迹,奖励稀疏(只有最后一个 token 拿到奖励 1,典型的 RLHF 设定):r=[0,0,0,1]r=[0,0,0,1],γ=1\gamma=1(语言模型任务通常不打折,理由见 §4.3)。critic 当前估计:V(s0)=0.3V(s_0)=0.3,V(s1)=0.5V(s_1)=0.5,V(s2)=0.4V(s_2)=0.4,V(s3)=0.2V(s_3)=0.2,终止处 V(s4)=0V(s_4)=0。

对 s0s_0 而言,真实回报 G0=1G_0=1——critic 低估了 0.7。三个目标分别是什么?

目标算式数值信谁
TD(0)r0+V(s1)r_0+V(s_1)0.5只信裁判
2-stepr0+r1+V(s2)r_0+r_1+V(s_2)0.4半信半疑
3-stepr0+r1+r2+V(s3)r_0+r_1+r_2+V(s_3)0.2大半信样本
MCG0G_01.0全信真实回报

这张表说明一件事:小 n 的目标由裁判的噪声决定(V(s1),V(s2),V(s3)V(s_1),V(s_2),V(s_3) 全是低估,导致 TD(0) 到 3-step 的目标在 0.2~0.5 之间漂移);大 n 的目标逼近真实回报 1.0。若 critic 用 TD(0) 目标训练,它学到的是”自己的旧错误”——偏差被反复固化。

2.3 偏差与方差的分野

为什么不能直接都用 MC?因为 MC 目标虽然无偏,却方差大:奖励是采样出来的随机量。例子:这批 rollout 里这条轨迹奖励是 1,下批的另一条同样前缀的轨迹可能奖励是 0——MC 目标在 0 和 1 之间跳;而 V(s1)V(s_1) 是一个平滑的函数输出,波动小得多。

于是有了经典权衡:

偏差方差
TD(0)高(裁判的近似误差直接进入目标)低(只依赖一个奖励样本)
MC低(全用真实奖励)高(依赖整条轨迹的奖励采样)
n-step居中居中

GAE 的贡献在于:不选某一个 n,而是用 λ 把所有 n-step 目标加权混合,从而在偏差与方差之间连续可调。

3. GAE:λ 把所有 n-step 估计加权混合

要点:GAE 先算每个位置的时序差分误差 δ,再从后往前递归累加。λ=0 时退化为一步 TD,λ=1 时退化为 MC 减基线,中间值在两者之间连续插值。

3.1 定义与递归计算

定义时序差分误差——“实际走到下一步发现的情况”与”裁判预期的情况”之差:

δt=rt+γV(st+1)−V(st)(8)\delta_t=r_t+\gamma V(s_{t+1})-V(s_t) \tag{8}
(8)

大白话:δt\delta_t 是”这一步的惊喜”。裁判以为从 sts_t 出发能拿 V(st)V(s_t),结果拿了 rtr_t 之后,下一站裁判估价 V(st+1)V(s_{t+1})——两者一减,就是意外收获(或意外损失)。

GAE 把之后所有”惊喜”按 (γλ)l(\gamma\lambda)^l 衰减累加:

AtGAE=∑l=0∞(γλ)l δt+l(9)A^{\mathrm{GAE}}_t=\sum_{l=0}^{\infty}(\gamma\lambda)^l\,\delta_{t+l} \tag{9}
(9)

实际计算用等价的后向递归(这是所有代码库的实现方式,从序列末尾往前扫一遍):

At=δt+γλ At+1,AT=δT(10)A_t=\delta_t+\gamma\lambda\,A_{t+1},\qquad A_T=\delta_T \tag{10}
(10)

3.2 关键恒等式:指数加权的 n-step 混合

把式 (9) 展开整理,可以得到 GAE 的核心解释——它是所有 n-step 优势估计的指数加权平均:

AtGAE=(1−λ)∑n=1∞λn−1 At(n)(11)A^{\mathrm{GAE}}_t=(1-\lambda)\sum_{n=1}^{\infty}\lambda^{n-1}\,A^{(n)}_t \tag{11}
(11)

其中 At(n)=Rt(n)−V(st)A^{(n)}_t=R^{(n)}_t-V(s_t) 是 n-step 优势(式 (7) 的目标减基线)。权重 (1−λ)λn−1(1-\lambda)\lambda^{n-1} 随 nn 指数衰减,且总和恰为 1。

  • λ=0\lambda=0:权重全部集中在 n=1n=1,At=δtA_t=\delta_t——一步 TD;
  • λ=1\lambda=1:权重趋于均匀摊到所有 nn,At=Gt−V(st)A_t=G_t-V(s_t)——MC 优势;
  • 0<λ<10<\lambda<1:两步都信,按指数衰减的比例信。

例子(式 (11) 的一个退化观察):轨迹最后一个 token 处,所有 n-step 估计都相同——因为 n≥2n\ge2 时式 (7) 里已经没有后续 VV 可借用,全部退化为真实回报。所以λ 对最后一个 token 的优势没有任何影响,它只在序列中段起作用。

3.3 数字算例:一条轨迹在四个 λ 下的完整走查

继续 §2.2 的轨迹:r=[0,0,0,1]r=[0,0,0,1],γ=1\gamma=1,V=[0.3,0.5,0.4,0.2]V=[0.3,0.5,0.4,0.2],V(s4)=0V(s_4)=0。

第一步,算 δ(式 8):

位置算式δ
t=0t=00+V(s1)−V(s0)=0.5−0.30+V(s_1)-V(s_0)=0.5-0.30.2
t=1t=10+V(s2)−V(s1)=0.4−0.50+V(s_2)-V(s_1)=0.4-0.5−0.1
t=2t=20+V(s3)−V(s2)=0.2−0.40+V(s_3)-V(s_2)=0.2-0.4−0.2
t=3t=31+V(s4)−V(s3)=1−0.21+V(s_4)-V(s_3)=1-0.20.8

第二步,后向递归(式 10),比较四个 λ 值:

λA3A_3A2A_2A1A_1A0A_0
00.8−0.2−0.10.2
0.50.80.20.00.2
0.950.80.560.4320.610
10.80.60.50.7

以 λ=0.95\lambda=0.95、t=1t=1 为例验算:A1=δ1+0.95A2=−0.1+0.95×0.56=0.432A_1=\delta_1+0.95A_2=-0.1+0.95\times0.56=0.432。

读这张表的三个观察:

  1. 最后一列(A3A_3)四个 λ 相同——印证 §3.2 的退化观察;
  2. λ=0 时出现了错误符号的优势:A1=−0.1A_1=-0.1、A2=−0.2A_2=-0.2,意味着 PPO 会去压低这两个 token 的概率——但它们所在的轨迹最终拿到了奖励 1。这是裁判噪声(VV 低估)直接污染优势的实例,即 §2.3 所说的”偏差”;
  3. λ=1 时所有优势为正(0.7/0.5/0.6/0.8),方向正确——但代价是这些数完全由”这条轨迹奖励是 1”这一个采样事实决定,换条轨迹(奖励为 0)优势就全变,即”方差”。

λ 从 0 拉到 1,优势估计的符号从”被裁判噪声带偏”逐渐转向”被样本噪声主导”。 这就是 λ 权衡的全部内容。

4. λ 的方差-偏差权衡

4.1 偏差与方差的来源

偏差来源方差来源
λ→0裁判近似误差直接进入优势(§3.3 观察 2)只依赖单个奖励,方差小
λ→1不借用后续 VV,近似误差影响最小依赖整条轨迹的奖励采样,方差大

大白话:λ 小 = 信裁判——稳,但裁判错了你也跟着错;λ 大 = 信样本——方向对,但每条轨迹的运气成分都进来了。

4.2 λ 的有效视野

式 (11) 的权重 (1−λ)λn−1(1-\lambda)\lambda^{n-1} 的均值是 1/(1−λ)1/(1-\lambda),可视为 λ 的”有效视野”。

例子:λ=0.95\lambda=0.95 时平均混合到第 20 步的估计;λ=0.99\lambda=0.99 时视野 100 步;λ=0.5\lambda=0.5 时视野只有 2 步。对长序列的 LLM 任务,λ 太小时优势估计只看眼前一两步,末尾的奖励信号传播不到开头。

4.3 γ 与 λ 的分工

式 (9) 中 γ\gamma 与 λ\lambda 总是以乘积 (γλ)l(\gamma\lambda)^l 出现,但职责完全不同:

  • γ\gamma 是任务属性:决定”要不要对远期奖励打折”。LLM 的 RLHF 里通常取 γ=1\gamma=1——因为奖励模型只在末尾打一次分,我们不希望这个分数在回溯时被打折;
  • λ\lambda 是算法选择:决定”优势估计里信裁判还是信样本”。LLM 实践中常取 λ=0.95\lambda=0.95 或 1(如 Secrets of RLHF 系列报告的配置)。

例子:γ=1,λ=0.95\gamma=1,\lambda=0.95 意味着”奖励全额回溯,但回溯时每一步只信 95% 的后续信号、留 5% 给裁判的当前判断”。

5. 完整计算流程与易错点

5.1 六步配方

把 rollout 到损失的全过程写成清单(LLM RLHF 场景):

  1. 采样:πθold\pi_{\theta_{\mathrm{old}}} 生成回答,记录每个 token 的对数概率;
  2. 构造逐 token 奖励:KL 惩罚贯穿每个 token,奖励模型分数只加在末尾;
  3. critic 前向:对每个位置算 Vψ(st)V_\psi(s_t),终止位置 V(sT+1)=0V(s_{T+1})=0;
  4. 算 δ:按式 (8) 逐位置计算时序差分误差;
  5. 后向递归:按式 (10) 从末尾往前扫,得到每个位置的 AtA_t;
  6. 组装损失:按式 (1) 三项求和,用 Adam 训练 KK 个 epoch,然后丢弃这批数据,回到第 1 步。

5.2 三个易错点

易错点一:价值回归目标要”重建”。 式 (3) 里的 RtR_t 不是 AtA_t 本身,而是

Rt=At+Vψold(st)(12)R_t=A_t+V_{\psi_{\mathrm{old}}}(s_t) \tag{12}
(12)

大白话:优势的定义是”回报减基线”,所以手里只有优势时,把旧基线加回去才得到回报的估计。代码里写 returns = advantages + values(values 取旧 critic 的输出)正是这个意思。

易错点二:算 A 时用旧 critic,且不反传。 式 (8) 与式 (10) 里的 VV 都是采样阶段的旧价值网络输出,与正在训练的 VψV_\psi 无关;AtA_t 只作为策略损失的常数权重出现,梯度不回传进 critic。

易错点三:论文与代码的符号相反。 原始论文最大化 E^[LCLIP−c1LVF+c2S]\hat{\mathbb{E}}[L^{\mathrm{CLIP}}-c_1L^{\mathrm{VF}}+c_2S],实现中通常等价地最小化 E^[LCLIP+c1LVF−c2S]\hat{\mathbb{E}}[L^{\mathrm{CLIP}}+c_1L^{\mathrm{VF}}-c_2S]。对照代码时先确认符号约定,否则价值损失和熵项会训反方向。

6. 结论

  1. PPO 损失函数是三件套:策略损失(裁剪的 IS 目标)决定策略怎么改,价值损失校准裁判,熵项防止策略过早僵化;
  2. 价值回归目标存在一族选择:TD(0) 全信裁判(低方差高偏差),MC 全信样本(高方差低偏差),n-step 居中;
  3. GAE 把这一族目标按 (1−λ)λn−1(1-\lambda)\lambda^{n-1} 指数加权混合:λ=0 退化为 δ,λ=1 退化为 MC 优势减基线,中间连续可调;
  4. 实现上 GAE 只需两步:先算逐位置 δ,再从后往前递归 At=δt+γλAt+1A_t=\delta_t+\gamma\lambda A_{t+1}——这也是”从惊喜到信用分配”的全部秘密;
  5. λ 是”信裁判还是信样本”的旋钮,有效视野 1/(1−λ)1/(1-\lambda);γ 是任务属性(LLM 常取 1),两者职责不同,勿混用;
  6. 落地时注意三个易错点:回归目标用 At+VoldA_t+V_{\mathrm{old}} 重建、优势计算用旧 critic 且不反传、论文与代码符号相反。

参考文献

  1. Schulman et al. Proximal Policy Optimization Algorithms. arXiv:1707.06347, 2017.
  2. Schulman et al. High-Dimensional Continuous Control Using Generalized Advantage Estimation. arXiv:1506.02438, 2015.
  3. Ouyang et al. Training language models to follow instructions with human feedback. arXiv:2203.02155, 2022.
  4. Zheng et al. Secrets of RLHF in Large Language Models Part I: PPO. arXiv:2307.04964, 2023.
  5. Sutton & Barto. Reinforcement Learning: An Introduction, 2nd Edition. MIT Press, 2018.(第 6、7、12 章:TD、n-step、资格迹)
  6. Engstrom et al. Implementation Matters in Deep Policy Gradients. arXiv:2005.12729, 2020.