PPO 在限制怎样的更新:概率比、裁剪与价值估计

成长演进

具备清晰骨架、初步数学推导或工程验证,持续补充论据与实测。

ℹ数字花园

🌿 什么是数字花园与思想演进?

遵循 Maggie Appleton 与 Andy Matuschak 的常青笔记理念:这里不是按时间沉底的流水账,而是持续修剪打磨的知识生态。文章按成熟度经历:

  • 🌱 萌芽 (Seedling): 发散灵感、读书摘录、开放猜想
  • 🌿 演进 (Budding): 结构渐明、初步代码推导、积极修正
  • 🌳 常青 (Evergreen): 逻辑闭环、持久经得起检验的基石
  • 🔬 实验待证 (Speculative): 结合沙盒与仿真探针的理论探索
浏览全站数字花园与笔记全景 →

上一篇的策略梯度要求认真区分“用哪个模型采样”和“用哪个模型计算更新”。生成答案很贵,我们自然希望一批答案能多用几次;但参数更新后,模型已经变了,反复把旧数据当成当前策略的新样本就不合适了。

PPO 要处理的一个问题,就是怎样有限地复用刚收集的一批数据,同时避免更新过猛。本篇讨论常用的 PPO-Clip。它与 PPO-Penalty 不是同一个目标,也不是只要名字叫 PPO,所有实现细节就都相同。

下面的概率、优势和价值都是教学设定,没有运行真实训练。

先保存采样时的模型概率#

一批回答由旧策略生成,记作 π_old。训练中的当前策略记作 π_θ。在同一个状态 s、同一个已经采到的动作 a 上,计算概率比:

ρ=πθ(a∣s)πold(a∣s).\rho=\frac{\pi_\theta(a\mid s)}{\pi_{old}(a\mid s)}.

假设旧策略给某动作概率 0.2,当前策略给 0.28,那么 ρ=1.4。它表示相对增加 40%,不是增加了 40 个百分点;绝对概率只增加了 0.08。

实现中通常保存采样时的 log probability,更新时计算二者之差再取指数,避免直接相除极小概率。旧概率在本轮复用数据期间应固定。若每次都把分母替换成当前模型的概率,比值总在一附近,就失去了比较意义。

语言模型的状态一般是题目加生成前缀,动作是一个 token。逐 token 概率比与整段回答的概率比不同,后者是各位置比值的乘积。把逐 token 比值逐项裁剪,不能解释成对整段概率变化施加了相同界限。

优势告诉我们希望往哪个方向变#

优势 A 是相对于参照表现的好坏信号。本篇先把它视为固定数,后面再解释怎样估计。

如果 A>0,希望增加这个动作的机会;如果 A<0,希望减少。最直接的代理项是 ρA,但它可能鼓励同一批样本被持续推向更极端的概率。

PPO-Clip 比较原项和裁剪后的项,取较小者。为方便阅读,先定义:

c=clip⁡(ρ,l,u),l=1−ϵ,u=1+ϵ.\begin{aligned} c&=\operatorname{clip}(\rho,l,u),\\ l&=1-\epsilon,\quad u=1+\epsilon. \end{aligned}

再写单样本贡献:

L=min⁡(ρA,cA).L=\min(\rho A,cA).

训练要最大化这项的样本平均;若优化器最小化 loss,就加负号。本文用 ε=0.2 只是为了手算,不是针对语言模型的推荐配置。

这个目标及正负优势的分支解释可核对作者团队的官方说明。Spinning Up:PPO

正优势只截住过度增加的收益#

设 A=2,ρ=1.4。未经裁剪的贡献为 2.8,裁剪后为 2.4,取小得到 2.4。把 ρ 继续推到 1.6,这个单样本贡献仍是 2.4。

也就是说,在有利方向上走到一定程度后,这个样本不再提供继续提高该比值的直接动力。

但如果 ρ=0.6,也就是好动作概率反而降低了,原项为 1.2,裁剪项为 1.6,取小仍是 1.2。它没有被下界“托住”。目标仍然会鼓励把比值往回提高。

因此,不应把公式简化成“无论怎样,都先把比值夹在区间里再乘优势”。那个写法会丢掉 min 的作用。

负优势的方向刚好相反#

设 A=−2,ρ=0.6。原项为 −1.2,裁剪项为 −1.6,取小得到 −1.6。继续降低这个坏动作的概率,不再让这个样本的目标变得更好。

如果坏动作的概率反而增加到 ρ=1.4,原项为 −2.8,裁剪项为 −2.4,取小得到 −2.8。这个不利变化仍然受到惩罚。

Aρ原项 ρA裁剪项 cA最终 L
21.42.82.42.4
20.61.21.61.2
−20.6−1.2−1.6−1.6
−21.4−2.8−2.4−2.8

正优势在上方变平,负优势在下方变平。这里说的是把 A 固定后,单项作为 ρ 函数的局部形状;在分界点处还存在不可微的折点。

裁剪目标不等于锁住模型#

“变平”不等于把概率强制改回边界。一次更新仍可能把某些比值推到区间外:模型参数共享,其他样本的梯度会影响它,优化器状态也会影响最终步长。

更重要的是,目标只在采到的状态动作上计算。未采到的动作、不同前缀以及新题目上的变化,不能靠这几个样本的平坦区完整约束。

所以 PPO-Clip 不是“保证所有概率变化不超过 20%”,也不是数学上保证 KL 始终小于某个数。官方实现还监测新旧策略的近似 KL,超过阈值时提前停止本轮策略更新;这是另加的控制手段,不是裁剪公式自动提供的硬保证。官方实现

学习率、复用轮数、样本量、优势尺度仍然重要。把 ε 设小,不代表其他设置可以随意放大。

旧策略和参考模型分别回答什么问题#

旧策略回答:“这批样本当时是怎样产生的?”它决定概率比分母,通常随着下一轮采样刷新。

参考模型回答:“希望当前模型不要偏离哪个长期参照太远?”在语言模型后训练中,它常来自起始 SFT 模型,用于计算另一个 KL 约束或奖励项。

这两者可能在第一轮恰好相同,后面却承担不同职责。相对上一轮变化不大,不意味着经过很多轮后仍接近最初模型;反过来,对参考模型加约束,也不保证每一批更新都足够小。

InstructGPT 的 RL 阶段加入来自 SFT 模型的逐 token KL 惩罚。它是该训练设定的一部分,不能与 PPO 裁剪里的旧策略分母混为一谈。InstructGPT,第 3.5 节

记录 KL 时应写明方向、参照和采样来源。对单个已采 token 的 log 概率比,数值可以为负;KL 的非负性是对合适分布取期望后的性质,不要求每个采样项都非负。

价值模型怎样提供优势估计#

回到整数任务。一段回答最终得分之前,模型已经生成多个 token。价值函数 V(s_t) 估计从当前前缀继续生成,预期还能得到多少回报。

它预测的是当前任务和策略下的回报,不是直接判断某句数学推导是否真实,也不是一个完美的奖励检查器。奖励模型给回答评分,价值模型估计未来回报,两者的训练目标不同。

常见做法利用相邻价值预测构造 TD 残差:

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

再把后续残差按衰减权重相加,得到 GAE:

A^t=∑l≥0(γλ)lδt+l.\hat A_t=\sum_{l\ge0}(\gamma\lambda)^l\delta_{t+l}.

实际有限轨迹只加到记录边界,并按终止规则处理最后的价值。γ 是回报折扣,λ 控制使用多远的残差信息。GAE 研究的是这类估计的偏差与方差取舍,而不是让价值预测自动变成正确答案。GAE 论文

如果把无折扣任务改用 γ<1,晚得到的奖励权重也随之改变。λ 的变化则影响估计如何利用预测与实际后续信息。二者不能统称为一个“平滑参数”。

三步轨迹怎样计算 GAE#

假设只有三步,前两步奖励零,最后一步奖励一;价值预测依次为 0.2、0.4、0.7,真正终止后的价值取零。取 γ=1。

三个残差为 0.2、0.3、0.3。若 λ=0.5,从后往前计算:

A^3=0.3,A^2=0.3+0.5×0.3=0.45,A^1=0.2+0.5×0.45=0.425.\begin{aligned} \hat A_3&=0.3,\\ \hat A_2&=0.3+0.5\times0.3=0.45,\\ \hat A_1&=0.2+0.5\times0.45\\ &=0.425. \end{aligned}

若 λ=1,结果为 0.8、0.6、0.3,正好等于完整终局回报一减去对应价值。这是有限终止轨迹下的消去结果;λ<1 时不会同样消去中间预测误差。

这些数是给定价值预测后的计算结果,不表示某个价值模型已学到它们。价值损失降低,也不能单独证明策略在新题目上更好。

结束与截断决定最后一个值#

如果任务真正结束,后续没有回报,边界价值取零。如果只是采集批次到头,而环境仍可继续,常需要用最后状态的价值做 bootstrap。

语言模型达到最大生成长度时,究竟是哪一种情况,要由任务定义决定。若任务规定预算耗尽就算失败且本轮结束,那么它就是该任务的终止结果;若只是把一条仍会继续的轨迹切成训练片段,就不能当作真实终止。

不应仅看到 done 或 truncated 字段名就机械决定。先问未来回报是否属于当前任务,再检查实现。官方 PPO 缓冲区明确区分终止后的零值和采集边界后的价值预测,适合对照这一逻辑。PPOBuffer.finish_path

一轮训练应该留下什么证据#

采样时保存问题、回答、有效动作位置、旧 log probability、奖励分量、价值预测和停止原因。计算优势后,在本轮有限复用期间固定旧策略信息,策略更新与价值训练各自记录目标。

检查概率比是否初始接近一、旧 log probability 是否被误改、优势正负是否颠倒、padding 是否混入平均。分别观察任务成功率、奖励分量、新旧策略 KL、对参考模型的 KL、熵、生成长度和价值误差。

有的日志把所有越出裁剪区间的样本比例叫 clip fraction;它不必等于真正进入目标平坦分支的比例。例如正优势配 ρ=0.6,虽然越界,目标仍有斜率。解释指标时要看其代码定义。

可以先在上述四行表上核对目标值与局部斜率,再核对三步 GAE;之后设计相同采样预算下的学习率或复用轮数对照。保持其他条件相同,观察独立成功率是否提升,以及 KL 或熵是否出现异常。这些正式训练对照尚未执行。

第一道自检题:为什么 A>0、ρ<1−ε 时,PPO-Clip 没有把不利变化截平?请把两个乘积实际算出来。

第二道自检题:若每轮相对旧策略的 KL 都小,能否保证最终模型接近起始 SFT 模型?日志里至少还需要哪个参照?

下一篇讨论 GRPO:不用单独训练价值模型时,同题多份回答怎样提供相对信号,又会引入哪些新的估计与长度问题。

文章概念网络

从章节进入正文概念。实线表示所属层级,虚线连接跨章节重复出现的概念,不代表因果关系。

68 / 68 个节点 · 正文标记术语与关键词概念

PPO 在限制怎样的更新:概率比、裁剪与价值估计同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared conceptPPO 在限制怎样的更新:概率比、裁剪与价值估计PPO 在限制怎样的更新:概率比、裁剪与价值估计PPO-ClipPPO-Clip先保存采样时的模型概率先保存采样时的模型概率概率比概率比优势告诉我们希望往哪个方向变优势告诉我们希望往哪个方向变优势优势Spinning Up:PPOSpinning Up:PPO正优势只截住过度增加的收益正优势只截住过度增加的收益负优势的方向刚好相反负优势的方向刚好相反裁剪目标不等于锁住模型裁剪目标不等于锁住模型官方实现官方实现旧策略和参考模型分别回答什么问题旧策略和参考模型分别回答什么问题旧策略旧策略参考模型参考模型InstructGPT,第 3.5 节InstructGPT,第 3.5 节价值模型怎样提供优势估计价值模型怎样提供优势估计价值函数价值函数GAEGAE三步轨迹怎样计算 GAE三步轨迹怎样计算 GAE结束与截断决定最后一个值结束与截断决定最后一个值donedonetruncatedtruncatedPPOBuffer.finishpathPPOBuffer.finishpath一轮训练应该留下什么证据一轮训练应该留下什么证据PPOPPO策略梯度策略梯度CLIPCLIP采样采样策略策略策略策略tokentoken动作动作状态状态采样采样CLIPCLIPPPOPPO动作动作优化优化动作动作动作动作策略策略状态状态动作动作CLIPCLIPPPOPPO优化优化采样采样tokentokenSFTSFT策略策略后训练后训练PPOPPO奖励奖励利用利用tokentoken策略策略奖励奖励策略策略PPOPPO状态状态环境环境机械机械策略策略CLIPCLIP采样采样奖励奖励GRPOGRPOSFTSFT
PPO 在限制怎样的更新:概率比、裁剪与价值估计

PPO 在限制怎样的更新:概率比、裁剪与价值估计

回到原文 ↗
BIBTEX

引用本文

@article{2026-10-23-llm-training-rl-04-ppo,
  author  = {枫语},
  title   = {PPO 在限制怎样的更新:概率比、裁剪与价值估计},
  journal = {枫语},
  year    = {2026},
  month   = {oct},
  url     = {https://meiluosi.github.io/posts/2026-10-23-llm-training-rl-04-ppo/}
}
🌐

本篇知识星丛与滑动侧栈

PPO 在限制怎样的更新:概率比、裁剪与价值估计 当前主轴

搜索

正在载入索引…