TRPO深度拆解:为什么做后训练应该读懂TRPO

文章目录 27 节
  1. 背景知识
    1. 基本定义
    2. 策略提升原理
    3. 状态权重近似
    4. 保守策略迭代
  2. TRPO算法
    1. 总变差散度
    2. 从TV到KL散度
    3. TRPO主角登场
  3. 从理论到实践
    1. 三个变换
    2. 两种工程方案
    3. Vine模式技巧
  4. 实施流程
    1. 三个步骤
    2. 用Hessian构建FIM
    3. 为什么要算FIM
  5. 相关工作
    1. 自然梯度
    2. 标准策略梯度
    3. 其他方法对比
  6. 小结
  7. 附录
    1. ρ的期望:到底是概率还是频率?
    2. 自归一化
    3. Fisher矩阵
  8. Reference

TL;DR

TRPO 解决了强化学习中“策略更新步长难以确定”的痛点。它通过数学证明,将复杂的策略改进过程转化为一个带约束的局部优化问题。

  • 核心思想:利用 KL 散度在“概率分布空间”而非“参数数值空间”衡量更新距离。
  • 三大支柱:MM 保证单调提升、信任区域(Trust Region)确保更新稳定、共轭梯度(CG)实现高维参数的高效求解。
  • 历史地位:它是 PPO 和 GRPO 的理论基石,定义了现代 RL 对齐算法的底层逻辑。

一直想仔细读一下 TRPO 的 paper[1],每次都拖延住,这次是真的不得不上了,趁热打铁,记录一下。顺便说一句,类似 TRPO 这种 paper 是我个人非常喜欢的一类文章,写的很好,非常推荐。

TRPO 这篇论文在现代强化学习中的地位不亚于 “Attention is all you need” 在 LLM 中的地位,后续大放异彩的 PPO、GRPO 其实都是在给 TRPO 的基础上“做减法”。

比如 PPO,TRPO 计算 Fisher 矩阵和共轭梯度实现极其复杂,PPO-Clip 直接用截断把新旧策略的比值强行限制在 [1−ϵ,1+ϵ][1-\epsilon, 1+\epsilon] 之间。而 GRPO 更是把 TRPO 里的思想发挥到了极致,它依然保留了 KL 散度约束,但在去掉 Baseline 这步走的更远,直接通过分组得分来代替 Advantage 估算。

总的来说,只要符合以下三点的,基本都是 TRPO 这一脉的:

  • 重要性采样:用旧数据训练新模型,必须修正分布偏差,分子分母的比例永远是核心。
  • 信任区域 :步子不能太大,必须限制在一定范围内,否则策略直接崩溃。
  • 优势函数:不考虑绝对得分,只看当前动作是否比平均水平更好。

好了,我们开始吧。大多数策略优化算法可以归为三大类:

  • 策略迭代方法:在当前策略下估计价值函数,并据此改进策略,两者交替进行。关键是价值函数,利用价值函数先评估当前策略好不好,然后根据 value 来调整策略。比如 RLHF,更经典的 Q-Learning、Actor-Critic 等。
  • 策略梯度方法:利用从采样轨迹中获得的期望回报(总奖励)梯度的估计来更新策略。不学 value,直接看哪些动作带来高 reward,就把这些动作的概率调高,属于直接改策略,我们熟悉的 PPO、GRPO 在这里。
  • 无导数优化方法:如交叉熵方法、协方差矩阵自适应,这类方法将回报视为关于策略参数的黑箱函数进行优化。不管梯度,随机采样参数看看哪个 reward 高就往那边靠,类似进化或遗传算法。

背景知识

从理论上看,基于梯度的优化算法在样本复杂度上更优(更少的数据达到同样效果);从实践来看,监督学习中梯度方法已经被证明可以高效训练大规模模型。但在强化学习的不少任务上,尚未稳定战胜“无梯度”的随机搜索方法。本文就是针对这点,证明了:最小化某个特定的替代目标函数可以在非平凡步长(在保证策略变好的前提下,每一步更新是“有实际推进效果”的,而不是趋近于 0 的微小调整)下保证策略改进。据此,经过一系列近似后得出一个可用的算法:TRPO——具有良好可扩展性、能够优化包含数万参数的非线性策略。

基本定义

考虑一个无限时域的折扣马尔可夫决策过程,由六元组 (S,A,P,r,ρ0,γ)(S,A,P,r,ρ_0,γ) 定义:

  • SS 是有限的状态集合
  • AA 是有限的动作集合
  • P:S×A×S→RP : S \times A \times S \rightarrow \mathbb{R} 表示状态转移概率分布
  • r:S→Rr : S \rightarrow \mathbb{R} 是奖励函数
  • ρ0:S→R\rho_0 : S \rightarrow \mathbb{R} 是初始状态 s0s_0 的分布
  • γ∈(0,1)\gamma \in (0, 1) 是折扣因子

π\pi 是一个随机策略,S×A→[0,1]S \times A \rightarrow [0, 1],η(π)\eta(\pi) 是策略的期望折扣回报。

η(π)=Es0,a0,…[∑t=0∞γtr(st)], where s0∼ρ0(s0),at∼π(at∣st),st+1∼P(st+1∣st,at).(1)\begin{aligned} & \eta(\pi)=\mathbb{E}_{s_0, a_0, \ldots}\left[\sum_{t=0}^{\infty} \gamma^t r\left(s_t\right)\right], \text { where } \\ & s_0 \sim \rho_0\left(s_0\right), a_t \sim \pi\left(a_t \mid s_t\right), s_{t+1} \sim P\left(s_{t+1} \mid s_t, a_t\right) . \end{aligned} \tag{1}

Q V A 的定义如下:

Qπ(st,at)=Est+1,at+1,…[∑l=0∞γlr(st+l)]Vπ(st)=Eat,st+1,…[∑l=0∞γlr(st+l)]Aπ(s,a)=Qπ(s,a)−Vπ(s), where at∼π(at∣st),st+1∼P(st+1∣st,at) for t≥0(2)\begin{aligned} & Q_\pi\left(s_t, a_t\right)=\mathbb{E}_{s_{t+1}, a_{t+1}, \ldots}\left[\sum_{l=0}^{\infty} \gamma^l r\left(s_{t+l}\right)\right] \\ & V_\pi\left(s_t\right)=\mathbb{E}_{a_t, s_{t+1}, \ldots}\left[\sum_{l=0}^{\infty} \gamma^l r\left(s_{t+l}\right)\right] \\ & A_\pi(s, a)=Q_\pi(s, a)-V_\pi(s), \text { where } \\ & \quad a_t \sim \pi\left(a_t \mid s_t\right), s_{t+1} \sim P\left(s_{t+1} \mid s_t, a_t\right) \text { for } t \geq 0 \end{aligned} \tag{2}

这里的核心是优势函数 A,优化目标实际上是找一个新的策略 π~\tilde{\pi},使它的期望回报比旧策略更大。

  • Q 表示 ”在状态 s 采取特定动作 a “ 之后能拿多少分。
  • V 表示 ”在状态 s 按照当前策略期望水平“ 能拿多少分。注意公式里 ata_t 是随机变量。
  • A 表示 ”特定动作 a 是否比平均水平更好“。也就是说,动作 a 比正常基准好了多少。

有同学可能有疑惑,为啥要引入 V 呢,Q 不是能得到 a 的分数吗?这里主要是策略更新的稳定性考虑,如果只用 Q 更新策略会导致方差很大,减去 V 等价于将分数”归一化“,就是只看相对变化多少,这会让策略更新更加稳定。

实际工程中,也常常利用 TD 或 GAE 来近似 A(我们此前在《VAPO:基于价值方法的新突破 | 长琴[2]》等多篇文章都提到过),

Aπ(st,at)≈rt+γVπ(st+1)−Vπ(st)(3)A_{\pi}(s_t, a_t) \approx r_t + \gamma V_{\pi}(s_{t+1}) - V_{\pi}(s_t) \tag{3}

这时候只需要一个 V 网络即可推算出 Q(前两项)和 A。

策略提升原理

另一个策略 π~\tilde{\pi} 的期望回报可以表示为:在各个时间步上,相对于策略 π\pi 的优势累积和,

η(π~)=η(π)+Es0,a0,⋯∼π~[∑t=0∞γtAπ(st,at)](4)\eta(\tilde{\pi})=\eta(\pi)+\mathbb{E}_{s_0, a_0, \cdots \sim \tilde{\pi}}\left[\sum_{t=0}^{\infty} \gamma^t A_\pi\left(s_t, a_t\right)\right] \tag{4}

令 ρπ\rho_\pi 表示(未归一化,和不为 1)折扣状态访问频率(把“每个时间步访问到 s 的概率”按时间折扣加起来),

ρπ(s)=P(s0=s)+γP(s1=s)+γ2P(s2=s)+...(5)\rho_\pi(s) = P (s_0 = s)+\gamma P (s_1 = s)+ \gamma^2 P (s_2 = s)+... \tag{5}

ρπ(s)\rho_\pi(s) 就是“状态 s 对总回报的贡献权重”。于是,式(4)可写为:

η(π~)=η(π)+∑t=0∞∑sP(st=s∣π~)∑aπ~(a∣s)γtAπ(s,a)=η(π)+∑s∑t=0∞γtP(st=s∣π~)∑aπ~(a∣s)Aπ(s,a)=η(π)+∑sρπ~(s)∑aπ~(a∣s)Aπ(s,a)(6)\begin{aligned} \eta(\tilde{\pi}) & =\eta(\pi)+\sum_{t=0}^{\infty} \sum_s P\left(s_t=s \mid \tilde{\pi}\right) \sum_a \tilde{\pi}(a \mid s) \gamma^t A_\pi(s, a) \\ & =\eta(\pi)+\sum_s \sum_{t=0}^{\infty} \gamma^t P\left(s_t=s \mid \tilde{\pi}\right) \sum_a \tilde{\pi}(a \mid s) A_\pi(s, a) \\ & =\eta(\pi)+\sum_s \rho_{\tilde{\pi}}(s) \sum_a \tilde{\pi}(a \mid s) A_\pi(s, a) \end{aligned} \tag{6}

该式告诉我们,新策略 π~\tilde{\pi} 的表现 η(π~)\eta(\tilde{\pi}) 等于旧策略的表现 η(π)\eta(\pi) 加上新策略在旧策略基础上的累计优势。只要每个状态 s 上的期望优势是非负的, η\eta 一定会提升。这推出一个经典结论:即使用确定性策略(A 最大),只要存在至少一个状态-动作对具有正的优势值,并且该状态的访问概率非零,那么该更新将提升策略性能;否则算法已经收敛到最优策略。

状态权重近似

然而,由于估计误差和函数逼近误差的存在,几乎肯定存在某些状态 ss,其期望优势为负;同时,ρπ~(s)\rho_{\tilde{\pi}}(s) 对 π~\tilde{\pi} 的复杂依赖关系(双向耦合的全局依赖),使得直接优化公式 (6) 变得困难。

π→P(st∣π)→ρπ(s)→η(π)(7)\pi \rightarrow P(s_t | \pi) \rightarrow \rho_\pi(s) \rightarrow \eta(\pi) \tag{7}

看式(7)的依赖关系,我们在优化 π\pi,但 ρπ(s)\rho_{{\pi}}(s) 又是由 π 生成的——目标函数本身的“权重分布”依赖于正在优化的对象,而且这种依赖是全局全状态耦合。所以,这里需要一个近似,

Lπ(π~)=η(π)+∑sρπ(s)∑aπ~(a∣s)Aπ(s,a)(8)L_\pi(\tilde{\pi})=\eta(\pi)+\sum_s \rho_\pi(s) \sum_a \tilde{\pi}(a \mid s) A_\pi(s, a) \tag{8}

注意,ρπ~(s)\rho_{\tilde{\pi}}(s) 变为 ρπ(s)\rho_{{\pi}}(s),即用旧策略分布替换新策略分布。目标函数 L 只依赖于我们已经拥有的数据(旧策略采集到的状态),此时就变得可以计算和优化了。值得说明的是,这只是一个“局部近似”,只有当新旧策略非常接近时,这种替换才合理。

Lπθ0(πθ0)=η(πθ0),∇θLπθ0(πθ)∣θ=θ0=∇θη(πθ)∣θ=θ0(9)\begin{aligned} L_{\pi_{\theta_0}}\left(\pi_{\theta_0}\right) & =\eta\left(\pi_{\theta_0}\right), \\ \left.\nabla_\theta L_{\pi_{\theta_0}}\left(\pi_\theta\right)\right|_{\theta=\theta_0} & =\left.\nabla_\theta \eta\left(\pi_\theta\right)\right|_{\theta=\theta_0} \end{aligned} \tag{9}

如式(9)所示,在起始点,近似值和真实值是相等的,它们的梯度(变化方向)也是完全一致的。就是说,如果只走极小的一步,优化 LL 就等同于优化真实的性能 η\eta。但是,**这里不知道步长应该取多大,究竟“多小才是小”?**太小了学不动,太大了直接崩了。

有同学可能会有一丝疑惑,π~(a∣s)\tilde{\pi}(a \mid s) 为啥不需要近似?这是因为 π~\tilde{\pi} 本来就是要优化的变量,LL 是关于它的函数,它是决策模型(一个深度网络),我们可以直接修改它的参数。但是 ρ\rho 是诱导出来的分布(环境反馈的结果),我们无法直接计算出改变 π\pi 后,ρ\rho 会变成什么样。换个角度看,π~(a∣s)\tilde{\pi}(a \mid s) 本来就是要变化的,这样才能学习,但 ρπ~(s)\rho_{\tilde{\pi}}(s) 算不出来,只能近似,好在在“步子迈得小”的前提下,这个近似带来的误差是可以接受的。

保守策略迭代

Sham Kakade 和 John Langford 在 2002 Approximately Optimal Approximate Reinforcement Learning[3] 中提出保守策略迭代的策略更新方法,并为策略性能提升 η\eta 给出了显式的下界。

令 πold\pi_{\text{old}} 表示当前策略,并令:

π′=arg⁡max⁡π′Lπold(π′)(10)\pi^{\prime}=\arg \max _{\pi^{\prime}} L_{\pi_{\mathrm{old}}}\left(\pi^{\prime}\right) \tag{10}

新的策略 πnew\pi_{\text{new}} 定义为如下的混合形式:

πnew(a∣s)=(1−α)πold(a∣s)+απ′(a∣s)(11)\pi_{new}(a|s) = (1 - \alpha)\pi_{old}(a|s) + \alpha\pi'(a|s) \tag{11}

新策略不是直接跳到最好的 π′\pi' 上,而是以 (1−α)(1-\alpha) 的比例保留旧策略,只挪动一点点(α\alpha)去靠近最优解,看上去非常小心翼翼。他们推导出了一个性能下界,

η(πnew )≥Lπold (πnew )−2ϵγ(1−γ)2α2 where ϵ=max⁡s∣Ea∼π′(a∣s)[Aπ(s,a)]∣(12)\begin{aligned} \eta\left(\pi_{\text {new }}\right) & \geq L_{\pi_{\text {old }}}\left(\pi_{\text {new }}\right)-\frac{2 \epsilon \gamma}{(1-\gamma)^2} \alpha^2 \\ & \text { where } \epsilon=\max _s\left|\mathbb{E}_{a \sim \pi^{\prime}(a \mid s)}\left[A_\pi(s, a)\right]\right| \end{aligned} \tag{12}

Lπold(πnew)L_{\pi_{old}}(\pi_{new}) 是我们想优化的目标(即前面讨论的那个“用旧分布算的增量”),后面那个是惩罚项,注意这个 α2\alpha^2,它意味着当步子迈得大(α\alpha 大)时,误差会以平方的速度激增。它的核心逻辑是:只要 LL 的增长(一次项速度)跑赢了惩罚项的增长(二次项速度),新策略的真实表现 η\eta 就绝对不会下降。即,在 α\alpha 非常小的时候,一次项的增长速度远快于二次项。因此,只要 α\alpha 足够小且非零,我们就一定能找到一个区间,让 η\eta 稳步上升。

ϵ\epsilon 代表了新策略 π′\pi' 相比于旧策略 π\pi 能达到的最大潜在提升幅度,它是一个“上限值”。在证明下界时,我们通常假设最坏的情况。这个 ϵ\epsilon 就是在告诉我们:即便你选了那个看起来最完美的动作 π′\pi',在环境的所有状态 ss 中,你所能获得的单步最大优势也不会超过 ϵ\epsilon。

这里找下界(最坏情况)和减 max 的逻辑是:由于新策略 π′\pi' 相比旧策略在某些状态下可能有巨大的改动(由 ϵ\epsilon 衡量),那么一旦路径发生了偏移,策略就会落入了一个之前没怎么去过、或者表现极其不稳定的状态,此时最坏的情况会有多糟?这是数学上的最坏打算——每一次路径偏移,都会导致你损失掉那个可能存在的最大优势 ϵ\epsilon。如果大家了解一点经济学,就知道 ϵ\epsilon 其实就是更新掉旧策略的“机会成本”。

惩罚项等同于风险,前面那项 LL 则是收益,惩罚项是关于步长 α\alpha 的二次方增长,收益是关于步长 α\alpha 的一次方增长。因为风险(二次项)在 α\alpha 很小时增长得非常慢,而收益(一次项)增长得很快。所以,即便我减去的是一个极其保守的、基于最大提升幅度 ϵ\epsilon 算出来的损失项,只要我步子迈得足够小(α\alpha 足够小),我依然能保证:预期的收益一定能盖过最坏情况下的损失。

TRPO 论文说它 “unwieldy and restrictive in practice”,原因是:

  • 要求新策略必须是两个策略的“线性混合”。但在深度学习中,我们通常是更新权重 θ\theta。改变 θ\theta 之后得到的 πθnew\pi_{\theta_{new}} 并不等同于这种简单的加权平均。
  • α\alpha 混合比例很难确定,而我们更习惯用 KL 散度来衡量模型参数变化前后的“距离”。

既然“线性混合”可以通过限制 α\alpha 来保证提升,那对于任何参数化的策略,只要限制新旧策略的 KL 散度足够小,是不是也能推导出一个类似的下界?TRPO 的 TR 来了。

TRPO算法

总变差散度

论文认为公式 (12) 中的策略改进下界可以推广到一般随机策略(而不仅仅是混合策略),具体做法是,用一个衡量 π\pi 与 π~\tilde{\pi} 之间差异的“距离度量”来替代 α\alpha,并相应地调整常数项。他们采用的具体距离度量是总变差散度(Total Variation Divergence),

DTV(p∥q)=12∑i∣pi−qi∣(13)D_{\mathrm{TV}}(p \| q)=\frac{1}{2} \sum_i\left|p_i-q_i\right| \tag{13}

其中 p,qp, q 是离散概率分布。直观理解,它衡量的是两个分布之间“不重合”的部分,在数学上描述了“在某个状态下,选出的动作概率变了多少”。

在强化学习的某个状态 ss 下,pp 就是旧策略 πold(a∣s)\pi_{old}(a|s),qq 就是新策略 πnew(a∣s)\pi_{new}(a|s),p−qp-q 其实是不同 action 概率的变化。求和是所有变动的总量,除以 2 是归一化操作,因为概率分布的总和恒等于 11,所以从某些动作上“挪走”了多少概率,必然会“填到”另一些动作上去,总改动量其实被算了两次。

进一步定义:

DTVmax⁡(π,π~)=max⁡sDTV(π(⋅∣s) ∥ π~(⋅∣s))(14)D^{\max}_{\mathrm{TV}}(\pi, \tilde{\pi}) = \max_{s} D_{\mathrm{TV}}(\pi(\cdot|s)\,\|\,\tilde{\pi}(\cdot|s)) \tag{14}

即在所有状态 ss 上,策略分布之间总变差散度的最大值,也就是最激进的改动。这里用最大而不是平均的原因前面提到过——我们在数学推导时需要的是“绝对安全”。

TRPO 的作者证明了一个极其重要的结论:前面那个混合比例 α\alpha,在通用的随机策略中,其实可以用 DTVmaxD_{TV}^{max} 等价替换。

定理一:我们令 α=DTVmax\alpha = D_{TV}^{max},有:

η(πnew )≥Lπold (πnew )−4ϵγ(1−γ)2α2 where ϵ=max⁡s,a∣Aπ(s,a)∣(15)\begin{aligned} \eta\left(\pi_{\text {new }}\right) & \geq L_{\pi_{\text {old }}}\left(\pi_{\text {new }}\right)-\frac{4 \epsilon \gamma}{(1-\gamma)^2} \alpha^2 \\ & \text { where } \epsilon=\max _{s,a}\left|A_\pi(s, a)\right| \end{aligned} \tag{15}

这就是论文的定理一,文中给了两种证明思路:

  • 耦合。假设有两个分布 pp(旧策略)和 qq(新策略),它们的 TV 散度是 α\alpha。数学上可以证明:可以构造一种特殊的抽样方式,使得从这两个分布里抽出的动作 aolda_{old} 和 anewa_{new} 有 1−α1-\alpha 的概率是「完全相等」的。直观来说,新旧策略虽然有点细微差别(α\alpha),但在 1−α1-\alpha 的时间里,它们的表现是一模一样的。这就在数学上把“策略更新”等价转化为了某种形式的“混合”——只要 TV 散度小,新策略在大部分时间里其实还是在走老路,只有 α\alpha 那么一点点概率会跑偏。
  • 扰动理论。我们可以把策略的变化看作是对环境动力学系统的一种「微小扰动」,原本的平衡状态是旧分布 ρπ\rho_{\pi},由于扰动(策略变了 α\alpha 那么多),系统会产生一个新的平衡状态 ρπ~\rho_{\tilde{\pi}}。

定理一告诉我们,只要约束 DTVD_{TV},神经网络就能用,就可以去用深度学习优化方法去优化LL。换句话说,只要在更新策略时能保证所有状态下动作概率的变化(TV 散度)加起来不超过 α\alpha,定理一就能保证每一次迭代都会变好。

从TV到KL散度

根据 “Asymptopia: an exposition of statistical asymptotic theory”,总变差散度与 KL 散度之间存在如下关系:

DTV(p∥q)2≤DKL(p∥q)(16)D_{TV}(p \parallel q)^2 \leq D_{KL}(p \parallel q) \tag{16}

显然,把定理一的 α\alpha 换为 KL 散度,下界依然成立,且更加保守、安全。于是可以得到:

η(π~)≥Lπ(π~)−C DKLmax⁡(π,π~),where C=4ϵγ(1−γ)2(17)\begin{aligned} \eta(\tilde{\pi}) & \ge L_{\pi}(\tilde{\pi}) - C \, D_{\mathrm{KL}}^{\max}(\pi, \tilde{\pi}), \\ & \text{where } C = \frac{4 \epsilon \gamma}{(1 - \gamma)^2} \end{aligned} \tag{17}

有同学肯定好奇,既然 TV 好好的,为啥要换成 KL 呢?主要有以下几个原因:

  • 导数友好:DTVD_{TV} 包含绝对值,求导时会遇到不连续的点。而 DKLD_{KL} 是光滑可导的,适合反向传播。
  • 信息论:KL 散度衡量的是“信息的损失”,在概率模型优化中有着天然的统治地位。
  • 二阶优化的基石:最重要的一点——KL 散度的二阶导数就是 Fisher 信息矩阵 (FIM)(可参考《Reward建模新范式:无验证RL——当模型只能相信自己,会发生什么? | 长琴[4]》)。这让 TRPO 能够利用曲率信息(自然梯度)来实现稳定的步长控制,而 TV 散度很难做到这一点。

下面的算法描述了基于公式 (17) 中策略改进下界的近似策略迭代方法:

假设我们能够精确评估所有的优势值 Aπ(s,a)A_\pi(s, a),算法能够保证生成一个单调提升的策略序列。

定义 Mi(π)=Lπi(π)−CDKLmax⁡(πi,π)M_i(\pi) = L_{\pi_i}(\pi) - C D_{KL}^{\max}(\pi_i, \pi) ,根据公式 (17),有:

η(πi+1)≥Mi(πi+1)(18)\eta(\pi_{i+1}) \geq M_i(\pi_{i+1}) \tag{18}

又有:

Mi(πi)=Lπi(πi)−CDKLmax⁡(πi,πi)=Lπi(πi)=η(πi)(19)M_i(\pi_i) = L_{\pi_i}(\pi_i) - C D_{KL}^{\max}(\pi_i, \pi_i) = L_{\pi_i}(\pi_i) = \eta(\pi_i) \tag{19}

于是有:

η(πi+1)−η(πi)≥Mi(πi+1)−Mi(πi)(20)\eta(\pi_{i+1})- \eta(\pi_i) \geq M_i(\pi_{i+1}) - M_i(\pi_i) \tag{20}

因此,每一次迭代中最大化 MiM_i,只要 Mi(πi+1)≥Mi(πi)M_i(\pi_{i+1}) \geq M_i(\pi_i),就可以保证真实目标 η\eta 单调不减。

Algorithm 1 被归类为 MM 算法(Minorization-Maximization)的一种,这类算法还包括 EM。在 MM 算法语境中,MiM_i 是“代理函数”,它在 πi\pi_i 处与 η\eta 相等,并在其他地方对 η\eta 构成一个下界(minorize)。

TRPO主角登场

前面我们是在不考虑策略参数化形式,并假设可以在所有状态上精确评估策略的前提下,讨论了策略优化问题。这小节我们将在有限样本和任意参数化形式的条件下,从理论基础出发,推导出一个可实践的算法。考虑带参数的策略 πθ(a∣s)\pi_\theta(a|s),其中 θ\theta 是参数向量,我们将对之前的记号进行“重载”,用 θ\theta 的函数来表示相关量。

式 (17) 可以写为:

η(θ)≥Lθold(θ)−C DKLmax⁡(θold,θ),where C=4ϵγ(1−γ)2(21)\begin{aligned} \eta(\theta) & \ge L_{\theta_{\text{old}}}(\theta) - C \, D_{\mathrm{KL}}^{\max}(\theta_\text{old}, \theta), \\ & \text{where } C = \frac{4 \epsilon \gamma}{(1 - \gamma)^2} \end{aligned} \tag{21}

θ=θold\theta = \theta_{\text{old}} 时取等号。

因此,通过求解如下优化问题,可以保证提升真实目标 η\eta:

max⁡θ[Lθold(θ)−C DKLmax⁡(θold,θ)](22)\max_\theta \left[L_{\theta_{\text{old}}}(\theta) - C \, D_{\mathrm{KL}}^{\max}(\theta_\text{old}, \theta) \right] \tag{22}

然而实践中,如果直接使用理论中建议的惩罚系数 CC,得到的更新步长通常会非常小,从而导致学习速度很慢。我们看,这个 CC 包含了 (1−γ)2(1-\gamma)^2 作为分母,如果折扣因子 γ=0.99\gamma = 0.99(RL 中很常见),那么分母就是 0.00010.0001,这意味着 CC 会是一个数以万计的巨大常数。其结果就是:只要新旧策略的 KL 散度稍微增加一点点,惩罚项就会迅速抵消掉所有的收益 LL。在代码里就表现为策略网络的参数几乎不敢动,学习效率极低。

为了在保持稳定性的同时实现更大的更新步长,作者提出将“惩罚项”改为“置信域约束(Trust Region Constraint)”,对新旧策略之间的 KL 散度施加约束:

max⁡θLθold(θ)subject toDKLmax⁡(θold,θ)≤δ(23)\begin{aligned} \max_{\theta} \quad & L_{\theta_{old}}(\theta) \\ \text{subject to} \quad & D_{KL}^{\max}(\theta_{old}, \theta) \leq \delta \end{aligned} \tag{23}

从原来的偏离惩罚,调整为在一个信任限制区域内找最大提升。这种处理方式被称为 TRPO (Trust Region Policy Optimization):

  • 摆脱超参敏感性:理论上的 CC 太大,手动调小又不好调。使用固定约束 δ\delta(如 DKL≤0.01D_{KL} \leq 0.01)能让超参数的物理意义更明确。
  • 允许“激进”更新:只要更新后的策略在“信任区域”内,即使它改动了参数的非线性组合,数学上依然能通过近似保证性能稳定性。

这个优化问题要求在状态空间的每一个点上,KL 散度都被限制在一个界内。这一约束来源于理论推导,但由于约束数量过多,在实际中很难直接求解。转而采用一种启发式近似方法,用平均 KL 散度来替代逐状态约束,将“最大值”替换为“期望值”。

DˉKLρ(θ1,θ2):=Es∼ρ[DKL(πθ1(⋅∣s) ∥ πθ2(⋅∣s))](24)\bar{D}^{\rho}_{\mathrm{KL}}(\theta_1, \theta_2) := \mathbb{E}_{s \sim \rho}\Big[ D_{\mathrm{KL}}\big(\pi_{\theta_1}(\cdot \mid s)\ \|\ \pi_{\theta_2}(\cdot \mid s)\big) \Big] \tag{24}

也就是说,我们不再保证“在所有状态下改动都不大”,而是保证“在平均意义上,或者说在经常遇到的状态下,改动是受限的”。

从 max⁡\max 到 E\mathbb{E} 的转变,是 TRPO 能够被写成代码的关键:

  • 采样计算:因为是期望值,我们可以通过智能体在环境中收集到的样本轨迹来估算这个平均 KL 散度。
  • 简化优化:把无数个约束合并成了一个单一的约束。在数学上允许我们使用共轭梯度法高效地求解约束优化问题。

这一步虽然在理论严谨性上退后了一小步(不再是 100% 保证单调提升),但在实用性上前进了一大步。它承认了在处理复杂 AI 模型时,我们必须用统计上的稳定性来替代绝对的局部稳定性。

最终的优化目标:

max⁡θLθold(θ)subject toDˉKLρθold(θold,θ)≤δ(25)\begin{aligned} \max_{\theta} \quad & L_{\theta_{old}}(\theta) \\ \text{subject to} \quad & \bar{D}_{KL}^{\rho_{\theta_\text{old}}}(\theta_{old}, \theta) \leq \delta \end{aligned} \tag{25}

从理论到实践

三个变换

之前的理论推导中,无论是收益函数 LL 还是 KL 散度约束,都包含了对状态分布和动作空间的期望,但在现实的任务里,状态空间通常是无限的。这部分主要介绍如何使用蒙特卡洛模拟来近似该目标函数与约束函数。

首先把式 (25) 展开(结合式 (8)):

max⁡θ∑sρθold(s)∑aπθ(a∣s) Aθold(s,a)subject toDˉKLρθold(θold,θ)≤δ.(26)\begin{aligned} \max_{\theta} \quad & \sum_{s} \rho_{\theta_{\text{old}}}(s) \sum_{a} \pi_{\theta}(a \mid s)\, A_{\theta_{\text{old}}}(s,a) \\ \text{subject to} \quad & \bar{D}_{\mathrm{KL}}^{\rho_{\theta_{\text{old}}}} (\theta_{\text{old}}, \theta) \le \delta . \end{aligned} \tag{26}

我们可以把这个求和公式拆解成三个部分:

  • ∑sρθold(s)\sum_s \rho_{\theta_{old}}(s) ,这是旧策略去过的所有状态,由于无法遍历所有 ss,实际是从 Buffer(经验回放池)里抽出旧策略跑出来的 ss。
  • ∑aπθ(a∣s)\sum_a \pi_\theta(a|s) ,在每一个状态 ss 下,新策略对所有动作 aa 的选择概率。这是我们要优化的核心变量,我们想调整策略,让它在好动作上的概率变大,坏动作上的概率变小。
  • Aθold(s,a)A_{\theta_{old}}(s, a) ,基于旧策略反馈,动作 aa 到底比平均水平好多少。如果某个动作 aa 带来的收益比旧策略的平均收益高,A 为正。

连起来看,它就是一个期望值,这个优化目标的本质是:“寻找一组新参数 θ\theta,使得在旧策略踩过的坑(ss)里,新策略倾向于选那些比旧策略表现更好(A>0A > 0)的动作。”

为了便于计算,论文做了三个变换。

第一个变换,论文将第一项替换为期望值:1(1−γ)Es∼ρθold[⋅]\frac{1}{(1 - \gamma)} \mathbb{E}_{s \sim \rho_{\theta_{\text{old}}}}[\cdot],解决“状态空间爆炸”问题,注意前面的分数是时间归一化尺度,具体可参考附录1。∑s\sum_s 要求遍历环境中的每一个可能的状态,换成期望后,我们只需要根据旧策略进行轨迹采样,用采样到的有限状态来近似整体分布。

第二个变换,论文将第三项替换为 Q,简化计算(计算 A 需要 V),且不影响梯度(和 A 最后算出来的更新方向是一样的)。因为 A(s,a)=Q(s,a)−V(s)A(s, a) = Q(s, a) - V(s)。其中 V(s)V(s) 是一个只跟状态有关、跟当前动作 aa 无关的基准,在对参数 θ\theta 求导优化时,由于 V(s)V(s) 不含 θ\theta,它在导数运算中会变成 0。

第三个变换,将动作求和 ∑a\sum_a 替换为重要性采样估算器 Ea∼q\mathbb{E}_{a \sim q},解决“连续动作空间”或“未知分布”问题。这个和状态同样的道理,如果动作空间是连续的,我们无法遍历每一个动作。而且,我们只有通过旧策略(或某个分布 qq)采样的动作数据。因为数据是用 qq 采样的,但我们要优化的是 πθ\pi_\theta,所以需要乘上一个权重 πθ(a∣s)q(a∣s)\frac{\pi_\theta(a|s)}{q(a|s)} 来修正分布不一致带来的偏差。于是,我们可以在不遍历所有动作的情况下,利用手头的采样数据来预测“如果换成新策略 πθ\pi_\theta,收益会如何”。

用 qq 表示采样分布,则单个 sns_n 对损失函数的贡献为:

∑aπθ(a∣sn)Aθold(sn,a)=Ea∼q[πθ(a∣sn)q(a∣sn)Aθold(sn,a)](27)\sum_{a} \pi_{\theta}(a|s_n) A_{\theta_{\text{old}}}(s_n, a) = \mathbb{E}_{a \sim q} \left[ \frac{\pi_{\theta}(a|s_n)}{q(a|s_n)} A_{\theta_{\text{old}}}(s_n, a) \right] \tag{27}

最终,式 (26) 等价于如下期望形式:

max⁡θEs∼ρθold,a∼q[πθ(a∣s)q(a∣s)Qθold(s,a)]subject to Es∼ρθold[DKL(πθold(⋅∣s)∥πθ(⋅∣s))]≤δ.(28)\begin{aligned} & \underset{\theta}{\operatorname{max}} \quad \mathbb{E}_{s \sim \rho_{\theta_{\text{old}}}, a \sim q} \left[ \frac{\pi_{\theta}(a|s)}{q(a|s)} Q_{\theta_{\text{old}}}(s, a) \right] \\ & \text{subject to } \mathbb{E}_{s \sim \rho_{\theta_{\text{old}}}} \left[ D_{\text{KL}}(\pi_{\theta_{\text{old}}}(\cdot|s) \parallel \pi_{\theta}(\cdot|s)) \right] \le \delta. \end{aligned} \tag{28}

剩下的工作就是将期望替换为样本平均值,并将 Q 值替换为经验估计值。

两种工程方案

关于如何通过具体的采样策略来填补数学公式中“期望值”和“Q值”的空白。作者提出了两种截然不同的数据收集方案:Single Path 和 Vine。

单路径方法比较简单,主要通过采样初始状态 s0∼ρ0s_0 \sim \rho_0 并执行旧策略 πθold\pi_{\theta_{\text{old}}} 若干个时间步,来收集状态序列,从而生成一条 (s,a)(s,a) 轨迹。q(a∣s)=πθold(a∣s)q(a|s) = \pi_{\theta_{\text{old}}}(a|s),Qθold(s,a)Q_{\theta_{\text{old}}}(s, a) 在每个状态-动作对 (st,at)(s_t, a_t) 处进行计算,具体方法是沿该轨迹对未来奖励进行折扣求和。

藤蔓方法像玩单机游戏时不停地“存读档”,主要用于策略迭代类的方法,做法是,按照某种方式确定一组状态(Rollout Set),从这组状态中的每一个状态出发,分别执行多个不同的动作进行尝试(Rollouts)。核心步骤简单概括为:

  • 生成主干轨迹。从起始状态 s0s_0 出发,用当前的旧策略 πθi\pi_{\theta_i} 跑几局游戏,生成一系列轨迹。
  • 确定“锚点”(Rollout Set)。从跑出来的轨迹中,选出 NN 个状态点,这组状态被称为“Rollout Set(分叉点集)”。
  • 多重分支尝试。对这 NN 个状态里的每一个点 sns_n,都要进行 KK 次 动作尝试,动作 an,ka_{n,k} 是根据某种采样分布 qq 选出来的。

作者特别提到了如何选择这个“尝试动作”的分布 qq:

  • 只要 qq 覆盖了策略 πθi\pi_{\theta_i} 可能选的所有动作(即包含其支撑集),算出来的估算值在数学上就是一致的(不偏的)。
  • 实践发现:
    • 连续任务(如机器人走路):直接让 q=πθiq = \pi_{\theta_i},即按照旧策略的喜好去多试几次。
    • 离散任务(如 Atari 游戏):使用均匀分布。即不再偏向旧策略,而是把所有可能的动作都平等地试一遍。探索性更强。

藤蔓方法的目的是降低 QQ 值估算的方差,不像单路径,Q 值受后面路径随机性的影响很大,藤蔓方法通过在同一个状态下反复尝试,能够非常精确地对比出在状态 sns_n 下,动作 A 是不是真的比动作 B 好,因为试了 K 次。这种方法虽然计算量大,但它能提供更高质量的数据指导策略更新(能够给出更准确的优势值估计)。

藤蔓方法的缺点在于,对模拟器的调用次数更多。而且,“从分叉点集合中的每个状态出发生成多条轨迹” 限制了该算法只能应用于可以将系统重置到任意状态的场景。相比之下,单路径方法不需要状态重置,可以直接在物理系统上实现。

表格对比如下:

单路径 藤蔓
性能 方差高,A 估算精度低 方差低,A 估算精度高
成本 低 高,计算量大
复杂度 低,无要求 高,系统必须能重置到任意状态
场景 物理世界 实验室

其实,藤蔓方法看起来有点像 BoN(Best-of-N),它本质上就是为了更准地估算那组 Prompt 的优势值,和现在的思维链采样的逻辑异曲同工。

Vine模式技巧

重点在于如何降低方差以及在不同动作空间下如何构建目标函数的估算器。

  1. 使用公共随机数 (Common Random Numbers) 降低方差

在同一状态 sns_n 下的这 KK 个不同的动作试验中,使用完全相同的随机数序列来生成环境噪声。确保不同动作之间 QQ 值的差异主要是由动作本身引起的,而不是因为某次运气好遇到了较小的噪声。

  1. 有限离散动作空间精确求和

如果动作空间很小且是有限的,不需要采样,可以直接“暴力”遍历所有可能的动作。

Ln(θ)=∑k=1Kπθ(ak∣sn)Q^(sn,ak)(29)L_n(\theta) = \sum_{k=1}^{K} \pi_{\theta}(a_k|s_n) \hat{Q}(s_n, a_k) \tag{29}

其中,动作空间 A=a1,a2,...,aKA = {a_1, a_2, . . . , a_K }。

  1. 连续/大动作空间用自归一化估算器

无法遍历,只能靠采样,文章引入自归一化重要性采样 (Self-Normalized Importance Sampling, SNIS),更多关于自归一化可参考附录2。

Ln(θ)=∑k=1Kπθ(an,k∣sn)πθold(an,k∣sn)Q^(sn,an,k)∑k=1Kπθ(an,k∣sn)πθold(an,k∣sn)(30)L_n(\theta) = \frac{\sum_{k=1}^{K} \frac{\pi_\theta(a_{n,k}|s_n)}{\pi_{\theta_{\text{old}}}(a_{n,k}|s_n)} \hat{Q}(s_n, a_{n,k})}{\sum_{k=1}^{K} \frac{\pi_\theta(a_{n,k}|s_n)}{\pi_{\theta_{\text{old}}}(a_{n,k}|s_n)}} \tag{30}

分子是标准的带权重 QQ 值求和(新旧策略概率比 ×Q\times Q),分母则是所有权重(概率比)的总和。两个工程优势:

  • 无需 Baseline:普通策略梯度通常需要减去一个 V(s)V(s) 作为基准来降低方差,但这个自归一化结构天然消除了对 Baseline 的需求。
  • 数值稳定性:即使 QQ 值整体加上一个常数,梯度的计算结果也不会改变,这让算法对奖励值的绝对大小不再敏感。有点类似 softmax 的平移不变性[5],都是利用“归一化结构消掉公共项”。不过 softmax 是概率分布本身不变,SNIS 是值会变(+常数c),但梯度不变。

总的来说,动作少用 Equation (29) 直接算,动作多/连续用 Equation (30) 采样算,并用“公共随机数”来降低方差。最后,对所有选中的状态 sns_n 取平均,就得到了最终的目标函数 LL 及其梯度,然后就可以开始更新策略参数 θ\theta 了。

实施流程

三个步骤

具体实施有三个核心步骤:

  • 数据采集:根据环境条件(是否有模拟器重置功能),选择 Single Path 或 Vine 方案。收集一系列状态-动作对 (s,a)(s, a),并计算它们对应的 QQ 值蒙特卡洛估算值。
  • 构造目标函数与约束:利用数据构造出公式 (28) 中定义的估算目标函数(预期收益提升)和平均 KL 散度约束。
  • 利用共轭梯度 (CG) 与线搜索求解:前者用来近似求解带约束的优化问题,后者在前者确定的方向上寻找最佳步长。

用Hessian构建FIM

重点看第三步,在求解约束优化问题时,我们需要知道 KL 散度随参数 θ\theta 变化的“曲率”,这个曲率由 FIM 描述。

论文通过解析计算 KL 散度的 Hessian 矩阵而非使用梯度的协方差矩阵来构建 Fisher 信息矩阵(FIM),具体来说,是:

1N∑n=1N∂2∂θi∂θjDKL(πθold(⋅∣sn)∥πθ(⋅∣sn))(31)\frac{1}{N} \sum_{n=1}^N \frac{\partial^2}{\partial \theta_i \partial \theta_j} D_{\text{KL}}(\pi_{\theta_{\text{old}}}(\cdot|s_n) \parallel \pi_{\theta}(\cdot|s_n)) \tag{31}

而不是:

1N∑n=1N∂∂θilog⁡πθ(an∣sn)∂∂θjlog⁡πθ(an∣sn)(32)\frac{1}{N} \sum_{n=1}^N \frac{\partial}{\partial \theta_i} \log \pi_{\theta}(a_n|s_n) \frac{\partial}{\partial \theta_j} \log \pi_{\theta}(a_n|s_n) \tag{32}

也就是直接对 KL 散度的公式求关于参数 θ\theta 的二阶导数(Hessian),这种方法是对每个状态 sns_n 下的所有可能动作进行解析积分,它不依赖于实际采样到了哪个动作 ana_n。而传统做法(经验 FIM)使用策略梯度的协方差矩阵来估算,这种方法依赖于实际采样出的动作。

论文指出,在大规模训练场景下,选择解析 Hessian 具有显著的计算优势,它免去了存储稠密海森矩阵或整批轨迹所有策略梯度的需求。结合共轭梯度法,可以只计算“Hessian 与向量的乘积”,而不需要显式地算出整个 Hessian 矩阵,这极大地降低了显存占用。实验结果表明,策略的改进速率与使用经验型 FIM 时相当。

为什么要算FIM

有同学可能有疑惑:为什么要算 Fisher 矩阵?原因很简单:如果不使用 Fisher 矩阵,算法可能会在某些敏感的方向上迈步过大,导致策略突然“崩溃”(改动过大导致性能骤降)。 通过引入 Fisher 矩阵,TRPO 实际上是在执行自然梯度下降(Natural Policy Gradient)的一种变体:

  • 确保了参数更新的步长是在“概率分布空间”中衡量的,而不是在“参数数值空间”中衡量的。
  • 保证了训练的稳定性和单调提升的特性。

关于 Fisher 矩阵的更多介绍,可以参考附录3。

相关工作

自然梯度

论文认为,**自然梯度 (Natural Policy Gradient, NPG)**是 TRPO 的一个特例。具体来说,如果对公式 (25) 进行简化:

  • 目标函数线性化:对代理目标函数 LL 使用线性近似。
  • 约束条件二次化:对 KL 散度约束使用二次近似(即二阶泰勒展开,引入 Fisher 信息矩阵 AA)。

就可以得到自然策略梯度:

maximize⁡θ[∇θLθold(θ)∣θ=θold⋅(θ−θold)]subject to 12(θold−θ)TA(θold)(θold−θ)≤δ,where A(θold)ij=∂∂θi∂∂θjEs∼ρπ[DKL(π(⋅∣s,θold)∥π(⋅∣s,θ))]∣θ=θold(33)\begin{aligned} & \operatorname*{maximize}_{\theta} \left[ \nabla_{\theta} L_{\theta_{\text{old}}}(\theta)|_{\theta=\theta_{\text{old}}} \cdot (\theta - \theta_{\text{old}}) \right] \\ & \text{subject to } \frac{1}{2} (\theta_{\text{old}} - \theta)^T A(\theta_{\text{old}}) (\theta_{\text{old}} - \theta) \le \delta, \\ & \text{where } A(\theta_{\text{old}})_{ij} = \\ & \qquad \frac{\partial}{\partial \theta_i} \frac{\partial}{\partial \theta_j} \mathbb{E}_{s \sim \rho_{\pi}} \left[ D_{\text{KL}}(\pi(\cdot|s, \theta_{\text{old}}) \parallel \pi(\cdot|s, \theta)) \right] |_{\theta=\theta_{\text{old}}} \end{aligned} \tag{33}

虽然 TRPO 与 NPG 在数学形式上很接近,但在更新方式上有一个细微但至关重要的区别:

  • NPG 的做法:更新公式为 θnew=θold+1λA−1∇L\theta_{new} = \theta_{old} + \frac{1}{\lambda} A^{-1} \nabla L。这里的步长 1λ\frac{1}{\lambda} 通常被当作一个算法参数(超参数)来手动调节。
  • TRPO 的做法:每一次更新时强制执行 KL 散度约束 δ\delta。这意味着步长是根据约束自动计算出来的,而不是预先设定的固定值。

尽管这种区别看起来很微妙(都是超参,一个是调 λ\lambda,一个是设 δ\delta),但实验证明:处理更复杂、规模更大的问题时,这种强制性的约束机制性能更好,而且更加鲁棒。

特性 NPG 的 λ (Penalty) TRPO 的 δ (Constraint)
控制对象 参数更新的“强度” 概率分布变化的“幅度”
物理含义 抽象的权重系数 具体的距离(KL 散度值)
直观程度 很难解释 λ=0.1\lambda=0.1 到底意味着什么 δ=0.01\delta=0.01 意味着新旧策略重合度极高
鲁棒性 差。换个环境可能就要重新调 λ\lambda 强。一个 δ\delta 往往能在多个任务中通用

从更新的角度看,对 NPG,即使 λ\lambda 固定,由于不同位置的 Fisher 矩阵 AA(即曲率)差异巨大,同样的 λ\lambda 在某些地方可能让概率分布只变了一点点,但在另一些地方(曲率平坦的地方)可能让概率分布发生巨变。对 TRPO,无论当前的 Fisher 矩阵 AA 怎么变,它都会通过计算自动调整每一步的步长,确保新旧策略的 KL 散度永远不会超过 δ\delta。

标准策略梯度

如果把 KL 散度约束换成最简单的 L2L_2 范数约束(即限制参数变化的绝对物理距离),我们就得到了标准的策略梯度(Standard Policy Gradient)。

maximizeθ[∇θLθold(θ)∣θ=θold⋅(θ−θold)]subject to 12∥θ−θold∥2≤δ.(34)\begin{align} & \underset{\theta}{\text{maximize}} \left[ \nabla_\theta L_{\theta_{\text{old}}}(\theta) \big|_{\theta=\theta_{\text{old}}} \cdot (\theta - \theta_{\text{old}}) \right] \\ & \text{subject to } \frac{1}{2} \|\theta - \theta_{\text{old}}\|^2 \le \delta. \end{align} \tag{34}

这说明标准策略梯度其实是假设参数空间的结构是平坦的(欧几里得空间),而 TRPO 认为参数空间是有曲率的(概率分布空间)。

如果完全去掉约束,直接去最大化未受限的代理目标函数 LL,那么这个过程就退化成了传统的策略迭代(Policy Iteration)。

其他方法对比

列举了其他几种方法也采用与公式 (25) 类似更新方式的方法。如下表所示:

对比方法 核心约束对象 与 TRPO 的区别
REPS 约束状态-动作的边缘分布 p(s,a)p(s, a) TRPO 约束的是条件分布 p(a∣s)p(a \mid s)
Levine & Abbeel 使用 KL 散度约束 他们的目的是为了让策略不要超出动力学模型有效的区域;而 TRPO 根本不尝试显式估算系统动力学。
Pirotta et al. 基于 Kakade 和 Langford 的成果进行泛化 虽然理论基础相似,但他们推导出的具体算法路径与 TRPO 不同。

其中:

小结

读完 TRPO,我们发现它不仅是一篇算法论文,更像是一篇“工程妥协手册”。它告诉我们,在面对复杂的神经网络和无限的状态空间时,如何通过一系列巧妙的近似(从 TV 到 KL,从 Max 到 Expectation,从 Hessian 求逆到 CG 迭代),将完美的数学定理转化为能跑在 GPU 上的代码。

虽然在今天的工业实践中,计算更简单的 PPO 抢占了一部分生态,而追求极致效率的 GRPO 正在大模型后训练方向大放异彩,但它们依然没逃出 TRPO 的三大铁律:重要性采样、信任区域和相对优势,后面出现的各种 GRPO 变体就更不用说了。

也许 TRPO 不是我们后训练的首选,但它的理论至今依然影响着每一次的大模型对齐训练。

附录

ρ的期望:到底是概率还是频率?

根据定义(式 (5)),ρπ(s)\rho_{\pi}(s) 是将每个时间步访问状态 ss 的概率进行折扣求和:

ρπ(s)=∑t=0∞γtP(st=s∣π)(27)\rho_{\pi}(s) = \sum_{t=0}^{\infty} \gamma^t P(s_t = s | \pi) \tag{27}

注意,ρπ(s)\rho_{\pi}(s) 在单个时间步是概率,但求和之后变成了“期望访问次数”(即频率的累积)。

如果我们想知道所有状态访问频率的总和,就把上面的式子对所有 ss 求和:

∑sρπ(s)=∑s(∑t=0∞γtP(st=s∣π))=∑t=0∞γt(∑sP(st=s∣π))(28)\sum_{s} \rho_{\pi}(s) = \sum_{s} \left( \sum_{t=0}^{\infty} \gamma^t P(s_t = s | \pi) \right) = \sum_{t=0}^{\infty} \gamma^t \left( \sum_{s} P(s_t = s | \pi) \right) \tag{28}

对于任何一个固定的时间步 tt,智能体一定处于某个状态 ss,因此,在该时间步 tt 下,所有状态的概率之和必然等于 1:∑sP(st=s∣π)=1\sum_{s} P(s_t = s | \pi) = 1。于是有:

∑sρπ(s)=∑t=0∞γt⋅(1)=1+γ+γ2+γ3+…(29)\sum_{s} \rho_{\pi}(s) = \sum_{t=0}^{\infty} \gamma^t \cdot (1) = 1 + \gamma + \gamma^2 + \gamma^3 + \dots \tag{29}

当 0≤γ<10 \le \gamma < 1 时,

∑sρπ(s)=∑t=0∞γt=11−γ(30)\sum_{s} \rho_{\pi}(s) =\sum_{t=0}^{\infin} \gamma^t = \frac{1}{1-\gamma} \tag{30}

当我们把 ∑sρθold(s)[… ]\sum_{s} \rho_{\theta_{old}}(s) [\dots] 变成 Es∼ρθold[… ]\mathbb{E}_{s \sim \rho_{\theta_{old}}} [\dots] 时,其实做了一个隐形的转换:它定义了一个真正的概率分布 dπ(s)=(1−γ)ρπ(s)d_{\pi}(s) = (1-\gamma)\rho_{\pi}(s),这个分布的和是 1。为了把原来的 ρ\rho 换成 dd,就必须在外面除以 (1−γ)(1-\gamma),也就是乘以 11−γ\frac{1}{1-\gamma}。

  • 原始式子:∑sρθold(s)[… ]\sum_s \rho_{\theta_{old}}(s) [ \dots ]
  • 构造 dd 分布:∑s11−γ⋅(1−γ)ρθold(s)⏟dθold(s)[… ]\sum_s \frac{1}{1-\gamma} \cdot \underbrace{(1-\gamma)\rho_{\theta_{old}}(s)}_{d_{\theta_{old}}(s)} [ \dots ]
  • 转为期望:11−γ∑sdθold(s)[… ]=11−γEs∼dθold[… ]\frac{1}{1-\gamma} \sum_s d_{\theta_{old}}(s) [ \dots ] = \frac{1}{1-\gamma} \mathbb{E}_{s \sim d_{\theta_{old}}} [ \dots ]

最后,再回答那个关键问题:ρ\rho 到底是概率还是频率?

首先,P(st=s)P(s_t = s) 是纯粹的概率、瞬时概率,它的意思是:“在第 tt 个时间步在不在状态 ss?”对于每一个固定的 tt,所有状态的概率加起来一定是 11。

ρπ(s)\rho_{\pi}(s) 则是概率的累积,也就是期望访问次数,它的意思是:“如果在某个状态 ss 停留了很多次,或者有很大概率经过它,那么这个状态的 ρ\rho 值就会很高。”它的和之所以不为 1,是因为它把所有时间步的概率堆在一起了。就好像我们每天吃饭的概率是 1,一周下来吃饭的 “总期望次数” 就是 7 次,在 γ\gamma 折扣下,这个总次数就是 ∑γt=11−γ\sum \gamma^t = \frac{1}{1-\gamma}。

自归一化

我们可以把它看作一种“加权平均数”的变体。理论上,我们的目标 Ln(θ)L_n(\theta) 是对所有动作求期望:

Ln(θ)=Ea∼πθ[Q(s,a)]L_n(\theta) = \mathbb{E}_{a \sim \pi_{\theta}} [Q(s, a)]

但我们只有从 πold\pi_{old} 采样的 KK 个动作,根据重要性采样的公式,这可以写成:

Ln(θ)=Ea∼πold[πθ(a∣s)πold(a∣s)Q(s,a)]≈1K∑k=1KwkQ(s,ak)L_n(\theta) = \mathbb{E}_{a \sim \pi_{old}} \left[ \frac{\pi_\theta(a|s)}{\pi_{old}(a|s)} Q(s, a) \right] \approx \frac{1}{K} \sum_{k=1}^K w_k Q(s, a_k)

实际采样中,简单的平均(除以 K)可能有很大问题:如果 KK 很小(比如 Vine 采样里只试了几次),这 KK 个权重 wkw_k 的加和往往不等于 1,这会导致估算值 Ln(θ)L_n(\theta) 产生巨大的偏差。比如所有采样动作的权重都很小,算出来的收益就会显得莫名其妙地低,但这可能只是因为没抽到高概率动作。

为了消除这种采样不均衡,把 K 换成权重总和:

Ln(θ)≈∑wkQk∑wkL_n(\theta) \approx \frac{\sum w_k Q_k}{\sum w_k}

公式背后有两个数学直觉:

  • 确保比例正确:强制权重分配比例为 1。这样即便采样不均匀,它关注的也是“在这几个样本中,谁的相对权重更大”。
  • 消除平移量(Baseline):如果给所有的 QQ 值都加上一个常数 CC(即 Q′=Q+CQ' = Q + C),最终分子分母系数会抵消,只剩下常数 C,梯度为 0。

Fisher矩阵

在 TRPO 中,Fisher 信息矩阵 (Fisher Information Matrix, 简称 FIM) 是用来衡量参数变化对策略分布影响程度的核心工具。

普通的梯度下降是在参数欧几里得空间里走的,但神经网络参数的改变并不等同于策略(概率分布)的改变。Fisher 矩阵描述了参数空间的“曲率”,告诉我们:在当前的参数 θ\theta 下,往哪个方向微调参数会导致概率分布发生剧烈变化,往哪个方向调整则变化较平缓。

在 TRPO 中,我们有一个核心约束:新旧策略之间的 KL 散度不能超过 δ\delta。为了高效求解这个约束,我们需要对 KL 散度进行泰勒展开,KL 散度的一阶导数在 θold\theta_{old} 处为 0(两个相同分布之间的 KL 散度梯度在参数相同时为零,当新旧策略非常接近时可以认为两者相同),二阶导数(Hessian 矩阵) 恰好就是 Fisher 信息矩阵 AA(FIM 就是 KL 的 Hessian)。因此,约束条件 DKL≤δD_{KL} \leq \delta 在局部可以近似看作一个关于参数改变量的二次型约束:12ΔθTAΔθ≤δ\frac{1}{2} \Delta \theta^T A \Delta \theta \leq \delta。

部分信息参阅:Reward建模新范式:无验证RL——当模型只能相信自己,会发生什么? | 长琴[4]

论文通过直接对 KL 散度求二阶导数来估算 AijA_{ij}。这种方法对每个状态下的动作进行了分析式集成,不依赖于具体采样到了哪个动作,因此在大规模训练中更稳定、更省显存。

Reference

[1] paper: https://arxiv.org/abs/1502.05477
[2] VAPO:基于价值方法的新突破 | 长琴: https://yam.gift/2025/04/19/NLP/LLM-Training/2025-04-19-VAPO/
[3] 2002 Approximately Optimal Approximate Reinforcement Learning: https://people.eecs.berkeley.edu/~pabbeel/cs287-fa09/readings/KakadeLangford-icml2002.pdf
[4] Reward建模新范式:无验证RL——当模型只能相信自己,会发生什么? | 长琴: https://yam.gift/2025/12/21/NLP/LLM-Training/2025-12-21-RM-New-Paradigm-Verify-Free-RL/
[5] 平移不变性: https://yam.gift/2026/02/01/NLP/LLM/2026-02-01-Flash-Attention-to-Streaming-Reduction/
[6] 2010 Relative Entropy Policy Search: https://www.ias.informatik.tu-darmstadt.de/uploads/Team/JanPeters/Peters2010_REPS.pdf
[7] 2014 Learning neural network policies with guided policy search under unknown dynamics: https://people.eecs.berkeley.edu/~svlevine/papers/mfcgps.pdf
[8] 2013 Safe policy iteration: https://proceedings.mlr.press/v28/pirotta13.html


本文已收录至 post-training-atlas —— 一份带观点、跨模态的后训练图谱与论文索引。如果你对相关话题有想法,欢迎来 Issues 拍砖。