跳到主要内容

步长这件事 — 信赖域、TRPO 与 PPO

这一章讲三件事: 为什么「步长」这个词在参数上量是没有意义的; 换到哪里去量才有意义,以及量出来之后怎么把步子限住; 以及把这个限制从「贵而准」做成「便宜而够用」的那一步是怎么走的。

它在全书链条里的位置:第二条主线的第二块补丁。 第 08 章治的是「估出来的方向飘」,这一章治的是「方向就算对,该往前迈多大一步」。 这两块补上之后,策略这条线才算能用;第 10 章开始把它和价值那条线合流。

顶层全景:两次参数挪动,两次都挪了 3

这一章从头到尾用书里那个例子:一个只有一个参数的策略,面前只有两个动作。

它长这样:算出一个介于 0 和 1 之间的数,当作「选动作甲的机会」,剩下的都归动作乙。 把一个任意的数压进 0 到 1 之间的那个常用函数,第 05 章第 4 节见过,叫 sigmoid。

现在把这个参数挪一挪。两次都挪 3,看策略变成什么样。

情况一:参数从 6 → 3
策略: (0.998, 0.002) → (0.953, 0.047)
★ 几乎没动。原本就闭着眼选甲,现在还是闭着眼选甲。★

情况二:参数从 1.5 → −1.5
策略: (0.818, 0.182) → (0.182, 0.818)
★ 整个翻过来了。原本八成选甲,现在八成选乙。★

参数上的挪动量:两次都是 3,一模一样。
策略上的挪动量:一次约等于没动,一次完全反转。

图说:这就是本章的主走查。★ 「步长」这个词,量在参数上是没有意义的。★
(这四对数出自书里:它印的是 (1.00, 0.00) → (0.95, 0.05) 和 (0.82, 0.18) → (0.18, 0.82)。
第一对我们按 sigmoid 算细了一点、写成 (0.998, 0.002) —— 书里那个 1.00 前面带约等号,
而第 4 节要拿动作乙的那个机会去做除法,写成 0.00 就除不了。
本章后面所有算出来的数,都写明是我们算的。)

接下来这一章要做的事,就是在这同一组数上依次回答:

问题在哪一节这一节算出什么
那换到哪里去量?§3两种情况的距离分别是 0.0390.95
用旧策略采的样,怎么估新策略的成绩?§4四个比值:0.955、19.2、0.223、4.48
同样的「策略走了多远」,参数上该挪多少?§5情况二只要挪 0.7,不是 3
怎么把步子限住§6情况一超标 3.9 倍 → 折半重试 → 0.0049,过关
有没有便宜的做法§7–§8那四个比值分别被截断成什么
那个贵的矩阵能不能少算点§9一层的求逆代价降到 八百四十万分之一

1. 「步长」这个词,量错了地方

这一节回答:第 08 章把方向算清楚了,为什么还不能直接往前走。

先看现象:两个都很糟的选择

书里把初版策略梯度的这个缺陷说得很直白:它和标准的梯度下降一样,有步长不好确定的缺陷1

你手上只有一个方向,没有「该走多远」的任何信息。

走多大会发生什么
步子迈大了书里的原话是:如果在高度弯曲的区域选择了较大的步长,学习算法的性能可能会突然大幅下降1
步子迈小了学习过程可能会太保守,从而非常缓慢1

「高度弯曲」是什么意思? 想象你在一片山地上找最高点。你脚下的坡度只告诉你 「这一小步该朝哪儿」,它不知道前面十米是不是有个悬崖。 书里管这个叫曲度:梯度只提供当前位置的局部一阶信息,而忽略了那个曲面的曲度1

换个地方量,答案完全不一样

书里紧接着指出了第二个、也是更要命的一个局限:更新是在参数空间里做的,而不是在策略空间里做的2

这两个词得分清楚:

  • 参数空间:网络里那一堆数本身。挪动量就是「这些数改了多少」;
  • 策略空间:这些数算出来的那组机会。挪动量是「选各个动作的机会各变了多少」。

顶层全景那两组数就是书里举的例子3。同样挪 3:

情况一: (0.998, 0.002) → (0.953, 0.047) 两个动作的机会各变了不到 5 个百分点
情况二: (0.818, 0.182) → (0.182, 0.818) 两个动作的机会各变了 64 个百分点

★ 参数上的 3 是同一个 3;策略上的差别是 13 倍。★
(13 倍是我们按这四个数算的:64 除以 4.5。)

书里给这件事的结论是一句话:虽然两者在参数空间中的更新幅度相同,但是在策略空间中的 更新幅度却完全不同3

所以「学习率调小一点就安全」这句话在这里不成立。 同一个学习率, 在参数的某些位置上等于原地不动,在另一些位置上等于把策略整个换掉。

2. 为什么这一行走错一步特别贵

这一节回答:走错了再走回来不就完了吗?

在监督学习里确实差不多。 数据集是固定的,这一步走坏了,下一步照样能从同一批数据里学。

这一行不是。你的样本是自己走出来的。

书里把这条因果写得很清楚:策略梯度需要从基于当前策略收集的样本中估计; 而策略性能的突然下降或者提升太过缓慢,会反过来影响收集到的样本的质量4

监督学习: 步子迈坏了 → 损失变高 → 下一步从同一批数据里改回来
↑ 数据没变

这一行: 步子迈坏了 → 策略变差 → ★ 用变差的策略去采样 ★

采到的全是差样本 → 估出来的方向更不可信 → 更差

★ 这是一个正反馈。策略崩了之后,往往爬不回来。★

书里给出的结论是:这让学习的性能对于步长的选择更敏感4

所以这一章不是在做优化上的锦上添花,是在堵一个会把整次训练毁掉的洞。

3. 那把该用的尺子:两个分布差多远

这一节把上一节的「该在策略空间里量」落成一个具体的数。

这把尺子第 05 章已经见过

要量的东西是:同一个局面下,新旧两组机会差多远。

第 05 章第 5 节讲交叉熵时用过一把尺子,就是它 —— 那里说的是 「衡量两个分布有多像」的一个非负指标,名字叫 KL 散度两个分布一模一样时它是 0,差得越远它越大。

现在把顶层全景那两组数各算一遍。

情况一: 旧 (0.998, 0.002) 新 (0.953, 0.047) KL = 0.039
情况二: 旧 (0.818, 0.182) 新 (0.182, 0.818) KL = 0.95

★ 参数上都挪了 3;这把尺子量出来差了 24 倍。★
★ 这就是它比「参数改了多少」更配当尺子的全部理由:它量的是策略本身变了多少。★

(这两个数是我们按书里那四个策略值算出来的,书里没有给。
算法是 KL 的定义:把新旧两组机会逐项做「旧 × 旧比新的对数」再相加。)

记住这两个数:0.039 和 0.95。这一章后面每一节都会用到它们。

用一句话说清 KL 在这里的角色

它是这一章所有算法的公分母。 TRPO 拿它当硬约束(§6), PPO 的一个版本拿它当罚款(§7),另一个版本用一个更便宜的东西去近似它(§8), ACKTR 拿它的二阶信息去构造矩阵(§9)。四种做法,同一把尺子。

4. 用旧策略采的样,怎么估新策略的成绩

这一节讲这一章的第一个真机制,并把第 07 章欠下的一个词讲透。

先看现象:一个鸡生蛋的死结

你想知道「改成新策略之后成绩会变成多少」。 但要知道成绩,得用新策略去环境里跑一遍;而跑一遍很贵,而且你还没决定要不要改。

书里给的钥匙:一条把新旧成绩挂起来的等式

书里先引了一条引理5:从旧策略到新策略在性能上的提升,可以由旧策略的优势函数来计算。

「优势」就是第 08 章第 7 节那个词 ——「在这个局面上做这个动作,比这个局面的平均水平好多少」。

这句话的意思是:新策略好多少,等于「拿新策略去走,一路上按旧策略的评价累计能占多少便宜」。

可这句话里还有一个麻烦:「拿新策略去走」——还是得用新策略跑。

所以要换一个能用旧样本算的写法

换的办法只有一步:给每条旧样本乘一个系数,把它「假装」成新策略采的。

这条样本上,旧策略选这个动作的机会是 0.818
这条样本上,新策略选这个动作的机会是 0.182

比值 = 0.182 / 0.818 = 0.223

★ 意思是:这个动作,新策略只有旧策略两成多的兴趣。★
所以这条样本在估新策略的成绩时,只该算两成多的分量。

这个「乘一个新旧概率比值」的做法有一个正式名字:重要性采样。 第 07 章第 7 节那个「偏心抽样之后要配的纠偏权重」用的就是它,那里只报了名字,机制在这里。

主走查的四个比值(我们按顶层全景那四个策略值算出来的):

动作甲的比值动作乙的比值
情况一(策略几乎没动)0.9526 / 0.9975 = 0.9550.04743 / 0.00247 = 19.2
情况二(策略整个翻过来)0.1824 / 0.8176 = 0.2230.8176 / 0.1824 = 4.48

这四个除式里的数,比全景那里多写了一两位小数,而这不是讲究 —— 是必须。 动作乙在情况一里的机会小到 0.0025 上下,四舍五入到三位再去除,结果会差出两成: 拿全景上那两个数硬除得到的是 0.047 / 0.002 = 23.5,不是 19.2。 ★ 分母越小,舍进去的那一点点占的比重越大。★(这四个比值是我们按 sigmoid 的原值算的。)

★ 看情况一的第二列:策略「几乎没动」,可动作乙的比值是 19.2 —— 一条样本被放大了十九倍。★ 这就是这个办法的代价:两个策略差得越远(哪怕只在某个冷门动作上),这个估计越不可信。

书里对这个「不可信」给了一个界

换写法时,书里还做了一处近似:直接用旧策略走出来的那些局面,去代替新策略会走到的局面6

书里自己说这个近似**「虽然看似粗糙」,但接着给了一条定理证明当新旧两个策略相似的时候, 这个近似并不差**6

定理的形状是:真实的提升,和这个用旧样本估出来的量,两者之差不超过「一个常数 × KL 的最大值」7

★ 这一步是这一章的枢纽:KL 从「一把量距离的尺子」,
变成了「这个估计还能信多少」的误差界。★

KL 小 → 这个用旧样本算出来的量可信 → 可以放心把它顶到最大
KL 大 → 它和真实提升可能差很远 → 顶到最大反而会走错

所以:★ 一边最大化它,一边把 KL 摁住。★ 这就是下面 TRPO 的全部内容。

书里管这个「用旧样本估出来的、拿来代替真目标去优化的量」叫替代目标。 书里的结论句是:如果那个 KL 很小,它**「可以合理地被作为一个优化目标」**7

5. 在参数上量距离是错的,那正确的尺子写成矩阵长什么样

这一节独占给一个词,因为它是「策略空间」这个说法真正落地的地方。

先看现象:同样的「策略走了多远」,参数上该挪多少?

回到主走查。我们已经知道:情况一挪 3,策略走了 0.039;情况二挪 3,策略走了 0.95。

现在反过来问:在情况二那个位置上,想让策略只走 0.039 这么远,参数该挪多少?

情况一(参数在 6 附近): 参数挪 3 → 策略走 0.039
情况二(参数在 1.5 附近): 参数挪 3 → 策略走 0.95
参数挪 0.7 → 策略走约 0.039 ← ★ 就到了 ★

★ 同一个「策略走多远」的预算,在两个位置上,允许的参数步子差了四倍多。★
(0.7 这个数是我们按同一组数反解出来的,书里没有给。)

所以「该挪多少」不是一个全局常数,它随你现在站在哪儿而变。 要走对,你得在每个位置上现算一次「参数挪一点点,策略会走多远」的换算率。

这个换算率写成矩阵,就是 Fisher 信息矩阵

参数不止一个的时候,这个换算率不是一个数,是一整张表: 「第 i 个参数和第 j 个参数一起挪时,策略会走多远」。

书里的处理是:把「平均 KL」这个量对参数求两次导,得到的那张表叫它的 Hessian 矩阵 (就是「二阶导数排成的方阵」的标准叫法)8

而书里在注 5.3 里给它挂了一个名字:

书里的原话:负值 Hessian 矩阵 −H 也被称为 Fisher 信息矩阵9

把这张表用在梯度下降上,书里说这已经有不少研究,名字叫自然梯度下降9

自然梯度好在哪:书里点了一条很关键的性质

书里说这个方法的一个好处是:它对于再参数化是不变的,也即,不管函数参数化的方法是什么, 该梯度保持不变9

「再参数化」就是第 08 章第 3 节那个词 —— 同一件事换一种写法。

这条性质翻译成人话:

普通梯度: 你把网络的某一层乘以 10、另一层除以 10(策略一点没变),
算出来的梯度方向会变。 ★ 尺子跟着写法走。★

自然梯度: 同样这么改,方向不变。 ★ 尺子跟着策略走。★

图说:普通梯度量的是「参数改了多少」,自然梯度量的是「策略改了多少」。
这正是 §1 那两句话的数学版本。

判断(我们的,不是书里的): 书里注 5.3 说的是 −H 是 Fisher 信息矩阵, 而第 5.9 节那段推导算出来的是 H 本身等于「对数机会的梯度和它自己的外积」的平均10 —— 而那个外积的平均恒为非负,正是 Fisher 信息矩阵的标准形式。两处差一个负号。 我们按 5.9 节那段推导理解:把 KL 对参数求两次导得到的那张表,本身就是 Fisher 信息矩阵。 如果错,会错在: 注 5.3 可能说的是另一个对象的 Hessian (统计学里有一条标准结论,说的是另一个量:似然 —— 也就是「按现在这套参数, 手上这批数据出现的机会有多大」—— 取对数之后求两次导、再取负号、再平均,等于 Fisher 信息矩阵), 那样两处就都对,只是没写明求的是谁的二阶导。判据是:这张表必须是非负的—— 它量的是距离,距离不能是负的。往代码里搬时以这一条为准。

6. TRPO 就是一句话

这一节把前三节拼起来,得到这一章的第一个完整算法。

那句话

书里给这个算法的名字是信赖域策略优化,通常写作 TRPO11它的内容一句话说得完:

在「KL 不超过一个上限」的范围里,把 §4 那个替代目标顶到最大。

「信赖域」这个名字就是这么来的:那个 KL 上限圈出来的范围,是你「敢信」的那一圈 —— 在圈里,替代目标和真实提升差不多(§4 那条定理保证的);出了圈,它就不作数了。

书里写的约束是平均 KL 不超过一个上限,不是最大 KL11

主走查:限住了会发生什么

设这个上限是 0.01(TRPO 论文里常用的量级,这里的具体取值是为演示定的)。

情况一: 算出来 KL = 0.039 ★ 是上限的 3.9 倍,超了 ★ → 拒绝这一步
情况二: 算出来 KL = 0.95 ★ 是上限的 95 倍,超得离谱 ★ → 拒绝这一步

怎么办?★ 把步子折半重试。★
情况一:参数改成从 6 挪到 4.5(只挪 1.5)
→ 新策略 (0.989, 0.011)
→ KL = 0.0049 ★ 在 0.01 以内,过关 ★

图说:这就是书里说的「回溯线搜索」——照解析解算出一个步子,
不合格就乘一个小于 1 的系数再试,直到既满足 KL 约束、又确实让目标变好为止。[^11]
(0.0049 与那组新策略值是我们按同一组数算出来的;上限 0.01 是为演示取的。)

解出来要付什么代价

书里的解法分两步:目标只取一阶近似,约束取二阶近似12这么一化简,最优解有一个现成的公式:把已知的几个量代进去就能直接算出答案, 不用一轮一轮地试。 这种「有现成公式」的解,数学上叫解析解 —— 书里的说法正是**「易见这个问题的解析解存在」**12

但那个公式里有一件很贵的事:要对 §5 那张表求逆。

「求逆」可以理解成除法的矩阵版本。 而书里在脚注里把账算得很清楚: 一般来讲,求逆需要的计算量是参数个数的三次方,「这在实际应用中一般代价十分昂贵」, 因为这里的参数个数就是模型参数的个数13

书里的绕法:不真的求逆。共轭梯度算法去近似那个结果 —— 它是一种迭代法,每一轮只需要「这张表乘上一排数」的结果 —— 「一排数」这个东西在这一行有个通用叫法,叫向量 —— 而不需要把整张表摊开12

7. 二阶方法很准,但它贵、而且挑批量

这一节讲 TRPO 的两笔账,以及 PPO 用什么换掉了它们。

第一笔账:实现复杂、算得慢

书里开门见山:TRPO 的实现较为复杂,而且计算自然梯度的计算复杂度也较高; 即使是用共轭梯度法来近似,每一次更新参数也需要多步的共轭梯度算法14

「每一次更新都要跑一个内层的迭代」——这是它慢的直接原因。

第二笔账:它需要很大的一批样本

这笔账书里记在第 18 章,而它正是我们第 20 章的材料 —— 这里先兑现一半。

书里的原话是:信赖域这一路需要用一个较大批尺寸的原因是,它需要用共轭梯度来近似 Fisher 信息矩阵,这是基于当前采样到的批量样本计算的; 如果批尺寸太小或者是有偏差的,可能对这个近似造成问题15

结论也写在书里:所以 TRPO 有时也「无法较好地扩展到大规模的网络」, 以及较深的卷积神经网络和循环神经网络(这两种网络第 05 章第 9、10 节讲过: 前者是拿同一小块模板在整张图上滑一遍的那种,后者是靠一个隐状态把过去带到现在、 专门用来吃一串东西的那种)15

★ 这条债这一章还不完 —— 第 20 章讲选型时会正面收它;而第 9 节的 ACKTR 会给一条补救路。★

PPO 第一版:把硬约束改成罚款

书里给出的第一种简化:与其优化一个带约束的优化问题,PPO 直接优化它的正则化版本16

TRPO: 最大化 替代目标 受限于 KL ≤ 上限 ← 硬围栏,越界一步都不许
PPO 版一: 最大化 替代目标 − 系数 × KL ← 罚款制,越界要交钱

图说:围栏换成罚款之后,就是一个普通的无约束优化,拿平常那套梯度法直接跑。

但这里有个新麻烦:那个系数取多少?

书里说得很老实:对每一个 KL 上限,都有一个相对应的系数让两个优化问题有相同的解; 然而这个系数的值依赖于当前策略17换句话说,它不是一个能调死的常数。

所以书里说用一个自适应的系数更合理:通过检验 KL 散度的值来决定这个系数该增大还是减小17这个版本叫 PPO-Penalty。

书里给的伪代码把调法写死了:KL 比目标值小得多就把系数除以 2,大得多就乘以 217

★ 为什么说它「更难调」:你现在有两个要调的东西了 —— 那个 KL 目标值,和这套自适应的两个系数。而它们互相影响。★

8. PPO 第二版:一行截断,以及它到底在防什么

这一节走主走查的最后一段,是本章最实用的一节。

做法

书里给的第二种简化更干脆:直接剪断用于策略梯度的目标函数,从而得到更保守的更新18

被剪的就是 §4 那个新旧概率的比值。

取一个截断幅度(书里写作 ϵ)。这里取 0.2(为演示取的常见值)。
允许的区间就是 [1 − 0.2, 1 + 0.2] = [0.8, 1.2]。

比值落在区间里 → 原样用
比值跑出区间 → 按边界值封顶

最后一步:★ 取「截断的」和「未截断的」两个目标里较小的那一个。★[^20]

书里对这一步的说法是:经验表明,这个目标函数可以让策略梯度方法有稳定的学习性能18 —— 注意「经验表明」四个字,这是实证结论,不是定理。

主走查:那四个比值分别被截成什么

把 §4 算出的四个比值放进这条规则(区间 [0.8, 1.2]):

比值落在哪截断后
情况一 · 动作甲0.955区间内0.955,原样
情况一 · 动作乙19.2远超上界1.2
情况二 · 动作甲0.223低于下界0.8
情况二 · 动作乙4.48超过上界1.2

★ 情况一那个 19.2 是关键:策略在总体上「几乎没动」,但在冷门动作乙上被放大了十九倍。 截断把它按回 1.2 —— 这一条样本再怎么极端,也只能有 1.2 份分量。★

那个「取较小的一个」到底在防什么

这是 PPO 最容易被当成玄学的一步,而它其实只做了一件事:让梯度单向消失。

要看懂它,得把优势的正负分开看。 优势为正 = 这个动作比这个局面的平均水平好,该多做; 优势为负 = 该少做。

① 优势为正,比值已经涨到 4.48(这个动作已经被推得太多了)
未截断的目标 = 4.48 × 优势 截断后 = 1.2 × 优势
取较小的 → 1.2 那一支 ★ 它是个封顶的常数,再推也不涨 ★
→ 梯度为 0,★ 不再往这个方向推 ★

② 优势为负,比值已经跌到 0.223(这个动作已经被压得太狠了)
未截断的目标 = 0.223 × 优势(负数,约 −0.223)
截断后 = 0.8 × 优势(负数,约 −0.8)
取较小的 → −0.8 那一支 ★ 又是个封顶的常数 ★
→ 梯度为 0,★ 不再往下压 ★

③ 优势为负,但比值是 4.48(这个坏动作反而被推上去了 —— 走反了)
未截断 = 4.48 × 负数 = −4.48 截断后 = 1.2 × 负数 = −1.2
取较小的 → ★ −4.48,是未截断那一支 ★
→ 梯度照常,★ 允许它把这个动作大幅压回去 ★

★ 这就是「取较小的一个」的全部作用:朝外冲的时候封顶,往回走的时候放行。★
(优势的正负号是为演示假设的;区间 [0.8, 1.2]、取较小的那一步是书里的。)

书里对这个版本的总结是:PPO-Clip 可以理解为在最大化目标函数的同时, 将从旧策略到新策略的更新保持在可控范围内19

★ 对比一下这三件事花的代价:★

每次更新要做什么代价
TRPO算一张矩阵、跑一个内层迭代去近似求逆、再回溯线搜索最贵
PPO-Penalty算一次 KL,按它调一个系数中,但两套东西要调
PPO-Clip算一个比值,越界就按边界封顶最便宜

9. 还有一条路:把那张矩阵按层拆开

这一节兑现 §7 那句「扩不到大网络」的一半 —— 书里在下一节就给了一条补救路。

它想省的是哪一笔钱

书里介绍 ACKTR 时说得很明确:它是降低 TRPO 计算负担的另一个方法20

省的正是 §6 那笔求逆的钱。

做法:整块矩阵换成一串小方块

先说那张表被改成了什么样子。 把一整张大表切成若干个小方块, 只留对角线上那几块、块与块之间的位置一律填 0 —— 这种形状的表就叫分块对角。

书里的做法正是这个:在 TRPO 里要用多步共轭梯度去近似那个逆矩阵; 在 ACKTR 里,用一个分块对角矩阵来近似它,矩阵的每一块对应神经网络每一层21

落到这里的意思是:只保留同一层内部的牵连,不同层之间的牵连一律当成 0。

而每一层内部还能再拆一次。 书里给的理由是一个具体的观察: 这一层的梯度是两个向量的外积(「外积」= 一列数和一行数相乘,得到一张表)22外积的结构让求逆可以拆成两个小矩阵各自求逆。 书里管这套拆法叫 K-FAC20

省了多少:书里给了确切的账

书里的结论是:与其对一个「输入宽度 × 输出宽度」那么大的矩阵求逆(计算量是两者三次方的乘积), ACKTR 只需要对两个分别是输入宽度和输出宽度的矩阵求逆(计算量是两者三次方的和)23

拿一层 256 进、256 出来算(这个宽度是为举例挑的常见值):

原来: 要对一张 65536 × 65536 的表求逆 → 计算量约 2.8 × 10^14
之后: 对两张 256 × 256 的表各求一次逆 → 计算量约 3.4 × 10^7

★ 差了大约八百四十万倍。★
(这个倍数是我们按书里给的那两个复杂度公式算的;256 这个宽度是为举例挑的。
参照物:10^14 这个量级,相当于一台每秒算一亿次的机器要跑一个月;
3.4 × 10^7 它半秒就算完了。这个换算是我们做的。)

★ 这就是二阶方法能扩到大一点网络的那条路:不是把矩阵算得更快,是根本不算整张矩阵。★

书里在这一节最后很坦白:ACKTR 也可以用来学价值网络,但**「我们这里不做详细解释」**, 让感兴趣的读者去看原论文23

10. 书之后:这个算法后来去了哪儿

补充(不在书里)。这一节标出一处时代差,读者出门会撞见。

书里把 PPO 讲成一个强化学习圈内的算法。 它后来的主要战场不在这里 —— 它成了大语言模型对齐的默认选择:拿人的偏好训一个打分器,再用 PPO 去调语言模型。

书架上有一整本讲这件事的拆解,里面把同一个截断规则按优势的正负分成六种情况逐一走查, 结论和我们 §8 那三条一致:在信任区之内,PPO 和朴素的策略梯度没有任何区别24

判断(我们的,不是书里的): 这一章讲的三个东西里,只有 PPO 活下来了, 而且活得比这本书预期的大得多。TRPO 今天基本只作为「PPO 为什么长这样」的前置来读, ACKTR 更是几乎见不到。读这一章的正确姿势是:TRPO 是问题的定义,PPO 是被采纳的答案。 如果错,会错在: 这是按「今天工程上用谁」判的,不是按学术价值判的。 自然梯度那一套的思想仍然活跃(它是很多二阶优化工作的地基), 只是很少以 ACKTR 这个具体形态出现。判据是:去任意一个主流强化学习库里数一数, 有几个实现了 TRPO 和 ACKTR、有几个把 PPO 当默认。

作者的判断与证据

书里给了推导或明确证明的:

  • 参数空间与策略空间不是一回事,书里给了那个只有一个参数的具体例子和四个策略值3;
  • 从旧策略到新策略的性能提升可以用旧策略的优势算出来(引理 5.1,书里注明出自 Kakade 等人)5;
  • 用旧策略走过的局面去近似新策略会走到的局面,误差不超过一个常数乘 KL 的最大值 (定理 5.1)7 —— 书里对这个近似先自评**「看似粗糙」**,再用定理把它兜住;
  • 约束优化问题在一阶/二阶近似下有解析解12;
  • K-FAC 把求逆代价从两者三次方的乘积降到两者三次方的和,书里给了完整的推导链2223

作者的判断与经验性说法(书里没有给证明的):

  • PPO-Clip 的目标函数「经验表明」能带来稳定的学习性能18 —— 这是实证,不是定理;
  • PPO-Penalty 里那套「小了除以 2、大了乘以 2」的调法17 —— 是工程惯例;
  • TRPO 需要大批量样本、因此扩不到大网络15 —— 书里给了机理上的解释 (共轭梯度是基于当前批量样本近似的),但没有给实验数据;
  • 注 5.3 里那个符号9 —— 见 §5 的判断块。

书里明说不给的:

  • ACKTR 用于价值网络的细节,书里写明**「我们这里不做详细解释」**23;
  • 自然梯度本身的细节,书里让读者去看 1998 年那篇原论文9

边界与局限

  • 这一章从头到尾只处理「步子多大」,不处理「方向对不对」。 第 08 章那些降方差的手段在这里全部照旧要用 —— 两章治的是两种病;
  • KL 约束保的是「新旧策略不会差太远」,不保「新策略一定更好」。 书里那条定理给的是误差界,不是改进保证;
  • 书里没有给这三个算法的任何性能对照数据。 谁在什么任务上更好、好多少, 这一章一个数都没有 —— 这是这本书通篇的一个特点(第 07 章那个消融实验是罕见的例外);
  • 截断幅度取多少,书里没给建议值。 它是个要调的东西,而书里没说怎么调;
  • PPO 的两个版本谁更好,书里没有下结论。 只说了 Penalty 那个系数依赖于当前策略、 所以要自适应;
  • 这一章讲的仍然全是在线策略的方法。 样本用过一轮就作废这件事一点没改善 —— 这正是第 10 章要合流的动机。

可带走的

全章那条走查,一行写完: 同一个策略,参数两次都挪 3 → 一次策略几乎没动(0.998 → 0.953)、一次整个翻过来(0.818 → 0.182) → 换成 KL 来量,两次分别是 0.0390.95,差 24 倍 → 新旧概率比值分别是 0.955 / 19.2 / 0.223 / 4.48 → 在情况二那个位置上,参数只要挪 0.7 就走完 0.039 的预算 → TRPO 按 0.01 的上限拒掉这两步,折半重试后 KL 降到 0.0049 过关 → PPO 不算 KL,直接把那四个比值截进 [0.8, 1.2]:19.2 变 1.2、0.223 变 0.8。 (前四个策略值是书里的;KL、比值、0.7、0.0049、上限 0.01 与截断幅度 0.2 都写明了来历。)

  1. ★「步长」这个词量在参数上是没有意义的 ★ —— 同样挪 3,一次策略没动、一次全翻;
  2. 走错一步在这一行特别贵:坏策略会采到坏样本,坏样本估出更坏的方向 —— 这是正反馈;
  3. 尺子要换到策略上量,那把尺子是 KL 散度(第 05 章讲交叉熵时见过的那个);
  4. 用旧策略采的样估新策略的成绩,靠给每条样本乘一个新旧概率的比值 —— 这个做法叫重要性采样,第 07 章那个纠偏权重用的就是它;
  5. ★ KL 在这里有两个身份:既是距离,又是「这个估计还能信多少」的误差界 ★ —— 后者才是 TRPO 存在的理由;
  6. TRPO 一句话:在 KL 不超过上限的范围里,把那个用旧样本估的替代目标顶到最大;
  7. 「信赖域」= 那个 KL 上限圈出来的、替代目标还作数的那一圈;
  8. 同样的「策略走多远」,在参数上该挪多少,随位置而变 —— 把这个换算率写成矩阵就是 Fisher 信息矩阵,沿它走叫自然梯度;
  9. 自然梯度对「参数怎么写」不敏感,普通梯度敏感 —— 这是它值得费劲的理由;
  10. TRPO 两笔账:实现复杂算得慢;而且需要很大的批量,所以扩不到大网络;
  11. PPO-Penalty = 把硬约束换成罚款,代价是那个罚款系数依赖当前策略、得自适应;
  12. PPO-Clip = 把新旧比值截进一个区间,再取截断与未截断里较小的那个;
  13. ★ 那个「取较小的」只做一件事:朝外冲时封顶(梯度归零),往回走时放行。★
  14. ACKTR = 把那张大矩阵按层拆成小方块,每层内部再拆成两个 —— 一层 256 进 256 出时,求逆代价降到约八百四十万分之一;
  15. 今天真正在用的只有 PPO —— TRPO 是它的问题定义,ACKTR 几乎见不到。

原文地图

主题原书章原文位置
步长不好确定、曲度第5章 策略梯度text/09-ch05.txt:339(搜「步长不好确定的缺陷」) · text/09-ch05.txt:340(搜「忽略了奖励函数定义的曲面的曲度」)
坏步子污染样本第5章 策略梯度text/09-ch05.txt:346(搜「让学习的性能对于步长的选择更敏感」)
参数空间与策略空间第5章 策略梯度text/09-ch05.txt:347(搜「而不是策略空间中进行的」)
那个 sigmoid 的两情况例子第5章 策略梯度text/09-ch05.txt:355(搜「在策略空间中从几乎是」) · text/09-ch05.txt:356(搜「在参数空间中的更新幅度相同」)
TRPO 的命名与引理 5.1第5章 策略梯度text/09-ch05.txt:359(搜「信赖域策略优化算法」) · text/09-ch05.txt:361(搜「在性能上的提升」)
替代目标与那个「粗糙」的近似第5章 策略梯度text/09-ch05.txt:414(搜「这个近似虽然看似粗糙」)
定理 5.1 的误差界第5章 策略梯度text/09-ch05.txt:426(搜「可以合理地被作为一个优化目标」) · text/09-ch05.txt:427(搜「散度的约束下优化」)
一阶/二阶近似与解析解第5章 策略梯度text/09-ch05.txt:438(搜「我们利用目标函数的一阶近似和约束」) · text/09-ch05.txt:465(搜「易见这个问题的解析解存在」)
共轭梯度、回溯线搜索第5章 策略梯度text/09-ch05.txt:471(搜「我们使用共轭梯度算法来近似」) · text/09-ch05.txt:533(搜「最小值」)
求逆的代价第5章 策略梯度text/09-ch05.txt:504(搜「这在实际应用中一般代价十分昂贵」)
Fisher 信息矩阵与自然梯度第5章 策略梯度text/09-ch05.txt:474(搜「也被称为 Fisher 信息矩阵」) · text/09-ch05.txt:476(搜「它对于再参数化是不变的」)
PPO 的动机与正则化版本第5章 策略梯度text/09-ch05.txt:480(搜「TRPO 的实现较为复杂」) · text/09-ch05.txt:496(搜「PPO 直接优化它的正则化版本」)
自适应系数与那套调法第5章 策略梯度text/09-ch05.txt:545(搜「使用一个适应性的」) · text/09-ch05.txt:546(搜「通过检验 KL 散度的值来决定」) · text/09-ch05.txt:583(搜「dtarget」)
PPO-Clip 的截断与取小第5章 策略梯度text/09-ch05.txt:548(搜「直接剪断用于策略梯度的目标函数」) · text/09-ch05.txt:550(搜「经验表明」) · text/09-ch05.txt:588(搜「取截断的目标函数和未截断的目标函数中较小的一方」) · text/09-ch05.txt:589(搜「更新保持在可控范围内」)
ACKTR 与 K-FAC第5章 策略梯度text/09-ch05.txt:593(搜「降低 TRPO 计算负担的另一个方法」) · text/09-ch05.txt:657(搜「分块」) · text/09-ch05.txt:660(搜「外积」) · text/09-ch05.txt:681(搜「需要对两个维度为」)
Fisher 等于外积的平均第5章 策略梯度text/09-ch05.txt:655(搜「Ea∼πold」)
信赖域需要大批量、扩不到大网络第18章 深度强化学习应用实践技巧text/24-ch18.txt:127(搜「基于信赖域的方法可」) · text/24-ch18.txt:130(搜「它需要用共轭梯度来近似 Fisher 信息矩阵」) · text/24-ch18.txt:136(搜「无法较好地扩展到大规模的网络」)

Footnotes

  1. 出处:「第5章 策略梯度」第 339 段(text/09-ch05.txt:339,搜「步长不好确定的缺陷」)与第 340 段(text/09-ch05.txt:340,搜「忽略了奖励函数定义的曲面的曲度」)。原文对两头的说法是:高度弯曲的区域用大步长「性能可能会突然大幅下降」,步长太小则「学习的过程可能会太保守,从而非常缓慢」。 2 3 4

  2. 出处:「第5章 策略梯度」第 347 段(text/09-ch05.txt:347,搜「而不是策略空间中进行的」)。原文的措辞是「初版策略梯度方法的另一个局限」。

  3. 出处:「第5章 策略梯度」第 355 段(text/09-ch05.txt:355,搜「在策略空间中从几乎是」)与第 356 段(text/09-ch05.txt:356,搜「在参数空间中的更新幅度相同」)。原书给的四个策略值是 (1.00, 0.00)、(0.95, 0.05)、(0.82, 0.18)、(0.18, 0.82);我们在正文里多写了一位小数,以便后面算 KL 时不出现取对数取到 0 的情况。 2 3

  4. 出处:「第5章 策略梯度」第 345 段(text/09-ch05.txt:345,搜「反过来影响收集到」)与第 346 段(text/09-ch05.txt:346,搜「让学习的性能对于步长的选择更敏感」)。 2

  5. 出处:「第5章 策略梯度」第 361 段(text/09-ch05.txt:361,搜「在性能上的提升」)。原书把它列为引理 5.1,并注明出自 Kakade 等人 2002 年的工作。 2

  6. 出处:「第5章 策略梯度」第 414 段(text/09-ch05.txt:414,搜「这个近似虽然看似粗糙」)。原文说的是:直接用旧策略的状态分布去近似新策略的状态分布。 2

  7. 出处:「第5章 策略梯度」第 426 段(text/09-ch05.txt:426,搜「可以合理地被作为一个优化目标」)与第 427 段(text/09-ch05.txt:427,搜「散度的约束下优化」)。定理 5.1 里那个常数,原书写明「和新策略无关」。另外要注意:定理里用的是最大 KL,而实际优化时书里换成了平均 KL。 2 3

  8. 出处:「第5章 策略梯度」第 455 段(text/09-ch05.txt:455,搜「Hessian 矩阵」)。原文把 H 定义为「平均 KL 散度」的 Hessian 矩阵。

  9. 出处:「第5章 策略梯度」第 474 段(text/09-ch05.txt:474,搜「也被称为 Fisher 信息矩阵」)与第 476 段(text/09-ch05.txt:476,搜「它对于再参数化是不变的」)。这一整段是原书的「注 5.3」,末尾让读者去看 Amari 1998 年那篇讲自然梯度的论文。 2 3 4 5

  10. 出处:「第5章 策略梯度」第 655 段(text/09-ch05.txt:655,搜「Ea∼πold」)。这是 5.9 节推导链(式 5.45 到 5.48)的最后一步,把平均 KL 的二阶导化成了「对数机会的梯度与它自己的外积」在旧策略下的平均。

  11. 出处:「第5章 策略梯度」第 359 段(text/09-ch05.txt:359,搜「信赖域策略优化算法」)与第 427 段(text/09-ch05.txt:427,搜「散度的约束下优化」)。原书注明 TRPO 出自 Schulman 等人 2015 年的工作。 2

  12. 出处:「第5章 策略梯度」第 438 段(text/09-ch05.txt:438,搜「我们利用目标函数的一阶近似和约束」)、第 465 段(text/09-ch05.txt:465,搜「易见这个问题的解析解存在」)与第 471 段(text/09-ch05.txt:471,搜「我们使用共轭梯度算法来近似」)。 2 3 4

  13. 出处:「第5章 策略梯度」第 504 段(text/09-ch05.txt:504,搜「这在实际应用中一般代价十分昂贵」)。这是原书 5.8 节开头的脚注 5。

  14. 出处:「第5章 策略梯度」第 480 段(text/09-ch05.txt:480,搜「TRPO 的实现较为复杂」)与第 481 段(text/09-ch05.txt:481,搜「共轭梯度法来近似」)。

  15. 出处:「第18章 深度强化学习应用实践技巧」第 127 段(text/24-ch18.txt:127,搜「基于信赖域的方法可」)、第 130 段(text/24-ch18.txt:130,搜「它需要用共轭梯度来近似 Fisher 信息矩阵」)与第 136 段(text/24-ch18.txt:136,搜「无法较好地扩展到大规模的网络」)。原书还给了一条操作建议:把批尺寸一直增大,直到智能体有稳定进步的学习表现为止。 2 3

  16. 出处:「第5章 策略梯度」第 496 段(text/09-ch05.txt:496,搜「PPO 直接优化它的正则化版本」)。原书注明 PPO 出自 Schulman 等人 2017 年的工作,并说它「用一个更简单有效的方法来强制」新旧策略相似。

  17. 出处:「第5章 策略梯度」第 544 段(text/09-ch05.txt:544,搜「都有一个相对应的」)、第 545 段(text/09-ch05.txt:545,搜「使用一个适应性的」)、第 546 段(text/09-ch05.txt:546,搜「通过检验 KL 散度的值来决定」)与第 583 段(text/09-ch05.txt:583,搜「dtarget」)。算法 5.23 里那两个自适应参数原书写作 a = 1.5、b = 2:KL 小于目标值除以 1.5 时系数除以 2,大于目标值乘 1.5 时系数乘 2。 2 3 4

  18. 出处:「第5章 策略梯度」第 548 段(text/09-ch05.txt:548,搜「直接剪断用于策略梯度的目标函数」)与第 550 段(text/09-ch05.txt:550,搜「经验表明」)。 2 3

  19. 出处:「第5章 策略梯度」第 554 段(text/09-ch05.txt:554,搜「这个版本的算法被称为 PPO-Clip」)、第 588 段(text/09-ch05.txt:588,搜「取截断的目标函数和未截断的目标函数中较小的一方」)与第 589 段(text/09-ch05.txt:589,搜「更新保持在可控范围内」)。

  20. 出处:「第5章 策略梯度」第 593 段(text/09-ch05.txt:593,搜「降低 TRPO 计算负担的另一个方法」)。原书注明 ACKTR 出自 Wu 等人 2017 年的工作,K-FAC 出自 Grosse 等人 2016 与 Martens 等人 2015。 2

  21. 出处:「第5章 策略梯度」第 657 段(text/09-ch05.txt:657,搜「分块」)。原文写明:矩阵的每一块对应神经网络每一层的 Fisher 信息矩阵。

  22. 出处:「第5章 策略梯度」第 660 段(text/09-ch05.txt:660,搜「外积」)。原文的观察是:某一层的梯度是「对这一层输出的梯度」与「这一层输入」的外积,由此那个二阶量可以写成两个小矩阵的 Kronecker 乘积。 2

  23. 出处:「第5章 策略梯度」第 681 段(text/09-ch05.txt:681,搜「需要对两个维度为」)与第 683 段(text/09-ch05.txt:683,搜「不做详细解释」)。原书给的两个复杂度分别是输入宽度与输出宽度三次方的乘积,和它们三次方的和。 2 3 4

  24. 补充(不在书里,依据我们的 book 书架):PPO 后来成了大语言模型对齐的默认选择,而这本书完全没有这一段。依据: shelf=ai-book-reference/the-rlhf-book-reinforcement-learning-from#05-policy-gradient-ppo.md 事实=那一章按优势的正负把同一条截断规则分成六种情况逐一走查,并明写「信任区内 PPO 与朴素策略梯度没有任何区别」。