on-policy 采样的浪费

策略梯度那章的结尾,给出了一个可用的估计量:

θJ(θ)=Eτpθ[t=1Tθlogπθ(atst)A^t]\nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim p_\theta} \left[ \sum_{t=1}^{T} \nabla_\theta \log \pi_\theta(a_t \mid s_t)\, \widehat A_t \right]

本章的全部内容,都藏在这一行的一个细节里:那个下标。期望是对从 pθp_\theta 采样出的轨迹取的,而 pθp_\theta 是由当前参数诱导出的分布。只要走一步梯度,θ\theta 就不再是生成这批数据的那个 θ\theta 了。手里的每一个样本此刻都来自错误的分布,而那个促成了这一步的估计量,没有任何依据去促成第二步。

于是这个循环是被逼出来的:采一批、走一步、把这批扔掉、再采一批。每条轨迹只支撑一次更新,然后就被丢弃。这里没有任何东西被算了两遍,也没有任何东西被浪费了两次;浪费在于,昂贵的样本只被用了一次。

有多昂贵取决于问题,而对本系列正在走向的那些领域,答案是:昂贵到足以盖过其他一切。采一个样本意味着生成一整条 token 序列,或者跑完一整条去噪链。相比之下梯度那一步是廉价的。花掉一整轮生成,只换来一步更新,这就是 on-policy 策略梯度的核心低效,也正是近端策略优化存在的理由。

所以本章要回答的问题既窄又实际:

一批轨迹能不能支撑多次梯度更新?

答案是可以,但有条件,而本章余下的部分讲的就是这个条件要付什么代价。

我们在估什么

在动采样这套机器之前,先把那个要与梯度相乘的对象讲精确是值得的,因为下面每一步都在摆弄它,而最终的目标函数会按它的符号分情形。

定义Advantage 函数

对策略 π\pi,advantage 函数是

Aπ(s,a)=Qπ(s,a)Vπ(s).A^\pi(s,a) = Q^\pi(s,a) - V^\pi(s).

两项都来自回报、价值与 Bellman 方程Qπ(s,a)Q^\pi(s,a) 是在 ss 处采取 aa、其后遵循 π\pi 的期望回报,Vπ(s)V^\pi(s) 是从 ss 出发、连第一个动作也由 π\pi 采样时的期望回报。两者之差,就是”特意采取 aa“相对于”让策略自己拿主意”多买到的那部分。

这个”相对于”不是随口一说。下面这条命题说的就是它。

命题Advantage 在自己的策略下均值为零

对每一个状态 ss

Eaπ(s)[Aπ(s,a)]=0.\mathbb{E}_{a \sim \pi(\cdot \mid s)}\big[A^\pi(s,a)\big] = 0.
证明

展开定义,把期望拆成两项:

Eaπ(s)[Aπ(s,a)]=aπ(as)[Qπ(s,a)Vπ(s)]=aπ(as)Qπ(s,a)Vπ(s)aπ(as).\mathbb{E}_{a \sim \pi(\cdot\mid s)}\big[A^\pi(s,a)\big] = \sum_a \pi(a\mid s)\big[Q^\pi(s,a) - V^\pi(s)\big] = \sum_a \pi(a\mid s)Q^\pi(s,a) - V^\pi(s)\sum_a \pi(a\mid s).

第一个求和由前面章节”由动作价值得到状态价值”那条命题,恰好是 Vπ(s)V^\pi(s)。第二个求和是 11,因为 π(s)\pi(\cdot\mid s) 是一个概率分布。于是两项都等于 Vπ(s)V^\pi(s),相消。

这就把符号的含义钉死了,而符号恰恰是 clip 目标函数唯一真正用到的性质:

  • Aπ(s,a)>0A^\pi(s,a) > 0:采取 aaπ\piss 处的平均表现更好。更新应该让 aa 更可能被采到。
  • Aπ(s,a)<0A^\pi(s,a) < 0:采取 aaπ\pi 自己的平均还差。更新应该让 aa 更不可能被采到。

因为均值恰好是零,“比平均更好”是一句 π\pi 拿自己当尺子的话。advantage 不是对一个动作的孤立评分,它是对照着正在被改进的那个策略做的比较,而且那个策略一变,它就得重算。最后这半句值得记着,它是这批样本会变馊的第二个理由。

实践中 AπA^\pi 是未知的,必须从这批数据里估计。策略梯度那章搭好了本章要继承的估计量 A^t=Gtb(st)\widehat A_t = G_t - b(s_t),取 b(st)=Vπ(st)b(s_t) = V^\pi(s_t),并在那里证明了:减去任何与动作无关的 baseline,都不会给梯度方向引入偏差。下面的内容不依赖 A^t\widehat A_t 具体怎么来,只依赖两件事:它估计的是 AπθoldA^{\pi_{\theta_{\text{old}}}},以及它带着一个符号。

重要性采样

障碍在于,期望是对错误的分布取的。而恰好有一个标准恒等式,就是为这种情形准备的。

引理重要性采样恒等式

ppqq 是同一空间上的两个分布,ff 是一个函数,且对每一个满足 p(x)f(x)0p(x)f(x) \neq 0xx 都有 q(x)>0q(x) > 0。那么

Exp[f(x)]=Exq[p(x)q(x)f(x)].\mathbb{E}_{x \sim p}\big[f(x)\big] = \mathbb{E}_{x \sim q}\left[\frac{p(x)}{q(x)}f(x)\right].
证明

把左边写成求和,再插入 q(x)/q(x)q(x)/q(x)。由支撑集条件,这个操作在每一个贡献非零项的 xx 处都是合法的:

Exp[f(x)]=xp(x)f(x)=xq(x)p(x)q(x)f(x)=Exq[p(x)q(x)f(x)].\mathbb{E}_{x\sim p}[f(x)] = \sum_x p(x)f(x) = \sum_x q(x)\,\frac{p(x)}{q(x)}\,f(x) = \mathbb{E}_{x\sim q}\left[\frac{p(x)}{q(x)}f(x)\right].

满足 p(x)f(x)=0p(x)f(x) = 0 的那些点,对两边的贡献都是零,因此无论 q(x)q(x) 取何值都可以忽略。xx 连续时求和换成积分,论证不变。

支撑集条件在操作层面意味着什么

这个条件不是装饰。按本章需要的方向来读,qq 是旧策略,pp 是新策略:新策略想采的任何动作,在旧策略下必须有过非零概率。旧策略从不提议的动作,对这个估计量而言是不可见的,无论新策略觉得它多好,因为压根不存在关于它的样本可供重加权。重用只能在已经被采样过的行为之间重新分配功劳,它无法发现新行为。对一个已经坍缩到窄动作集上的策略,这是一个真实的故障模式,也是”on-policy 方法不可能被重用无限期替代”的结构性原因。

把这个恒等式用到轨迹上,会暴露出让这一切可计算的那份运气。

命题轨迹比值中环境项相消
pθ(τ)pθold(τ)=t=1Tπθ(atst)πθold(atst)\frac{p_\theta(\tau)}{p_{\theta_{\text{old}}}(\tau)} = \prod_{t=1}^{T} \frac{\pi_\theta(a_t \mid s_t)} {\pi_{\theta_{\text{old}}}(a_t \mid s_t)}
证明

上一章的轨迹分解给出

pθ(τ)=p(s1)t=1Tπθ(atst)p(st+1st,at),p_\theta(\tau) = p(s_1)\prod_{t=1}^{T}\pi_\theta(a_t\mid s_t)\,p(s_{t+1}\mid s_t,a_t),

以及把 θ\theta 换成 θold\theta_{\text{old}} 的同一个式子。初始状态项 p(s1)p(s_1) 和每一个转移项 p(st+1st,at)p(s_{t+1}\mid s_t,a_t) 都来自环境,不带任何对策略参数的依赖,因此它们在分子分母里一模一样地出现,逐项相消,只剩下策略项。

这和”让策略梯度不需要模型就能计算”的那次相消是同一个机制,只是第二次出现、出于不同的理由。那里它消掉的是 θ\nabla_\theta 作用在智能体控制不了的项上;这里它把那些项从一个比值里消掉。两次的结论是一样的:一个看上去需要知道环境动态的量,其实不需要。

定义概率比值
rt(θ)=πθ(atst)πθold(atst)r_t(\theta) = \frac{\pi_\theta(a_t \mid s_t)} {\pi_{\theta_{\text{old}}}(a_t \mid s_t)}
定义Surrogate 目标
L(θ)=Et[rt(θ)A^t]L(\theta) = \mathbb{E}_{t}\big[r_t(\theta)\,\widehat A_t\big]

其中期望是对用 πθold\pi_{\theta_{\text{old}}} 采样出的轨迹的各时间步取的,A^t\widehat A_t 估计 Aπθold(st,at)A^{\pi_{\theta_{\text{old}}}}(s_t,a_t)

LL 之所以值得优化,是因为在采集样本的那一点上,它的梯度恰好就是上一章推出来的那个对象。

命题Surrogate 在采样点处一阶正确
θL(θ)θ=θold=θJ(θ)θ=θold\nabla_\theta L(\theta)\big|_{\theta = \theta_{\text{old}}} = \nabla_\theta J(\theta)\big|_{\theta = \theta_{\text{old}}}
证明

对比值求导,并在 θ=θold\theta = \theta_{\text{old}} 处取值。分母不依赖 θ\theta,所以

θrt(θ)θold=θπθ(atst)θoldπθold(atst)=θlogπθ(atst)θold,\nabla_\theta r_t(\theta)\Big|_{\theta_{\text{old}}} = \frac{\nabla_\theta \pi_\theta(a_t\mid s_t)\big|_{\theta_{\text{old}}}} {\pi_{\theta_{\text{old}}}(a_t\mid s_t)} = \nabla_\theta \log \pi_\theta(a_t\mid s_t)\Big|_{\theta_{\text{old}}},

最后一步是上一章那个 log-derivative 恒等式 logπ=π/π\nabla \log \pi = \nabla \pi / \pi,从右往左读。又因为 A^t\widehat A_t 不依赖 θ\theta

θL(θ)θold=Et[θlogπθ(atst)A^t]θold,\nabla_\theta L(\theta)\big|_{\theta_{\text{old}}} = \mathbb{E}_t\big[\nabla_\theta \log \pi_\theta(a_t\mid s_t)\,\widehat A_t\big]\Big|_{\theta_{\text{old}}},

这恰好就是策略梯度估计量。

Surrogate 不是目标函数

这条命题很容易被读过头。它没有说 L=JL = J,也没有说 L=J\nabla L = \nabla J。它说的是这两个梯度在某一个点上相等,即 θold\theta_{\text{old}},而对其他任何 θ\theta 它什么都没说。

这个区别是整章的枢纽。LLJJ 的一个局部替身,在这批数据被采出的那个位置上一阶精确,而它的有效期随着 θ\theta 的移动而过期。把 LL 当成”要最大化的那个东西”,而不是当成”一个在 θold\theta_{\text{old}} 附近可信、离远了就无意义的模型”,正是本章余下每一个机制所要防止的错误。

逐时间步形式里藏着的第二个近似

诚实起见,必须点出轨迹层面的恒等式与上面这个 surrogate 之间的一道缝。把重要性采样引理用到整条轨迹上,得到的权重是所有比值的乘积 trt(θ)\prod_t r_t(\theta),乘在 R(τ)R(\tau) 上。而 surrogate L(θ)L(\theta) 是在每个时间步的 advantage 上各挂一个 rt(θ)r_t(\theta)

这两者不是同一个对象。从前者走到后者,额外假设了:πθold\pi_{\theta_{\text{old}}}πθ\pi_\theta 所访问的状态分布不会偏移太多。逐时间步的形式重加权了在 sts_t 处所采取的动作,却没有重加权”根本走到 sts_t 来”这件事的概率。这个假设和上面那个一阶保证一样,都是局部的,也在同一个区域里失效,即两个策略拉开的时候。所以逐时间步 surrogate 是叠在第一个近似之上的第二个近似,而两者由同一副药来偿付。本章的论证不需要把这道缝量化,只需要注意到它和这里的一切指向同一个方向:近处安全,远处不安全。

无偏还不够

重要性采样恒等式是精确的。于是很容易得出”重用是免费的”这个结论,而这个结论是错的。恒等式等同的是两个期望,而期望是关于无穷多个样本的陈述。一批有限的数据能交出什么,取决于方差。

命题重要性采样估计量的方差

在重要性采样引理的条件下,

Varxq[p(x)q(x)f(x)]=Exp[p(x)q(x)f(x)2](Exp[f(x)])2,\operatorname{Var}_{x\sim q}\left[\frac{p(x)}{q(x)}f(x)\right] = \mathbb{E}_{x\sim p}\left[\frac{p(x)}{q(x)}f(x)^2\right] - \big(\mathbb{E}_{x\sim p}[f(x)]\big)^2,

将它与下式对照:

Varxp[f(x)]=Exp[f(x)2](Exp[f(x)])2.\operatorname{Var}_{x\sim p}\big[f(x)\big] = \mathbb{E}_{x\sim p}\big[f(x)^2\big] - \big(\mathbb{E}_{x\sim p}[f(x)]\big)^2 .
证明

qq 下的 X=(p/q)fX = (p/q)f 应用 Var[X]=E[X2](E[X])2\operatorname{Var}[X] = \mathbb{E}[X^2] - (\mathbb{E}[X])^2。第二项由引理等于 (Exq[(p/q)f])2=(Exp[f])2(\mathbb{E}_{x\sim q}[(p/q)f])^2 = (\mathbb{E}_{x\sim p}[f])^2。至于第一项,

Exq[(p(x)q(x)f(x))2]=xq(x)p(x)2q(x)2f(x)2=xp(x)p(x)q(x)f(x)2=Exp[p(x)q(x)f(x)2].\mathbb{E}_{x\sim q}\left[\left(\frac{p(x)}{q(x)}f(x)\right)^2\right] = \sum_x q(x)\frac{p(x)^2}{q(x)^2}f(x)^2 = \sum_x p(x)\,\frac{p(x)}{q(x)}\,f(x)^2 = \mathbb{E}_{x\sim p}\left[\frac{p(x)}{q(x)}f(x)^2\right].

两个式子只在一个地方不同:重加权后的估计量在二阶矩里多带了一个因子 p(x)/q(x)p(x)/q(x)。凡是新策略比旧策略放了明显更多质量的地方,这个因子就很大,而它是乘性地进入方差,同时对均值毫无贡献。

方差可以是无穷

严重程度值得直说,而不是含糊成一句”方差会变大”。那个多出来的因子是无界的:在 qq 很小但非零的点上,p/qp/q 可以任意大,所以即使 ff 有界、ppqq 都是再普通不过的分布,Ep[(p/q)f2]\mathbb{E}_p[(p/q)f^2] 也可以发散。一个估计量完全可以同时是无偏的、且方差无穷。无偏约束的是”在无穷多次抽样下它平均指向哪里”,它对”几千个样本会交给你什么”只字未提。在那个区域里,少数几个比值巨大的样本主宰了整个平均,而所谓的估计不过是长着梯度形状的噪声。

这是第一个失效。第二个已经摆在桌面上了,而且更根本。

上一节那条命题是θold\theta_{\text{old}}成立的。θ\theta 一旦离开,关于 LLJJ 的关系就什么都没被确立过。把 θ\theta 推得足够远,LL 上升不蕴含 JJ 的任何事情:优化器正在勤勤恳恳地爬一个模型,而这个模型唯一的保证是局部的,且它已经把那个局部抛在身后了。上面标出的那个逐时间步近似,按同样的时刻表、出于同样的理由一起退化。

枢纽

两个互相独立的失效,指向同一个结论。

重加权估计量的方差,随 πθ\pi_\thetaπθold\pi_{\theta_{\text{old}}} 的分离而增长。surrogate 作为 JJ 的模型,其有效性只在 θold\theta_{\text{old}} 处被保证,并随 θ\theta 离开而退化。

重用是合法的,但只在局部合法。 本章余下的每一节,都是这句话的推论:先把”局部”讲精确,再找一个廉价的办法维持它。

多近才算近:KL 散度

“待在 θold\theta_{\text{old}} 附近”还不是一条可用的指令,因为它没说在什么意义上的附近。最朴素的读法(在参数空间里靠近)恰恰是错的:θθold\lVert \theta - \theta_{\text{old}} \rVert 与”策略的行为改变了多少”之间没有固定关系。同样大小的参数位移,在参数空间的某个区域可能让策略几乎纹丝不动,在另一个区域却足以把它彻底改写。上一节那两个失效真正依赖的,是两个分布之间的分离,所以要量的就是它。

定义KL 散度

对同一空间上的分布 ppqq,且在所有 p(x)>0p(x) > 0 处都有 q(x)>0q(x) > 0

KL(pq)=Exp[logp(x)q(x)]=xp(x)logp(x)q(x).\mathrm{KL}(p \,\Vert\, q) = \mathbb{E}_{x \sim p}\left[\log \frac{p(x)}{q(x)}\right] = \sum_x p(x) \log \frac{p(x)}{q(x)}.
命题非负性

KL(pq)0\mathrm{KL}(p \Vert q) \ge 0,取等当且仅当 p=qp = q(在 pp 下几乎处处)。

证明

对凹函数 log\log 应用 Jensen 不等式:

KL(pq)=Exp[logq(x)p(x)]logExp[q(x)p(x)]=logxp(x)q(x)p(x)=logxq(x)=log1=0,-\mathrm{KL}(p\Vert q) = \mathbb{E}_{x\sim p}\left[\log \frac{q(x)}{p(x)}\right] \le \log \mathbb{E}_{x\sim p}\left[\frac{q(x)}{p(x)}\right] = \log \sum_x p(x)\frac{q(x)}{p(x)} = \log \sum_x q(x) = \log 1 = 0,

于是 KL(pq)0\mathrm{KL}(p\Vert q) \ge 0。又因为 log\log严格凹的,Jensen 取等当且仅当 q(x)/p(x)q(x)/p(x)pp 下几乎处处为常数;而 ppqq 都求和为一,这个常数只能是 11,即 p=qp = q 几乎处处。

它不是距离

KL\mathrm{KL} 叫作距离是一个值得明确拒绝的滥用,因为这个习惯会造成真实的直觉错误。它不对称:一般而言 KL(pq)KL(qp)\mathrm{KL}(p\Vert q) \neq \mathrm{KL}(q\Vert p),而且两个方向惩罚的东西不一样。它不满足三角不等式。它是一个散度:非负、恰好在对角线上为零,仅此而已。下面选定某个方向时,那是出来的,不是天经地义的。

有两个事实把它和比值连了起来,而它们其实是同一个事实。

命题比值的平均恒为一

对任意状态 ss,期望对旧策略自己的动作取,

Eaπθold(s)[r(θ)]=1.\mathbb{E}_{a \sim \pi_{\theta_{\text{old}}}(\cdot\mid s)}\big[r(\theta)\big] = 1 .
证明
Eaπθold(s)[πθ(as)πθold(as)]=aπθold(as)πθ(as)πθold(as)=aπθ(as)=1,\mathbb{E}_{a\sim\pi_{\theta_{\text{old}}}(\cdot\mid s)}\left[\frac{\pi_\theta(a\mid s)}{\pi_{\theta_{\text{old}}}(a\mid s)}\right] = \sum_a \pi_{\theta_{\text{old}}}(a\mid s)\,\frac{\pi_\theta(a\mid s)}{\pi_{\theta_{\text{old}}}(a\mid s)} = \sum_a \pi_\theta(a\mid s) = 1,

其中用到支撑集条件来相消,以及 πθ(s)\pi_\theta(\cdot\mid s) 是一个分布。

命题KL 就是负对数比值的期望
KL(πθold(s)πθ(s))=Eaπθold(s)[logr(θ)]\mathrm{KL}\big(\pi_{\theta_{\text{old}}}(\cdot\mid s) \,\Vert\, \pi_\theta(\cdot\mid s)\big) = \mathbb{E}_{a \sim \pi_{\theta_{\text{old}}}(\cdot\mid s)}\big[-\log r(\theta)\big]
证明

直接由定义:

KL(πθoldπθ)=Eaπθold[logπθold(as)πθ(as)]=Eaπθold[logπθ(as)πθold(as)]=Eaπθold[logr(θ)].\mathrm{KL}\big(\pi_{\theta_{\text{old}}} \Vert \pi_\theta\big) = \mathbb{E}_{a\sim\pi_{\theta_{\text{old}}}}\left[\log \frac{\pi_{\theta_{\text{old}}}(a\mid s)}{\pi_\theta(a\mid s)}\right] = \mathbb{E}_{a\sim\pi_{\theta_{\text{old}}}}\left[-\log \frac{\pi_\theta(a\mid s)}{\pi_{\theta_{\text{old}}}(a\mid s)}\right] = \mathbb{E}_{a\sim\pi_{\theta_{\text{old}}}}\big[-\log r(\theta)\big].
推论非负性,再证一次,这次用本章自己的记号

把上面两条命题合起来,并用 log-\log 是凸的:

KL(πθoldπθ)=E[logr]  logE[r]=log1=0.\mathrm{KL}\big(\pi_{\theta_{\text{old}}} \Vert \pi_\theta\big) = \mathbb{E}\big[-\log r\big] \ \ge\ -\log \mathbb{E}\big[r\big] = -\log 1 = 0 .

这条推论值得停一下,因为它说明:被控制的那个散度,和被 clip 的那个比值,不是两个话题。比值在旧策略下平均恰好为一;散度就是同一个比值取负对数之后的期望;而 Jensen 不等式在 E[logr]\mathbb{E}[-\log r]logE[r]-\log\mathbb{E}[r] 之间留下的那道缝,就是这个散度。一个没有移动过的策略,r1r \equiv 1,散度为零。一个移动过的策略,比值散布在一附近,而散度量的就是这份散布在对数尺度上的大小。本章对 rr 做的一切,都在间接地对 KL\mathrm{KL} 做。

关于记号

有两个滥用在文献里常见到值得点名。第一个是写 KL(θ,θ)\mathrm{KL}(\theta, \theta'),一个参数之间的散度。没有这种对象:KL\mathrm{KL} 是两个分布的泛函,而它在这里之所以是对的工具,恰恰就是因为它不能归约为索引这些分布的参数之间的距离。第二个是把状态丢掉。上面的定义是逐状态的;一个策略在每个 ss 处诱导出一对不同的动作分布,而我们关心的量是在实际访问到的状态上取平均:

KL(θold,θ)=Es[KL(πθold(s)πθ(s))].\overline{\mathrm{KL}}(\theta_{\text{old}}, \theta) = \mathbb{E}_{s}\Big[\mathrm{KL}\big(\pi_{\theta_{\text{old}}}(\cdot\mid s) \Vert \pi_\theta(\cdot\mid s)\big)\Big].

本章全程固定 KL(πθoldπθ)\mathrm{KL}(\pi_{\theta_{\text{old}}} \Vert \pi_\theta) 这个方向,旧策略在前。这不是随手定的:它是那个”期望恰好对样本真正来自的分布取”的方向,也是上面那条命题里由比值免费递过来的那个方向。

Clipping

这副药必须在维持”待在近处”的同时,仍然是一阶方法:一个梯度,不要二阶导,不要带约束的优化,在一个普通训练循环里几行代码就能写完。近端策略优化的答案是:不动优化器,改目标函数,让”走远”这件事干脆不再划算。

定义Clipped Surrogate 目标
LCLIP(θ)=Et[min(rt(θ)A^t, clip(rt(θ),1ϵ,1+ϵ)A^t)]L^{\mathrm{CLIP}}(\theta) = \mathbb{E}_t \Big[ \min\big( r_t(\theta)\,\widehat A_t, \ \operatorname{clip}\big(r_t(\theta), 1-\epsilon, 1+\epsilon\big)\,\widehat A_t \big) \Big]

其中 clip(r,a,b)=max(a,min(r,b))\operatorname{clip}(r, a, b) = \max(a, \min(r, b))ϵ\epsilon 是一个小常数,典型取 0.20.2

这个定义很紧凑,而它的行为从字面上是读不出来的。下面这条命题把它讲明。

命题clip 是一个单侧的梯度掩码

对单个样本记 Lt(θ)=min(rtA^t,clip(rt,1ϵ,1+ϵ)A^t)L_t(\theta) = \min\big(r_t\widehat A_t, \operatorname{clip}(r_t, 1-\epsilon, 1+\epsilon)\widehat A_t\big),并把它看作 rtr_t 的函数。那么在导数存在的每一处,

Ltrt={0若 A^t>0 且 rt>1+ϵ,0若 A^t<0 且 rt<1ϵ,A^t其余情形。\frac{\partial L_t}{\partial r_t} = \begin{cases} 0 & \text{若 } \widehat A_t > 0 \text{ 且 } r_t > 1+\epsilon,\\ 0 & \text{若 } \widehat A_t < 0 \text{ 且 } r_t < 1-\epsilon,\\ \widehat A_t & \text{其余情形。} \end{cases}
证明

依次考虑 A^t\widehat A_t 的两种符号,并在每种符号下考虑 rtr_t 的三个区域。

A^t>0\widehat A_t > 0。当 rt>1+ϵr_t > 1+\epsilon,clip 返回 1+ϵ1+\epsilon,而乘以一个正的 A^t\widehat A_t 保序,故 rtA^t>(1+ϵ)A^tr_t \widehat A_t > (1+\epsilon)\widehat A_tmin\min 选中 (1+ϵ)A^t(1+\epsilon)\widehat A_t,它对 rtr_t 是常数,导数为 00。当 rt[1ϵ,1+ϵ]r_t \in [1-\epsilon, 1+\epsilon],clip 返回 rtr_t,两个参数都是 rtA^tr_t\widehat A_t,导数为 A^t\widehat A_t。当 rt<1ϵr_t < 1-\epsilon,clip 返回 1ϵ1-\epsilon,而 rtA^t<(1ϵ)A^tr_t \widehat A_t < (1-\epsilon)\widehat A_tmin\min 选中未 clip 的 rtA^tr_t\widehat A_t,导数为 A^t\widehat A_t

A^t<0\widehat A_t < 0。乘以一个负数会反序,于是选择结果对调。当 rt<1ϵr_t < 1-\epsilonrtA^t>(1ϵ)A^tr_t\widehat A_t > (1-\epsilon)\widehat A_tmin\min 选中 (1ϵ)A^t(1-\epsilon)\widehat A_t,常数,导数为 00。当 rt[1ϵ,1+ϵ]r_t \in [1-\epsilon,1+\epsilon],两个参数都是 rtA^tr_t\widehat A_t,导数为 A^t\widehat A_t。当 rt>1+ϵr_t > 1+\epsilonrtA^t<(1+ϵ)A^tr_t\widehat A_t < (1+\epsilon)\widehat A_tmin\min 选中未 clip 的 rtA^tr_t\widehat A_t,导数为 A^t\widehat A_t

把六种情形收拢即得结论;导数不存在的地方只有两个折点 rt{1ϵ,1+ϵ}r_t \in \{1-\epsilon, 1+\epsilon\}

摆成一张表,这个结构比从代数里读出来要容易看:

rt<1ϵr_t < 1-\epsilonrt[1ϵ,1+ϵ]r_t \in [1-\epsilon,\, 1+\epsilon]rt>1+ϵr_t > 1+\epsilon
A^t>0\widehat A_t > 0A^t\widehat A_tA^t\widehat A_t0\mathbf{0}
A^t<0\widehat A_t < 00\mathbf{0}A^t\widehat A_tA^t\widehat A_t

六格里恰好两格梯度消失,而它们是同一格换了身衣服。A^t>0\widehat A_t > 0 时,更新想抬高 πθ(atst)\pi_\theta(a_t\mid s_t),也就是抬高 rtr_t;一旦 rtr_t 被抬过 1+ϵ1+\epsilon,梯度就关掉。A^t<0\widehat A_t < 0 时,更新想压低概率,也就是压低 rtr_t;一旦 rtr_t 跌破 1ϵ1-\epsilon,梯度就关掉。两种情形里,一旦这个样本已经朝它想去的方向被挪动了超过 ϵ\epsilon 的幅度,目标函数就不再为继续挪动付钱。

另外四格才是理解这东西为什么能成立的关键。

min 是干什么的

不对称是 min 做出来的,而把它去掉会以一种很容易被忽略的方式破坏整个方法。

考虑 A^t>0\widehat A_t > 0rtr_t 远低于 1ϵ1-\epsilon 的情形:一个好动作的概率塌了下去,也许是被共享参数的其他样本压下去的。一个不套 min 的裸 clip\operatorname{clip} 在这里会返回 1ϵ1-\epsilon,一个常数,梯度为零。优化器将无法修复这个损害。而有了 min,这一格选中的是未 cliprtA^tr_t\widehat A_t,梯度以全部强度流过。

所以这个目标函数在一个方向上放行、在另一个方向上无动于衷:它从不阻止一个样本朝 rt=1r_t = 1 走回来,而一旦样本越过带外,它就不再推它。min 正是让这个掩码成为单侧的、而不是双侧冻结的那样东西。

为什么叫「近端」

注意这个机制没有做什么。它没有把 rtr_t 投影回 [1ϵ,1+ϵ][1-\epsilon, 1+\epsilon],没有拒绝任何一步,也没有求解任何带约束的问题。它移除的是离开这个带的动机,办法是让目标函数在带外变平。走远不是被禁止,只是无利可图。

这个区别听起来像个技术细节,而它其实就是本章最后一节的全部主题。

算法

一切装配起来,就是一个比 REINFORCE 多一层的循环:一个内层循环,把同一批数据反复花掉。

算法 1 使用 clip 目标的 PPO

Require: 初始策略参数 θ\theta,clip 宽度 ϵ\epsilon,epoch 数 KK,步长 α\alpha

1:repeat

2:θoldθ\theta_{\text{old}} \gets \theta // 冻住这批数据所来自的分布

3:运行 πθold\pi_{\theta_{\text{old}}},采集一批轨迹 D\mathcal{D}

4:D\mathcal{D} 的每个时间步计算 A^t\widehat{A}_t

5:for k1k \gets 1 to KK do

6:for all minibatch BDB \subseteq \mathcal{D} do

7:θθ+αθLCLIP(θ;B)\theta \gets \theta + \alpha \nabla_\theta L^{\mathrm{CLIP}}(\theta; B)

8:end for

9:end for

10:until 收敛

典型取值是 KK331010 之间,ϵ=0.2\epsilon = 0.2

第 1 步是本章全部论证兑现的地方。冻住 θold\theta_{\text{old}},就固定了”这批数据被认为来自哪个分布”,而它在整整 KK 个 epoch 里保持冻结,同时 θ\theta 正从它身边走开。内层循环刚开始时 θ=θold\theta = \theta_{\text{old}},于是处处 rt=1r_t = 1,第一次更新恰好就是上一章那个策略梯度步。此后每一次更新都是重用,用比值付账,由 clip 看管。循环结束时刷新 θold\theta_{\text{old}},这批数据被丢弃。

收益就是那个因子 KK。一轮生成现在支撑 KK 个 epoch 的更新而不是一次,而在一个生成主导成本的场景里,这接近于挂钟时间上的 KK 倍。

clip 到底保证了什么

到这里为止装配出来的故事很整齐:重用需要局部性,局部性由 KL\mathrm{KL} 度量,而 clip 把比值保持在一附近的一个带里。最后这一步里究竟有多少是真的,值得讲精确,因为那个整齐的版本是假的,而且流传甚广。

clip 并不约束比值

clip 目标并没有把 rtr_t 约束在 [1ϵ,1+ϵ][1-\epsilon, 1+\epsilon] 里。它做不到:LCLIPL^{\mathrm{CLIP}} 是一个目标函数,不是一个约束集,而上面那条命题只说了它关于该样本自己那个比值的导数在带外消失。

参数是共享的。真正被施加的梯度是对整个 minibatch 求和,

θLCLIP=Et[Ltrtθrt(θ)],\nabla_\theta L^{\mathrm{CLIP}} = \mathbb{E}_t\left[\frac{\partial L_t}{\partial r_t}\,\nabla_\theta r_t(\theta)\right],

而一个自身 Lt/rt\partial L_t/\partial r_t 已被掩成零的样本,它的 rtr_t 照样在动,因为 minibatch 里其他每一个样本都在拉扯同一个 θ\theta。把一个样本的梯度掩掉,阻止的是目标函数继续它出去;这对它被邻居捎带出去毫无作用。而且任何地方都没有东西会把一个跑偏的比值投影回来:一旦 rtr_t 到了带外,clip 唯一的反应就是不再关心。

于是在 KK 个 epoch 的 minibatch 更新之后,比值漂出带外是家常便饭,而 KL(θold,θ)\overline{\mathrm{KL}}(\theta_{\text{old}}, \theta) 不被 ϵ\epsilon 的任何函数所约束。

这对”本章该怎么读”的后果值得不加掩饰地说出来。PPO 的信赖域读法,即 ϵ\epsilon 划出一个把策略关在里面的区域,是一个关于目标函数形状的故事,不是一个关于算法行为的定理。真的那部分更弱,但仍然有用:clip 移除了大幅策略改变的回报,于是优化器没有动机去寻求它们,而实践中比值大多数时候待在一附近,大多数时候。“没有动机去做”和”做不到”之间的这道缝,正是为什么各种实现都在训练时监控 KL\overline{\mathrm{KL}}、并在它涨得太大时提前中止内层循环。假如 clip 真做到了人们通常描述的那件事,这道保险就是多余的。

诚实的总结

PPO 拿了一个精确的恒等式(重要性采样),它许可了重用,代价是一个随策略分离而增长的方差,外加一个只在单点上被保证精度的 surrogate。然后它用一个逐样本、单侧、一阶的梯度掩码去控制这个分离,而这个掩码什么也不保证。而它运转得很好。

这不是叙述上的缺陷。这就是 PPO 本身:一个有着出色实证记录的启发式,穿着一件它并未实现的信赖域外衣。一个能准确说出哪些部分是定理(恒等式、方差公式、一阶重合、梯度掩码)、哪些部分是指望(指望这个掩码能让 KL\mathrm{KL} 保持小)的读者,比一个被告知了整齐版本的读者更懂 PPO。

拓展:惩罚变体

提出 PPO 的那篇论文给了两种把策略留在 πθold\pi_{\theta_{\text{old}}} 附近的办法,本章只展开了其中一种。另一种把 clip 换成一个显式的惩罚项:

LKLPEN(θ)=Et[rt(θ)A^t]βKL(θold,θ),L^{\mathrm{KLPEN}}(\theta) = \mathbb{E}_t\big[r_t(\theta)\widehat A_t\big] - \beta\, \overline{\mathrm{KL}}(\theta_{\text{old}}, \theta),

其中 β\beta 在迭代之间自适应:测得的 KL\overline{\mathrm{KL}} 超过目标就调大,低于目标就调小。它是这个想法更直接的表达,因为它惩罚的恰好就是前面几节识别出来的那个量,而且它不假装”约束住一个比值就等于约束住一个散度”。

但它不是这个领域最后选定的那个。clip 变体在原论文的对比里表现更好,也更好调(一个常数,而不是一个带目标值和调整规则的控制器),而后续工作说 PPO 时基本上都是指 clip 目标。惩罚变体在这里作为一个指针而非一个话题:想要它的读者可以在原论文和 Easy RL 第 5.2.1 节里找到。

延伸阅读

本章假设了策略梯度恒等式、log-derivative 技巧、轨迹分解,以及 advantage 估计量,它们都来自策略梯度;还假设了回报、价值与 Bellman 方程里的价值函数。

这里引入的 KL\mathrm{KL} 散度,会在讲偏好类方法的那几章里作为一个承重对象、而不是一个诊断指标再次出现:那时候,一个针对固定参考策略(而不是针对上一次迭代)的惩罚项,会成为被优化的目标本身的一部分。

参考资料