高级策略梯度
本讲迁移自原课程讲义,经 AI 事实核查未发现存疑项,未逐页人工审核;如有出入,以原始论文和 CS285 课程资料为准。
学习目标
- 说清朴素 PG 为何对步长病态敏感、on-policy 下"走坏一步"为何致命。
- 推导性能差引理并理解代理目标的适用范围(信赖域的动机)。
- 理解为何用 KL 散度而非欧氏距离度量策略变化;推导自然梯度与 Fisher 矩阵。
- 推导 TRPO 的单调改进下界并说清其假设与松弛。
- 写出 PPO clipped 目标、逐项解释 clip 的作用与它不是真信赖域的局限。
朴素策略梯度对步长极其敏感:太小学得慢,太大一步就把策略推坏、且因为数据是on-policy 的,坏策略采到的坏数据会让它再也爬不回来。本模块回答”一步最多能走多远”这一核心问题:我们先用性能差引理把策略提升写成可优化的代理目标,指出它只在新旧策略接近时可信;再从”参数空间 vs 分布空间”的几何引出自然梯度与 Fisher 信息;进而推导 TRPO 的单调改进下界,最后看 PPO 如何用一行 clip 把这套二阶信赖域近似成一阶、可大规模训练。
配套 Extended HW6 · 非 CS285 官方
PPO / SAC 稳定性报告把本模块的 clip、KL 与 GAE 接到真实 CPU 三种子实验;代码目录与 README含 tests、配置和 artifacts。结果与负例以报告为 canonical,本页不重复数字。
学习目标
- 说清朴素 PG 为何对步长病态敏感、on-policy 下”走坏一步”为何致命。
- 推导性能差引理并理解代理目标的适用范围(信赖域的动机)。
- 理解为何用 KL 散度而非欧氏距离度量策略变化;推导自然梯度与 Fisher 矩阵。
- 推导 TRPO 的单调改进下界并说清其假设与松弛。
- 写出 PPO clipped 目标、逐项解释 clip 的作用与它不是真信赖域的局限。
编者按 · 批判性视角
本模块以 TRPO→PPO 为主线,但站在前沿要加两句批判。其一,TRPO 的实践算法需要二阶近似、Fisher 向量积与线搜索,实现和计算都较复杂;而 PPO 的”信赖域”只是松散的启发式近似(第 7 节会看到它”不是真信赖域”),其性能也显著受实现细节影响。其二,部分近期 LLM 训练工作采用了 GRPO / GSPO 等 critic-free 方法,另一些偏好优化方法则绕过在线 RL;这些工作说明 PPO 并非唯一选择,但不足以推出整个行业的默认格局。GSPO 的公开方法采用序列级重要性比与序列级裁剪 [1]。
1. 朴素 PG 的病态:步长敏感
朴素策略梯度沿 走一步 。问题有二:
- 参数-行为的非线性错配:参数上一个”小”步,可能让动作分布剧烈变化(例如高斯策略方差很小时,均值挪一点点,行为就完全变了)。反之在别的区域,同样的参数步几乎不改变行为。单一学习率 无法同时适配。
- on-policy 的不可逆性:策略梯度用当前策略采的数据估计梯度。若一步把策略推到很差的区域,接下来采到的全是坏数据,梯度估计也随之失真——不像监督学习有固定数据集兜底,这里可能永久性能崩塌。
举例
把训练策略想成在浓雾里下山:小步慢走,每步都能踩稳、看清脚下再挪,虽慢却安全;一步猛迈,可能正好一脚踏空跌下悬崖。而 on-policy 的致命之处在于——摔下去后你只能在谷底就地重新采数据,眼里全是谷底的烂路,很难再爬回原来的山脊。信赖域 / KL 约束做的正是给每一步限定一个”最大跨度”:允许往前走,但不许一步迈到雾里看不见的地方。
图 1:参数空间中的均匀步长,经非线性策略映射后,在分布空间中变化极不均匀——这是需要”分布空间步长约束”的根本原因。
2. 性能差引理(Performance Difference Lemma)
我们想优化新策略 相对旧策略 的性能提升。核心恒等式:
即新策略的优势,要在旧策略的优势函数下、按新策略的轨迹分布来累加。这个式子精确、无近似,但右端期望在 的分布下取——而我们只有 的数据,这正是困难所在。
推导:性能差引理
关键假设
同一 MDP、同一初始分布 ;折扣 ;。
第 1 步:把优势展开并沿 的轨迹求和,利用条件期望恒等式 :
第 2 步: 的期望就是 。含 的两项构成望远镜求和(telescoping): 相邻抵消,只剩 。
第 3 步:。合并得 。
3. 代理目标与信任的边界
PDL(式(6.1))右端在 的状态分布 下取期望,我们没有它。若 是归一化折扣占用度,用旧占用度替换新占用度可定义性能差代理:
为什么这样 · 能不能不这样
为什么绕个弯去优化代理目标 ,而不直接最大化真实性能 ? 因为由 PDL(式(6.1)), 的期望要在新策略自己的状态分布 下取——可 恰恰取决于那个我们尚未定下来的 ,这是个”鸡生蛋”:想评估 得先拿 去环境里跑出它的访问分布,但我们手里只有旧策略 采的数据。代理目标的全部技巧,就是把这个不可得的 替换成手上已有的 (动作再用重要性采样从 折算到 ),于是目标变成一个只用旧数据就能算的量。换成硬要直接优化 会怎样? 要么每改动一次 就重新上环境采一批 on-policy 数据(极其昂贵,且丢掉了复用旧数据的样本效率),要么去显式估计 (它随 变化、无解析式,高维下难估)。所以代理目标是”用可得的旧分布近似不可得的新分布”的务实之选——代价是这个近似只在新旧策略足够接近时才可信(正是下一条要说的),也正是必须约束步长(信赖域)的根源。
局限 / 陷阱
这个近似只在 时成立,即新旧策略足够接近。若放任 大幅偏离 去最大化 ,被忽略的状态分布漂移会让代理目标与真实性能脱钩——你以为在爬坡,其实已经掉下悬崖。这就是为什么必须约束 与 的接近程度:信赖域的全部动机。
4. 参数空间 vs 分布空间
“接近”该怎么量?用参数欧氏距离 往往不合适——如第 1 节所示,参数距离与行为距离严重错配。策略分布之间的 KL 散度 直接刻画行为改变量;在光滑可逆的重参数化等正则条件下,由此导出的自然梯度具有坐标不变性。
把约束""作用到”最大化 “上,就是约束在分布空间的一个小球内做最陡上升——这自然导出自然梯度与 TRPO。这里首次出现的 是人为预设的一个小常数(典型值如 ),含义是”每步允许的平均 KL 上限”,即信赖域这个小球的半径: 越小步子越保守、越稳但越慢,越大越激进、越容易把策略推坏。
为什么这样 · 能不能不这样
为什么用 KL 散度 来量”走了多远”,而不用参数欧氏距离 ? 因为我们真正想限制的是行为(动作分布)改变了多少,而 KL 直接度量两个分布的差异、且与参数如何编码策略无关——对网络做一次重参数化会改变 ,却不改变 KL。换成欧氏距离约束会怎样? 那就退回朴素、带固定学习率的梯度步。由于参数-行为映射高度非线性(第 1 节),同一个欧氏步长在敏感区能让策略天翻地覆、在迟钝区几乎纹丝不动,单一学习率无从同时适配,极易一步把策略推坏(高斯策略方差很小时尤甚)。代价是:欧氏步长不能在局部二阶近似下控制预期 KL 的量级,也就无法按分布空间的局部度规调整步长——而这恰是自然梯度用 想矫正的东西。
图 2:参数空间中的各向同性球,映射到分布空间是被 Fisher 信息矩阵 拉伸的椭球。自然梯度用 把步长”矫正”回分布空间的等距离球。
5. 自然梯度与 Fisher 信息
自然梯度回答:在”KL 约束的小球”内,哪个方向让目标上升最快?当 可逆时答案是 ;若 奇异或病态,实践中使用伪逆或阻尼后的近似,其中 , 是 Fisher 信息矩阵。先给 一个直觉性的交代(严格定义见下方 foldout 的式 (6.4)):是什么——它是得分向量 的外积期望 ,是一个 (=参数维度)的对称半正定矩阵;为何引入——它正是 KL 散度在当前策略处的局部曲率(度规),衡量”参数动一点、行为分布随之改变多少”,因此能把”参数距离”翻译成”行为距离”;怎么算——它可从一批样本的 估计,但高维下不显式构造,而是只算它乘向量的效果(,见第 5.1 节)。
举例
普通梯度按参数空间的欧氏距离走,就像只看地图上的直线距离规划路线——地图上一厘米,实地可能是一马平川,也可能是悬崖峭壁。自然梯度改用 Fisher 矩阵度量,等于按崎岖地形上真实的步行距离来走:同样的局部二阶 KL 预算下,在陡峭(策略敏感)方向自动收紧、在平缓(策略迟钝)方向自动放开,从而控制预期 KL 的局部近似量级;真实 KL 仍需另行检查。
推导:自然梯度
关键假设
目标 对 做一阶泰勒展开 ();KL 约束做二阶泰勒展开(小步长下 KL 的一阶项为 0,二阶项由 Fisher 给出,下条详证)。
第 1 步(用:KL 的二阶泰勒 + Fisher 的定义):对 小量,,其中 Fisher 信息矩阵(即 )为得分向量的外积期望:
(为何一阶项为 0:得分的期望 ,故 KL 在 处梯度为零、增长从二阶起——下一条 foldout 给出完整证明。因此 Fisher 正是 KL 的局部度规。)
第 2 步(用:拉格朗日乘子 + 一阶最优条件):目标是在 KL 小球内最大化线性化的提升, s.t. 。写拉格朗日 ,对 求导置零( 对称)得 ,即 。
第 3 步(用:约束取等号定 ):目标线性、必然把步子顶到边界,故约束取等 。代入 :,解出 。于是
第 4 步(结论):在 正定且局部二阶近似成立时,方向即自然梯度 ,步长按 缩放。该缩放使二阶近似的 KL 取到 ;真实 KL 仍需线搜索检查。自然梯度在光滑可逆重参数化等正则条件下具有坐标不变性。
推导补充:为什么 KL 的二阶泰勒 (且一阶项为 0)
要证
记 。则 、、,于是 。用到两条关于 score 的恒等式。
准备(两条恒等式)。 对 求一阶、二阶导( 泛指 ,期望在 下):
(第二式即” 的 Hessian 期望 外积期望 “,是 Fisher 的两种等价定义之间的桥。)
第 0 阶。 。
第 1 阶。 ,故 。在 处 (第一恒等式)——一阶项恰好消失,这正是”KL 在同一点处是局部最小、增长从二阶起”的原因。
第 2 阶。 ,在 处 (第二恒等式)。代入二阶泰勒:
注(方向对称性)。 反向 KL 的二阶展开同样是 ——在二阶精度上两个方向重合,所以”用哪个方向的 KL”在信赖域局部意义下并不影响 Fisher 度规。这也解释了为何 Fisher 被称作 KL 的局部度规(黎曼度量)。
本质 Insight
普通梯度下降隐含”参数各方向等价、用欧氏度量”的假设,但策略优化真正关心的是行为分布的改变。自然梯度用 KL 的局部度规(Fisher)取代欧氏度规,本质是在正确的流形上做最陡下降——这也是为什么它对参数化不敏感、比朴素 PG 稳健得多。代价是要处理 ,高维下昂贵(TRPO 用共轭梯度回避显式求逆)。
6. TRPO:信赖域与单调改进界
TRPO(Trust Region Policy Optimization)把上述思想工程化:在每步内最大化代理目标 ,同时硬约束平均 KL :
TRPO 的理论支柱是一条单调改进下界:真实性能不小于“绝对代理 减去分布漂移惩罚”。
推导骨架:单调改进下界
关键假设
优势有界 ;用总变差/KL 的 Pinsker 不等式界定分布漂移。
第 1 步:由 PDL(式(6.1)),若 是归一化折扣占用度,则 。用 替换 得到 (式(6.3)),其误差可由两分布的总变差距离控制。
第 2 步: 又可由策略间最大 KL 经 Pinsker 不等式 传播到状态分布,得到(逐步的完整不等式链、含 的来历见下一条补充推导)
第 3 步(单调性):因为 且惩罚为 0,只要候选 让下界严格大于 ,就保证改进。不能说“右端在 时等于 0”——等于 0 的是性能差形式,绝对性能下界等于 。
推导补充:完整骨架 PDL → 代理目标 → Pinsker → KL 惩罚(附”常数为何保守”)
目标
把上面三步串成一条可追踪的不等式链,看清每一步”漏掉了什么、用什么补回来”,并算清常数 的来历()。记 为”逐状态策略差”的上确界,它是全链条唯一的小量。
① 起点(用:PDL 式(6.1),精确、无近似)。 ( 是归一化折扣状态分布,故前置因子 ,即第一个时域因子)。右端用的是新策略的状态分布 ——我们手上只有 ,这是唯一的困难源。
② 换分布得代理目标。 把 换成 ,得到性能差代理 ;绝对代理为 。后者与 在 处同值、同一阶变化,因此误差可由二阶小量控制。
③ 把两个 拆开看(用:状态分布 TV 引理 + 有界)。 一处 来自状态分布漂移:两策略诱导的状态分布总变差被逐状态策略差乘有效时域放大——(第二个时域因子 :每步差 ,沿 步轨迹累积)。另一处 来自:漂移只影响”两策略动作分布不同”的那部分质量,其优势差被 ()界住、且仅在 比例上累积。两者相乘、再乘 ① 的 ,得
④ Pinsker:(TV)→ KL。 用 Pinsker 不等式 ,平方得 (末步刻意丢掉 ,让常数保持 、便于陈述——这本身就是一处放松)。代入式(6.10)即把 TV 换成可微、可估计的 KL。
⑤ 合并得单调改进下界。 把 ①②③④ 串起来,并使用绝对代理 :
为什么这个 “过于保守”? 四重最坏情况叠加:(i) 取的是全空间最坏的优势,而典型状态的 远小于此;(ii) 两个时域因子(① 的 + ③ 的 )在 时爆炸——取 就有 ,,天文数字;(iii) Pinsker 里丢掉的 又白送一倍;(iv) 用最坏单状态代替平均。四者相乘:要让惩罚后的下界 ,允许的 KL 步长被压到极小(量级远小于 ),收敛慢如龟爬。所以 TRPO 干脆丢掉这个惩罚形式,改成一个人为设定、大得多的硬信赖域 (如 ),再靠线搜索经验性地保证”代理目标真涨、KL 真没越界”——用”理论保证”换”实用步长”。这也解释了 PPO 为何更进一步:连硬约束都省了,直接用 clip 做启发式。
求解:对代理目标一阶、KL 约束二阶近似后,最优方向即自然梯度 (式(6.5));TRPO 用共轭梯度近似求 而不显式构造 ,再做线搜索回退到满足 KL 约束的最大步长。
局限 / 陷阱
TRPO 实现复杂(共轭梯度 + Fisher 向量积 + 线搜索),二阶近似和线搜索也使其较难直接采用 PPO 式的多 epoch 小批量更新。TRPO 原论文已在大型非线性网络与图像输入任务上实验,因此不能据此说它普遍不兼容 CNN/RNN 或参数共享 [2]。理论界(式(6.11))中的常数 极度保守。这些痛点催生了 PPO。
批判性追问
“TRPO 有单调改进保证”——这句话要打两个折扣。其一,界本身几乎不可用:式(6.11) 里的常数 叠了全空间最坏优势、两重有效时域因子、Pinsker 白送的一倍与 的最坏单状态, 时已是 量级;按它反解出的允许步长小到无法训练——实践中从没有人真按这个界取步长,TRPO 一律改用人为设定、大得多的硬 加线搜索。其二,单调性本身是有前提的:它只在”代理目标 这一近似成立、优势 估得准、逐状态 被真正压住”这些假设下才成立;一旦换成实践里的硬 + 线搜索,我们实际保证的只是”代理目标上升且平均 KL 不越界”这一经验性条件,已经不再携带式(6.11) 那条下界的理论保证。所以更诚实的说法是:单调改进界是一个漂亮但松弛的存在性论证,它解释了”为什么约束 KL 是对的”,却不是实践中真正被执行的东西。
7. PPO:用 clip 近似信赖域
PPO(Proximal Policy Optimization)放弃硬约束与二阶求解,用一个一阶、可直接 SGD的裁剪目标近似”别走太远”。记概率比 ,则
式中两个记号先说清: 是优势估计(“该动作比平均好多少”,实践中常用 模块 04 的 GAE 算出,正负号决定这一项是被鼓励还是被压低); 是裁剪阈值——一个很小的正常数(典型 ),它决定裁剪比较项进入平坦分支的阈值,但不会把实际概率比限制在 内;越小通常越保守。注意:这个 与第 6 节单调改进界里表示”优势上界”的 ()只是恰好同字母、含义无关,勿混。
为什么这样 · 能不能不这样
为什么 PPO 用一行 clip 制造”越走越无激励”的软刹车,而不直接照搬 TRPO 的硬 KL 约束? 因为 clip 目标是一阶的、可直接丢给 SGD/Adam,便于采用多 epoch 与 minibatch 更新。换成硬 KL 约束会怎样? 那就回到 TRPO:要用 Fisher 向量积、共轭梯度和线搜索近似求解,实现更复杂、每步开销也更大,并且难以直接采用 PPO 式的多 epoch 小批量更新。代价是:clip 只是逐样本、单侧的软刹车,并不真正约束整体 ,因此不是真信赖域(详见下文局限)——本质是用”理论严谨”换”简单可扩展”。
举例
设某个好动作(优势 ),新策略给出的概率比为 ,取 。由于 ,目标中的裁剪比较项按 计, 选择该平坦分支、对应样本不再提供继续增大比率的梯度;这并不把实际 投影回 。若 ,则该项尚未进入平坦分支。
图 3:clip 目标是分段线性。当更新已足够大(比率越过 且方向”贪心”),梯度被裁为 0,从而移除继续把策略往同方向推的激励。
逐项解读 clip 为什么防过大更新
- (好动作,想增大其概率):一旦 , 把项封顶, 取到封顶值,梯度归零——不再激励把这个已经涨够的动作继续拉高。
- (坏动作,想减小其概率):一旦 ,同理封底、梯度归零——不再激励把它继续压低。
- 的作用:它是悲观下界。在”更新使目标变得比未裁剪更好”的方向上, 保留裁剪值以刹车;而在”更新使目标变差”(比率朝错误方向)的情况下 取未裁剪值,允许把错误的大更新纠正回来。这非对称性保证 clip 只挡”过度自信的前进”,不挡”纠错的后退”。
局限 / 陷阱:PPO 不是真的信赖域(与真 KL 约束差在哪)
差距一:裁剪的是目标中的逐样本比较项,而非实际概率比或整体 KL。 TRPO 的约束是式(6.8) 那种状态平均的 KL ——一个全局、聚合的量;式(6.12) 的 只决定哪些样本项进入平坦分支,实际 仍可越过 ,因此不能由该阈值推出整体 的硬上界。
差距二:一阶启发式,非二阶信赖域求解。 TRPO 显式用 Fisher(KL 的二阶度规,式(6.4))解带约束优化并线搜索回退;PPO 则只是把 clip 目标丢给普通 SGD,靠”越界即梯度归零”这一一阶软刹车近似”别走太远”,全程不碰 、不做投影/回退。
后果:多个 epoch 反复更新同一批数据时(见第 8 节),累积 KL 会悄悄越界、某些样本被推得很远。因此 PPO”能用但脆弱”——实践中往往还要监控 KL(用式(6.13) 的 )并早停、或加自适应 KL 惩罚。它是对信赖域的启发式一阶近似,不是 TRPO 的严格替代。
批判性追问
再往深追一刀”PPO 是信赖域方法”这个流行说法:式(6.12) 的 是单侧的。只有在”过度前进”分支( 且 ,或 且 )中,目标才进入平坦区;在”纠错”分支( 且 ,或 且 )中, 取未裁剪项。即使进入平坦区,优化也只是移除该样本继续朝同方向更新的激励,并未投影实际 ,因此不能给 或完整策略 KL 提供硬上界。多 epoch 复用同批数据时, 与 的 KL 仍可能越过预期范围,需要用 (式(6.13))监控并按经任务验证的阈值早停。一句话:PPO 的”信赖域”是单侧、逐样本的软刹车,而非被强制执行的 (式(6.8))。
8. PPO 的实现细节与陷阱
有一条著名的经验结论:PPO 的大部分性能来自”code-level optimizations”,而非核心目标本身。也就是说,若只实现裁剪目标而忽略下列工程细节,往往复现不出论文性能。
| 细节 | 做法 | 为什么重要 |
|---|---|---|
| 优势估计 | 用 GAE() | 在偏差-方差谱上折中,稳定信号 |
| 优势归一化 | 每批把 标准化到零均值单位方差 | 稳定数值尺度,但减去批均值可能改变估计梯度方向 |
| Value 函数裁剪 | 对 的更新也做 clip | 防 critic 剧烈跳变(有争议,视任务) |
| 熵奖励 | 目标加 | 维持探索、防过早收敛/熵坍缩 |
| 多 epoch + minibatch | 同一批数据复用 个 epoch | 提升样本效率(但增大 KL 越界风险) |
| 学习率退火 / 梯度裁剪 | 线性衰减 lr、全局范数裁剪 | 训练后期稳定,防梯度爆炸 |
| 奖励/观测归一化 | running normalization | 跨任务尺度稳健 |
| TRPO | PPO | |
|---|---|---|
| 约束形式 | 硬 KL 约束(信赖域) | 比率 clip(软、启发式) |
| 求解 | 二阶:共轭梯度 + 线搜索 | 一阶:普通 SGD/Adam |
| 实现复杂度 | 高(Fisher 向量积等) | 低(几行代码) |
| 与常规一阶训练流程兼容 | 二阶近似与线搜索增加复杂度 | 好(参数共享、多 epoch) |
| 理论保证 | 单调改进下界 | 无严格保证 |
code-level optimizations 完整清单(逐条给”为什么”)
上表是速查;这里把每一条展开讲透”为什么”,因为经验反复表明:复现 PPO 性能的关键往往不在核心 clip,而在这一堆看似琐碎的工程细节。
先补一块:KL 估计器 k1 / k2 / k3
PPO 不硬约束 KL,但必须监控它以决定是否早停。记概率比 、对数比 ,估计 的三种常见单样本估计(Schulman):
- :无偏(),但方差大、单样本可为负——直接用来判早停会抖。
- :恒 、方差小,略有偏但二阶近似下 。
- :三好学生——恒 (因 )、无偏(,故 )、方差小。推荐用它做监控与早停。
- GAE 优势估计():在偏差-方差谱上取甜点(见 模块 04),给策略梯度一个稳、准的信号。为什么:纯一步 TD 偏差大、纯 MC 方差大,都会让 clip 目标学不稳。
- 优势归一化:每个 minibatch 把 标准化到零均值单位方差。为什么:除以标准差会缩放梯度,但减去批均值会改变各样本权重、可能改变合成梯度方向,并引入批依赖;实践中它常用于稳定数值尺度、降低学习率敏感。
- value function clipping:对 的更新也 clip 到 ,损失取裁剪与未裁剪的较大者。为什么:防 critic 单步剧烈跳变污染优势与共享躯干;有争议、视任务,有实现发现它可有可无甚至有害,需实测。
- reward / observation 归一化:用 running mean/std 对观测标准化、对(折扣)奖励做 running scaling。为什么:让网络输入与 value 目标的尺度跨任务稳健,避免大奖励把 value loss 撑爆。
- entropy bonus():为什么:维持探索、抵御熵坍缩(见下); 常随训练退火。
- 学习率退火:线性衰减 lr 到 0。为什么:后期策略接近最优,大步长只会把它推出信赖域、制造 KL 突刺。
- 梯度裁剪(全局范数,如 0.5):为什么:个别 minibatch 的大梯度(常来自异常优势或比率)会一步打崩策略;裁剪限幅是廉价保险。
- 多 epoch + minibatch + KL 越界监控:同一批数据复用 个 epoch、切成 minibatch。为什么:大幅提升样本效率,但重复更新可能使 与 的 KL 越界,其幅度取决于优化器、批量、任务和实现,并不一般地随 线性增长。对策:每个 minibatch 后算 ,超过预先设定并经任务验证的阈值时跳出剩余 epoch。
深化 · clip 阈值 与实际 KL
在小扰动且比率接近 1 时, 与 同阶,因此较小的 往往对应更保守的更新;但 PPO 裁剪的是目标函数,并不会把实际概率比投影回 。即使采样比率受限,也不能一般推出完整策略 KL 的上界。因此不能从 推导通用的 KL 上界或反解出 TRPO 的 ;多 epoch 后的实际 KL 也不具备通用的线性增长律,仍须直接监控 [3]。
PPO 失败模式与调参对策
PPO”能用但脆弱”,翻车通常表现为三种可辨认的模式。识别它们、对症下药,比盲目调 lr 有效得多:
| 失败模式 | 症状 / 监控信号 | 常见成因 | 对策 |
|---|---|---|---|
| KL 突刺 | 某 epoch 的 骤然飙高,随后回报断崖 | lr 太大、epoch 太多、优势未归一化、 太大、minibatch 太小噪声大 | 超过经任务验证的阈值时早停、降 lr、减 、优势归一化、必要时上自适应 KL 惩罚 |
| 熵坍缩 | 策略熵快速趋近 0、探索停滞、卡在次优 | 无/过小 entropy bonus、clip 对称地压低概率 token、优势归一化异常 | 加大/调度 、用 Clip-Higher(DAPO,解耦上裁剪阈值)、设熵下限告警 |
| value 崩 | value loss 发散或压过 policy loss、优势变成噪声 | 无 value clip、return 未归一化、value 损失系数过大、共享躯干时 value 梯度压过 policy、未裁剪梯度 | value clipping、分离 value 网络或调低系数、return/reward 归一化、grad clip |
调参心法
看 KL / 熵 / value loss / clip 比例 / 回报五条曲线一起看,而不是只盯回报。回报是滞后指标——等它崩了往往已经晚了;KL 突刺、熵掉太快、value loss 抬头都是更早的先兆。这些指标的健康范围依赖任务、优化器、批量与实现,应通过基线和验证实验确定,不宜采用通用的 clip 比例区间。
图 4:PPO 训练健康仪表盘。KL 突刺、熵坍缩、value 发散都是早于回报崩塌的先兆信号——同时监控这几条曲线,才能在翻车前介入。
前沿实验室视角
PPO 出自 OpenAI(Schulman 等,2017):设计初衷是用一个一阶、易实现的裁剪目标,替代 TRPO 沉重的二阶信赖域求解。公开的 RLHF 系统中有采用 PPO 的案例,但不能据此概括全部后训练系统。系统性复现研究表明,优势归一化、value 裁剪、奖励/观测归一化、学习率退火和梯度裁剪等实现选择会显著影响 PPO 表现 [3]。
前沿实践
部分公开的 RLHF 系统采用 PPO,把语言模型当策略,并用 per-token KL 惩罚约束其不偏离参考模型太远(详见模块 13)。另一些近期工作采用不需要额外 value critic 的组内相对优化;例如 DAPO 提出 Clip-Higher,解耦上下裁剪阈值以缓解其观察到的熵坍缩 [4]。这些是具体公开案例,不代表整个行业的默认选择。
本质 Insight:一个贯穿全课的母题
退一步看,TRPO/PPO 的 KL 约束只是一个更大母题的一个实例——“在改进的同时贴近一个参考分布”几乎贯穿整门课:这里的 TRPO/PPO 用 KL 约束贴近旧策略;模块 07 的 SAC 用最大熵贴近均匀先验、控制即推断把它写成 KL-to-prior;RLHF 用 per-token KL 贴近参考模型;DPO 用隐式 KL;模块 09 的离线 RL 用策略约束贴近行为策略。它们都可统一为带正则的优化
其闭式最优解恒为 ——区别只在 取”旧策略 / 均匀分布 / 参考模型 / 行为策略”罢了(统一推导见 模块 15)。
讨论课 · Section 5:Advanced Policy Gradients
本节取自 CS285 Discussion Section 5(Advanced Policy Gradients),补上主文点到为止的两块”机械细节”:其一是 TRPO 到底怎么在不显式构造 Fisher 矩阵的情况下算自然梯度(共轭梯度 + Fisher-向量积 + 线搜索);其二是 PPO 核对清单里主文没展开的点(KL 估计与早停、GAE 的递归实现、多 epoch 的 KL 越界监控)。目标是让你能照着实现而不只是理解。
5.1 为什么不显式构造 Fisher 矩阵
自然梯度方向是 (式(6.5))。但 中 是网络参数量(可达 )——显式构造 ( 存储)或求逆()在深度网络上完全不可行。TRPO 的关键工程 trick 是:我们从不需要 本身,只需要 作用在向量上的效果 。而 可以只用自动微分算出,代价约等于一次额外的反向传播——于是用共轭梯度(CG) 迭代求解线性方程组 ,每次迭代只调用一次 , 步(常 )即得 ,全程 。
推导:Fisher-向量积(FVP)如何用一次反向传播得到 Fv
关键事实
Fisher 矩阵等于平均 KL 在 处的 Hessian:(这正是式(6.6)–(6.7) 证得的”KL 的一阶项在此点为 0、二阶项即 ”)。因此 就是”KL 的 Hessian 乘向量” 。
思路。 直接算 Hessian 要 ;但 Hessian-向量积有恒等式 ——即”先求一阶梯度 (保留计算图),再对标量 反向传播一次”。第二次反向的结果正是 ,全程无需成矩阵。
# Fisher-向量积 FVP:不显式构造 F,只用自动微分 def Fv(v): kl = mean_KL(π_θ_old, π_θ) # 在 θ=θ_old 处:KL 及其一阶导为 0 g_kl = grad(kl, θ, create_graph=True) # 一阶梯度,保留计算图 gv = sum(g_kl * v) # 标量 g_kl·v(v 当常量) return grad(gv, θ) # 再反向一次 → H·v = F·v # 实践中常加阻尼:return grad(gv, θ) + damping * v # (F + λI)v,防病态
5.2 共轭梯度 + 线搜索回退
有了 ,用 CG 解 得到自然梯度方向,再按信赖域把步长缩放到 KL,最后线搜索回退确保约束满足且代理目标真的上升(否则不更新):
# 共轭梯度:解 F x = g,得到自然梯度方向 x ≈ F⁻¹ g
def conjugate_gradient(Fv, g, iters=10, tol=1e-10):
x = zeros_like(g); r = g.clone(); p = g.clone(); rr = dot(r, r)
for _ in range(iters):
Fp = Fv(p) # 每次迭代仅一次 FVP
α = rr / (dot(p, Fp) + 1e-8)
x = x + α * p
r = r − α * Fp
rr_new = dot(r, r)
if rr_new < tol: break
p = r + (rr_new / rr) * p
rr = rr_new
return x
# 步长缩放 + 线搜索回退
x = conjugate_gradient(Fv, g)
xFx = dot(x, Fv(x))
step = sqrt(2*δ / (xFx + 1e-8)) * x # 满足 KL≈δ 的最大自然梯度步
θ_old = θ
for j in range(max_backtracks): # 指数回退:α = β^j (如 β=0.5)
θ = θ_old + (β**j) * step
if surrogate(θ) > surrogate(θ_old) and mean_KL(θ_old, θ) <= δ:
break # 接受:既改进又不越界
else:
θ = θ_old # 全部失败 → 不更新(安全回退)
图 5:普通梯度(红)在分布空间里”走偏”;CG 用一系列 迭代(灰)逼近自然梯度方向 (绿),步长缩放到椭球边界后再线搜索回退,确保 KL 且代理目标上升。
5.3 PPO 核对清单:主文未展开的点
第 8 节给了 PPO 工程细节总表,这里补三处最容易出错、也最能决定成败的实现点。
(a) KL 估计与早停
PPO 不硬约束 KL,但要监控它。逐样本的近似 KL 有两种常见估计(,与第 8 节式(6.13) 的 一致):
推荐用 估计——它非负且通常方差更小。当某个 epoch 的 超过预先设定并经验证的阈值时,可提前停止本轮更新;阈值应按任务和实现校准。
(b) GAE 的递归实现
主文给了闭式 ,实现时用 反向递推(注意终止步用 mask 切断 bootstrap):
# GAE 反向递推(O(T));V 有 T+1 个(含 bootstrap 的 V[T]) adv = 0 for t in reversed(range(T)): nonterminal = 1 − done[t] δ = r[t] + γ * V[t+1] * nonterminal − V[t] # TD 残差 adv = δ + γ * λ * nonterminal * adv # 递推累积 A[t] = adv returns = A + V[:T] # value 目标 = 优势 + baseline A = (A − A.mean()) / (A.std() + 1e-8) # 批内优势归一化
(c) mini-batch / 多 epoch 的 KL 越界监控
PPO 会把同一批数据切成 mini-batch、复用 个 epoch。重复更新可能使累积 KL 越界——这正是主文所说”PPO 不是真信赖域”的落地隐患。实现上:每个 mini-batch 更新后计算 ;一旦本轮均值越过经任务验证的阈值,就跳出剩余 epoch。此外 clip 比率 、优势归一化、 与 mini-batch 大小共同决定”有效步长”,调参时应一起看 KL 曲线而非单看回报。
方法溯源:动机 · 启发 · 局限
本讲这条线可以浓缩成一个反复被追问的问题:“一步最多能走多远?” 朴素策略梯度对步长病态敏感、走坏一步还不可逆;解法是换一把”尺子”——不用参数空间的欧氏距离,而用分布空间的 KL 来量策略变化。沿着这把尺子,自然梯度、TRPO、PPO 依次登场,每一个都在修补前一个的实现或理论痛点。
| 方法 / 代表作(年代) | 动机(要解决什么) | 启发 / 脉络 | 关键局限(→ 引出谁) |
|---|---|---|---|
| 朴素策略梯度(对照起点) | 直接沿 上升,简单直接 | 似然比 / score-function 估计 | 步长病态敏感:参数小步 ≠ 行为小步;on-policy 走坏一步不可逆 → 需在分布空间约束步长 |
| 自然梯度 / NPG(Amari 1998 信息几何;Kakade 2002 引入 RL) | 用 KL(而非欧氏)度量策略变化,在正确流形上做最陡上升 | Amari 信息几何;Fisher 矩阵是 KL 的局部度规 | 要处理 ,高维下 存储、 求逆不可行 → 引出用 CG 回避求逆的 TRPO |
| TRPO(Schulman et al., 2015) | 把自然梯度工程化,给出单调改进的信赖域方法 | 性能差引理(PDL)+ Pinsker 不等式 + 硬 KL 约束;共轭梯度 + Fisher-向量积回避显式求逆 | 实现复杂(CG+FVP+线搜索)、理论常数 过保守,且难以直接采用 PPO 式多 epoch 小批量更新 → 引出 PPO |
| PPO(Schulman et al., 2017) | 用一阶 clip 把二阶信赖域近似成可直接 SGD、可大规模训练 | 把 TRPO 的硬约束替换为概率比裁剪的启发式;非对称 只挡”过度前进” | 不是真信赖域:只裁单样本比率、不直接约束整体 KL,多 epoch 累积 KL 可能越界;性能严重依赖实现细节 → 引出 GRPO/DAPO/DPO(模块 13) |
演进故事线:换一把量”远近”的尺子
问题的根在第 1 节就埋下:朴素 PG 在参数空间迈等距的步,映射到行为分布上却极不均匀——某些区域参数挪一点行为就跳很远,某些区域怎么走都不动,单一学习率无从适配;更糟的是 on-policy 让”走坏一步”采到坏数据、再也爬不回来。关键洞察是换度量:用 KL 散度而非欧氏距离衡量”策略变了多少”,它与参数化无关、直接刻画行为改变量。对 KL 做二阶泰勒,度规恰好是 Fisher 信息矩阵,于是”在 KL 小球内最陡上升”的答案就是自然梯度 。
自然梯度理论优美但要碰 ,高维网络上不可承受。TRPO 把它工程化:借性能差引理把提升写成代理目标、用 Pinsker 不等式把 KL 转成单调改进下界,再用共轭梯度只算” 乘向量”(一次额外反向传播)回避显式求逆,配线搜索检查 KL。可它仍然沉重、理论常数 也很保守,并且难以直接采用 PPO 式多 epoch 小批量更新。PPO 是进一步的工程化简化:丢掉二阶与硬约束,用概率比 clip 制造”越走越无激励”的软刹车,靠非对称 只挡过度前进、放行纠错后退。
遗留局限如何催生下一步
PPO 的简化是有代价的:它不是真信赖域——只在单样本比率上设阈值,不直接约束整体 KL,多 epoch 复用同批数据时累积 KL 会悄悄越界,性能又高度依赖 GAE、优势归一化、KL 早停等一堆工程细节。这些裂缝正是后续工作的入口:对 LLM,GRPO/GSPO 用组内相对奖励省掉 value critic 的显存与调参负担,DAPO 用 Clip-Higher 解耦上下裁剪阈值以抑制熵坍缩,而 DPO 家族干脆绕过在线 RL、把对齐重写成监督式分类。更深一层,TRPO/PPO 的 KL 约束只是”在改进的同时贴近一个参考分布”这一母题(式(6.14))的实例,其闭式最优解 贯穿最大熵 RL、RLHF、离线 RL(统一视角见 模块 15)。
9. 小结与要点
- 朴素 PG 对步长病态敏感、on-policy 下”走坏一步”可能不可逆——核心问题是”一步能走多远”。
- PDL 把提升写成代理目标 ,但它只在新旧策略接近时可信 → 必须约束(信赖域动机)。
- “接近”要用KL(分布空间) 而非参数欧氏;据此导出自然梯度 ,本质是在正确流形上最陡上升。
- TRPO = 最大化代理目标 + 硬 KL 约束,有单调改进下界,但实现复杂、界保守。
- PPO 用 clip 把信赖域近似为一阶启发式,简单可扩展,但不是真信赖域、依赖大量工程细节。
承上启下
我们把”策略优化”这条主线推到了现代前沿(PPO)。接下来 模块 07 换一个全新的视角:把控制问题重写为概率推断问题(control as inference),从变分推断自然导出最大熵 RL、Soft Q-Learning 与 SAC 的理论根基——这将统一”探索、鲁棒、多模态”等看似分散的现象。