PPO:重要性比率与裁剪策略目标#

进阶9 分钟阅读查看源文件 ↗

TL;DR#

本页内容7 个部分

PPO:importance ratio 与 clipped surrogate

1. 旧数据复用与过大更新#

假设一个正优势动作在采样时的概率为 0.20.2。重复训练同一批数据后,current 对它的概率从 0.220.22 增至 0.30.3,概率比相应从 1.11.1 增至 1.51.5。怎样复用这批数据,同时限制该任务项继续提高概率的激励?

Importance ratio 允许复用 old 策略的数据,但它不会阻止 current 继续远离 old。正优势任务项鼓励提高所采动作的概率,负优势项鼓励降低该概率。这里的“有利方向”指提高正优势动作的概率或降低负优势动作的概率。PPO 通过裁剪目标限制同批数据沿这些方向继续更新的激励。

2. 从动作概率计算裁剪目标#

PPO(Proximal Policy Optimization)比较当前策略与采样策略对同一个动作的概率。先用概率比计算未裁剪任务项,再限制该项沿优势所指方向继续增大的激励。

2.1 概率比与未裁剪任务项#

πold\pi_{\text{old}} 负责采样,在本批优化期间固定;πθ\pi_\theta 是正在更新的 Actor。将保存的状态和动作记为 sts_t、ata_t,计算:

rt(θ)=πθ(at∣st)πold(at∣st).r_t(\theta) =\frac{\pi_\theta(a_t\mid s_t)}{\pi_{\text{old}}(a_t\mid s_t)}.

在同步采样且 current 尚未更新时,rt=1r_t=1;此后 rt>1r_t>1 表示该动作的概率提高,rt<1r_t<1 表示降低。Ratio 也可以由 current 与 old 的 log-prob 差取指数得到;其中 old log-prob 固定,current log-prob 每次重算并保留梯度。

本批估计出的 A^t\hat A_t 表示动作相对价值参照的更新权重,优化期间固定;E^t\widehat{\mathbb E}_t 表示本批有效位置的平均。先考虑最大化 J(θ)=E^t[rtA^t]J(\theta)=\widehat{\mathbb E}_t[r_t\hat A_t]。当 A^t>0\hat A_t>0 时,提高 rtr_t 能增大目标;当 A^t<0\hat A_t<0 时,降低 rtr_t 能增大目标。在未裁剪目标中,沿有利方向改变概率比会继续增大该任务项的目标值。

这是在旧 rollout 状态上定义的局部替代目标(surrogate)。其中的 importance ratio 校正同一状态下的动作分布。

沿用采样概率 0.20.2 的动作,假设它的固定优势为 A^=2\hat A=2。当前概率为 0.220.22 时,r=0.22/0.2=1.1r=0.22/0.2=1.1,未裁剪任务项为 rA^=1.1×2=2.2r\hat A=1.1\times2=2.2;增至 0.30.3 时,r=1.5r=1.5,任务项增至 33。单纯最大化这一项,仍有继续提高该动作概率的激励。

2.2 正优势动作的上界裁剪#

取裁剪宽度 ϵ=0.2\epsilon=0.2。对正优势动作,PPO 将概率比超过 1+ϵ=1.21+\epsilon=1.2 后的任务项保持为常数。仍取 A^=2\hat A=2:

  • r=1.1r=1.1 时,概率比未超过上界,任务项仍为 rA^=1.1×2=2.2r\hat A=1.1\times2=2.2。
  • r=1.5r=1.5 时,原始项是 33,裁剪后,裁剪项=1.2×2=2.4\text{裁剪项}=1.2\times2=2.4,所以 任务项=min⁡(3,2.4)=2.4\text{任务项}=\min(3,2.4)=2.4。

因此,r>1.2r>1.2 以后再提高这个动作的概率,该样本的目标值仍是 2.42.4,不再继续增加。

2.3 负优势动作的下界裁剪#

对负优势动作,降低概率比会提高未裁剪目标。PPO 因此限制低于 1−ϵ=0.81-\epsilon=0.8 后的任务项。取 A^=−2\hat A=-2,从 r=0.9r=0.9 降到 0.80.8 时,目标从 −1.8-1.8 提高到 −1.6-1.6,所以该任务项提供降低这个动作概率的梯度激励。

如果继续降到 r=0.2r=0.2,原始项是 −0.4-0.4,裁剪后,裁剪项=0.8×(−2)=−1.6\text{裁剪项}=0.8\times(-2)=-1.6。因此 任务项=min⁡(−0.4,−1.6)=−1.6\text{任务项}=\min(-0.4,-1.6)=-1.6,继续降低概率也不再改善目标。

概率比沿不利方向越过另一侧阈值时,PPO 仍使用较低的原始项目标值。例如 A^=2\hat A=2 却降到 r=0.2r=0.2,目标取原始项 0.40.4,而非裁剪项 1.61.6;A^=−2\hat A=-2 却升到 r=1.5r=1.5,目标取原始项 −3-3,而非裁剪项 −2.4-2.4。

2.4 一般裁剪目标与分支推导#

把正、负优势的规则合并起来。令 0<ϵ<10<\epsilon<1 为裁剪宽度,同时计算原始项 rtA^tr_t\hat A_t 和裁剪项,取较小值,再对本批有效位置平均:

JCLIP(θ)=E^t[min⁡(rtA^t,  clip⁡(rt,1−ϵ,1+ϵ)A^t)]J^{\text{CLIP}}(\theta) =\widehat{\mathbb E}_t\left[ \min\left( r_t\hat A_t,\; \operatorname{clip}(r_t,1-\epsilon,1+\epsilon)\hat A_t \right) \right]

例如 ϵ=0.2\epsilon=0.2 时,clip 把第二项中的 ratio 截到 [0.8,1.2][0.8,1.2]。第一项仍保留原始 ratio;外层的 min⁡\min 决定当前样本由哪个分支起作用。[1]

当 A^t>0\hat A_t>0 时,该位置的目标可化为 A^tmin⁡(rt,1+ϵ)\hat A_t\min(r_t,1+\epsilon),上界限制该样本在有利方向上可增加的目标值。

当 A^t<0\hat A_t<0 时,乘负数会翻转大小关系,该位置的目标可化为 A^tmax⁡(rt,1−ϵ)\hat A_t\max(r_t,1-\epsilon)。

这些分支说明:优势为正且概率比超过上界,或优势为负且概率比低于下界时,对应任务项为常数,任务梯度为零;其他分支仍通过原始概率比提供梯度。这里不讨论恰在裁剪边界处的导数。

3. 从 LLM 奖励计算到裁剪更新#

3.1 逐 token 奖励与参考 KL#

对 LLM,状态是 prompt 与已生成前缀 st=(q,y<t)s_t=(q,y_{<t}),动作是当前 token at=yta_t=y_t。每个有效生成位置分别计算 ratio 和 clipped objective。

Actor 是生成回答的策略,Critic Vϕ(s)V_\phi(s) 预测状态的平均回报。下面采用 KL 奖励塑形:先修改逐 token 奖励,再计算 return 和 advantage。InstructGPT 使用了相对 SFT 模型的逐 token KL 惩罚。[2]

保留一个冻结的 reference 模型,例如 SFT 模型的副本。每轮在 Actor 更新前:

  1. 用 old 生成回答,保存各 token 在 old 下的 log-prob。
  2. 将同一份 prompt 和回答输入 reference,在同一前缀上计算同一个 token 的 log-prob:先将 logits 转成对数概率,再取出实际生成 token 对应的值。
  3. 评分器给完整回答打分;保存 Critic 对各 token 生成前状态的价值估计。

令 RttaskR_t^{\text{task}} 为任务奖励,β≥0\beta\geq0 为 KL 系数,计算:

R~t=Rttask−βlog⁡πold(at∣st)πref(at∣st).\widetilde R_t =R_t^{\text{task}} -\beta\log\frac{\pi_{\text{old}}(a_t\mid s_t)}{\pi_{\text{ref}}(a_t\mid s_t)}.

如果只有整条回答的分数,就把它加到最后一个有效生成位置,其余位置只包含 KL 奖励。采样时 current 等于 old;这批奖励在更新前计算一次,然后固定,所以这里写 old。 下一轮采样时才刷新 old、重算奖励。

单个 token 的 log-prob 差可以为负;对相应动作分布取期望才得到 KL。TRL 的 PPO 实现同样根据 old 与 reference 的 log 概率差计算 KL 奖励。[3]

3.2 三个 token 的回报与优势计算#

假设回答有三个有效生成 token,最后一个是终止 token,任务评分为 11,β=0.1\beta=0.1。以下是手算示例:

位置 Old 的 log-prob Reference 的 log-prob 任务奖励 加入 KL 后的奖励
1 −1.0 −1.2 0 −0.02
2 −1.5 −1.4 0 +0.01
3 −0.7 −1.0 1 0.97

例如位置 3 的奖励为 R~3=1−0.1×[−0.7−(−1.0)]=0.97\widetilde R_3=1-0.1\times[-0.7-(-1.0)]=0.97。

为便于手算,取折扣因子 γ=1\gamma=1,完整生成到终止,使用 Monte Carlo return G~t=∑k=tTR~k\widetilde G_t=\sum_{k=t}^{T}\widetilde R_k,得到 (0.96,0.98,0.97)(0.96,0.98,0.97)。

若本轮 Critic 的价值估计为 (0.5,0.6,0.4)(0.5,0.6,0.4),则 A^t=G~t−Vϕ(st)\hat A_t=\widetilde G_t-V_\phi(s_t) 为 (0.46,0.38,0.57)(0.46,0.38,0.57)。这里没有做 advantage 归一化。

若改用广义优势估计(Generalized Advantage Estimation,GAE),同样以含 KL 的奖励计算优势。

Actor 用这些固定优势更新,Critic 回归含 KL 的 return。这里从概率得到的 KL 奖励已在准备阶段缓存;Actor 更新时不会沿奖励或 Critic 预测的计算图反传,而是由固定优势给 current 的 log 概率梯度加权。KL 因而沿“奖励 → return → advantage”影响 Actor,同时改变 Critic 的学习目标;无需再重复加入同一份 KL loss。实际计算用 mask 标明有效生成位置。

奖励停止梯度后,正则作用怎样保留,见 KL Regularization。

3.3 用三个优势计算裁剪目标与梯度#

继续使用这条回答,三个位置的固定优势为 (0.46,0.38,0.57)(0.46,0.38,0.57),裁剪宽度为 ϵ=0.2\epsilon=0.2。假设更新过程中的 current/old 概率比分别为 (1.1,1.3,0.9)(1.1,1.3,0.9)。这些比值是用于手算的设定;current 尚未更新时,三个比值都为 11。

位置 固定优势 A^t\hat A_t 概率比 rtr_t 原始项 rtA^tr_t\hat A_t 裁剪项 取较小值
1 0.46 1.1 0.506 0.506 0.506
2 0.38 1.3 0.494 0.456 0.456
3 0.57 0.9 0.513 0.513 0.513

位置 2 的优势为正,概率比超过上界,所以 位置 2 的任务项=1.2×0.38=0.456\text{位置 2 的任务项}=1.2\times0.38=0.456。位置 3 虽然概率下降,但仍使用原始项;它继续提供提高所采 token 概率的梯度激励。

对三个有效位置平均,得到 JCLIP=(0.506+0.456+0.513)/3≈0.491667J^{\mathrm{CLIP}}=(0.506+0.456+0.513)/3\approx0.491667。只计策略任务项时,Actor loss 是它的相反数。KL 已经通过奖励进入这些优势,不在这个目标外重复扣除。

目标值还不等于梯度。固定 old 概率和优势,未进入裁剪常数分支的位置满足:

∇θ(rtA^t)=A^t∇θrt=rtA^t∇θlog⁡πθ(at∣st).\nabla_\theta(r_t\hat A_t)=\hat A_t\nabla_\theta r_t =r_t\hat A_t\nabla_\theta\log\pi_\theta(a_t\mid s_t).

因此,本例各位置的 log 概率梯度系数为:位置 1 的系数=0.506/3≈0.168667\text{位置 1 的系数}=0.506/3\approx0.168667、位置 2 的系数=0\text{位置 2 的系数}=0 和 位置 3 的系数=0.513/3=0.171\text{位置 3 的系数}=0.513/3=0.171。位置 2 的任务梯度为零,但共享参数和其他训练项仍可能改变它的概率;这些系数不保证更新后各 token 的实际概率变化。

本文按本批所有有效生成位置平均,排除 prompt 和 padding。只有一条回答时,分母就是 33;多条回答时,分母是它们的有效生成 token 总数。这与每条回答先各除自己的长度再平均不同,具体对照见 Loss 平均。

4. Actor–Critic 更新流程#

将本例的计算推广到一批回答,使用完整 Monte Carlo return G~t\widetilde G_t,即从当前位置起累加含 KL 的奖励。使用 GAE 时需相应替换优势估计与价值回归目标。[4]

  1. 采样并保存:把当前 Actor 作为本轮 πold\pi_{\text{old}},采一批 rollout,保存状态、动作和 old log-prob,计算任务评分与冻结 reference 的 log-prob。
  2. 准备学习目标:先构造含 KL 的奖励 R~t\widetilde R_t,再计算 G~t\widetilde G_t,用更新前的 Critic 预测计算 A^t=G~t−Vϕ(st)\hat A_t=\widetilde G_t-V_\phi(s_t),随后固定这些值。
  3. 重复更新 Actor:每个 minibatch 重算 current log-prob,得到 rtr_t,再最大化 clipped objective。
  4. 更新 Critic:用本批 return 回归价值,例如最小化 Lvalue=E^t[(Vϕ(st)−G~t)2]L_{\text{value}}=\widehat{\mathbb E}_t[(V_\phi(s_t)-\widetilde G_t)^2]。
  5. 重新采样:本批更新结束后刷新 old,采下一批数据。

在步骤 3–4 中,old log-prob、奖励、return 和 advantage 固定;current log-prob 与 Critic 的预测重算。 Actor 的梯度通过 current log-prob 传播,不通过 advantage 反向传播。

本文用 JJ 表示要最大化的策略目标,用 LL 表示要最小化的 loss。若联合优化,常写成 L=−JCLIP+cvLvalue−ceH(πθ)L=-J^{\text{CLIP}}+c_vL_{\text{value}}-c_eH(\pi_\theta);HH 是动作分布的熵,cv,ce≥0c_v,c_e\geq0 控制价值损失和可选 entropy bonus 的权重。本页的 LLM 配置先用 reference KL 修改奖励,再执行这套循环。

5. 局限性与参考约束#

5.1 裁剪目标不提供硬约束#

Clipping 改的是样本对目标的贡献,没有强制模型输出满足 rt∈[1−ϵ,1+ϵ]r_t\in[1-\epsilon,1+\epsilon]。其他样本的梯度、共享参数和一次优化步都可能让这个位置的 ratio 越界,例如出现 r=1.4r=1.4。

Clipping 用简单的一阶优化追求保守更新,但不给 ratio、KL 或单调改进提供硬保证。训练中可监控 current/old KL 和进入裁剪分支的比例,按需提前停止本批更新。[1]

5.2 与 reference KL 的分工#

机制 参照 作用
PPO clipping 本轮采样策略 old 削弱单轮过大更新的激励
Reference KL 冻结的 reference 惩罚相对固定参考模型的偏离

每轮将 current 保存为新的 old 快照后,初始 ratio 回到 11,reference KL 却不会因此归零。新一轮要为新回答重算 old/reference log-prob、奖励和 advantage,reference 参数继续冻结。

PPO 还有自适应 KL penalty 形式,比较的是 old 与 current;判断 KL 项的作用时,需要明确其比较的两个策略。[1]

参考资料#

  1. PPO(2017). 原文:Clipping、经验目标与 Actor–Critic。
  2. InstructGPT(2022). 原文:RLHF 中的 PPO 与 reference KL。
  3. TRL PPO(v0.26.0). 原文:指定计算批次的 masked mean。
  4. Generalized Advantage Estimation(2015). 原文:Return、价值参照与 Advantage 估计。