深度 | 随机计算图:在随机结点中执行反向传播的新方法

百家 作者:机器之心 2017-11-10 08:51:25

选自sobolev

机器之心编译

参与:Nurhachu Null、蒋思源


本文作者曾介绍一些现代变分推理理论。这些方法经常可用于深度神经网络并构造深度生成模型(例如 VAE 等),或者使用便于探索的随机控制来丰富确定性模型。本文介绍了一种随机计算图,它将随机变量分解为其它随机变量的组合以避免 BP 算法的随机性。


所有的这些变分推理的案例都会把计算图转换成随机计算图,即之前确定的那些结点会变成随机的。不过在这些结点中做反向传播的方式并不是简单与直观的,本文将介绍一些可能的方法。这次我们会注意到,为什么通用的方法会如此糟糕,并且会看到我们在连续的例子中能够做什么。


首先,要更加正式的描述一下这个问题。假设近似推理(approximate inference)的学习目标如下:

或者是一个强化学习的目标函数:

在后面的内容中,我会使用以下标记来表示目标函数:

在该情况下,随机计算图(SCG)可以被表示成下面的形式 [1]:

这里双层圆环内的θ是可调参数的集合,蓝色的菱形是可以取随机值的随机点,但是它们的分布会依赖于θ(或许是通过一些复杂的已知函数来得到,例如神经网络),橙色的圆圈内的函数 f(x) 是我们要最大化的值。为了使用这种随即图估计得到 F(θ),你只需要使用θ去计算 x 的分布,我们可能需要尽可能多的样本为每一个 x 计算出 f(x),然后再求 f(x) 的均值。


那么如何最大化它呢?现代深度学习使用的方法是随机梯度下降(或者是我们例子中使用的梯度上升方法),如果想在我们的例子中应用这种方法,我们所需要做的就是估计(最好具有无偏性和有效性)目标函数关于θ的梯度∇F(θ)。这对任何一个有一定的微积分基础的人来说是不太难的:

在上式中,我们先采集一些 x 的样本(x∼p(x∣θ)),并用这些样本计算得到 f(x),然后将结果和对数密度的梯度相乘,这就是真实梯度的无偏估计了。然而,在实际中人们发现这种估计(被称作得分函数估计,或者在强化学习文献中被称作 REINFORCE)会有较大的方差,会使得对高维的 x 而言不太现实。


注意一下估计器,它并没有使用 f 的梯度信息,所以它不能给出任何关于如何移动 p(x|θ) 使得 F(θ) 有更高期望的指导。此外,它还使用了很多随机的 x,对每一个都选择了应该使得它更有可能的方向,并通过 f(x) 的大小来衡量这些方向。当求取平均值之后,这就会给出一个能够最大化目标函数的方向,但是很难仅仅使用较少的样本就能随机碰到好的 x(尤其是在训练的早期,或者是在高维空间里),所以方差会比较大。


这就表现出了对能够改善这个估计器方差的其他方法的需求,或者是不同的更加有效的估计方法。在下面的内容中我们会给出这两方面的解释。


参数重新设置的技巧


当意识到前面提及的局限性后,Kingm 等人在变分自编码器的论文中使用了一个聪明的小技巧(https://arxiv.org/abs/1312.6114)。基本思路如下:如果一些随机变量可以被分解成其他随机变量的组合,那我们是否能够将随机计算图进行这种分解变换,以避免通过随机的方式进执行反向传播,这是否就如同通过独立的噪声向模型注入随机的属性。


结果是肯定的。也就是说,对于任何高斯随机变量 x∼N(μ,σ^2),我们都能够将它分解成一些其他标准高斯噪声(x=μ+σε,其中 ε∼N(0,1))的仿射变换。我们在这里重新设定了参数,所以这个技巧就以此命名了。然后随机计算图(SCG)就可以表示为以下形式:

此处红色的箭头代表的是反向传播的「流」:注意我们没有遇到任何采样点,所以我们不需要使用高方差得分函数(score-function)估计器。我们甚至可以有很多由随机单元组成的层级,在参数重设之后我们不需要对所有的样本做微分,我们只需将它们混合在一起。可以看一下下面的公式:

请注意,我们在这里使用了 f 的梯度!这是这个估计器与得分函数估计器之间最关键的不同之处:在后者中,我们利用「分数」随机的方向进行了平均,同时我们还通过学习得到了一个独立噪声的仿射变换,因此经过变换的样本所在的区域具有较大的 f(x) 值。f 的梯度信息会告诉我们朝着哪里移动样本 x,然后我们通过调整 μ 和 δ 来进行这种移动。


这看起来貌似是一个不错的方法,那么为何不在每个地方都是用它呢?问题在于,即使你总能够将一个均匀分布的随机变量变换为任何其他一个,然而涉及的计算并不总是很容易实现的 [3]。对于某些分布(例如狄利克雷分布 [4]),我们甚至不知道任何把无参数随机变量变换成这种分布的转换方法。


泛化的参数重设技巧


参数重设(reparametrization)技巧可以被看成是一种将某些独立噪声变成所期望随机变量的变换 T(ε|θ)。反过来,如果 T 是可逆的,那么 T(x|θ) 逆就是一个「白噪声」/「标准噪声」的变换:它使用一些依赖于参数 θ 的随机变量,并将它们变成参数独立的随机变量。


倘若我们找到的变换方法可能无法将 x 完全变成白噪声(whiten noise),但是仍然能够减少它对 θ 的依赖性,那该怎么办呢?这就是这篇论文的思想:泛化的参数重设技巧。在那种情况下,ε 仍然依赖于 θ,但是会「弱一些」。

这里 g^rep 就是我们通常重设参数得到的梯度,g^corr 是得分函数得到的梯度。容易看到,改变变换 T 可以让你在完全重设参数梯度和完全得分函数梯度之间进行插值(interpolate)。事实上,如果 T 完全将 x 变成白噪声,那么 p(ε|θ) 就会独立于 θ,并且∇logp(ε|θ)=0,我们只能得到 g_rep。但是,如果 T 是一个恒等映射,那么∇f(T(ε∣θ))=∇f(ε)=0,我们又会恢复到得分函数估计器。


这个公式看起来很棒,但是为了从中给 ε 进行采样,我们需要了解 T(x∣θ) 逆的分布。根据从 p(x|θ) 中的采样重新用公式表达梯度会更加方便,这个我们可以通过一些代数运算完成:

在这个公式中,我们像平常一样对 x 进行采样,并把它传递到「白化噪声」变换 T(x|θ) 的逆中,来得到样本 ε,并在梯度的组成部分中替代这些变量。除了 f(x)∇logp(x∣θ),其他的所有都可以被视为一个控制变量(我们在后面会讨论这个),这个控制变量(control variate)使用 f 的梯度信息,所以它是相当强大的。


最后一个问题是,应该选择哪个变换?公式的作者建议使用常用的标准变换,即求出平均值,然后再除以标准差。这个选择是受以下几点驱动的:a) 计算方便,因为我们要使用 T 和 T 的逆 [5]; b) 这使得最先的两个时刻与θ独立,并从某种程度上导致变量会依赖于 θ。


拒绝采样(Rejection sampling)的观点 [6]


另外一个关于泛化参数重设的观点源于下面的想法:很多分布都有有效的取样器,我们能不能在采样过程中进行反向传播呢?这正是论文 Reparameterization Gradients through Acceptance-Rejection Sampling Algorithms(通过接受-拒绝算法来进行梯度的参数重设)的作者决定要解决的问题。


你想要对一些分布 p(x|θ) 进行采样,但是却不能计算并翻转(invert)它的累积分布函数(CDF),那么给怎么办呢?你可以使用拒绝采样过程。基本而言,你有一些容易从中采样的参考分布 r(x∣θ),然后找到一个缩放因子 M_θ,通过缩放之后,对于所有的 x,参考分布都要比目标参考的概率密度函数大: M_θr(x|θ)≥p(x|θ)∀x。然后你生成的点都随机地分布在 M_θr(x|θ) 曲线的下面,只需要保留(接受)那些同样分布在 p(x|θ) 曲线下面的点作为样本即可。


1. 生成 x∼r(x|θ)

2. 生成 u∼U[0,M_θr(x|θ)]

3. 如果 u>p(x|θ),从步骤 1 开始重复。否则,返回 x。


此外,我们还对样本 ε∼r(ε) 使用一些变换 T(ε|θ)(经过缩放的变换变量密度函数会大一些)。这就是 numpy 中生成 Gamma 变量的过程:如果 ε 是标准高斯分布中的样本,则通过一些 x=T(ε|θ) 的函数来对样本进行变换,然后接受服从 a(x|θ) 分布的样本即可。[7]


为了搜索导致接受与 x 对应的 ε 密度函数,我们的变换过程如下:

注意,这个概率密度是比较容易计算的,如果我们将生成的样本 ε 进行参数重设,那么我们将得到我们所寻找的 x,即 x=T(ε|θ),所以目标函数就可以表示为:

F(θ) 求关于 θ 的梯度,则:

现在我们把后面附加的这一块与前一部分的 grep 和 gcorr 做一下对比。你会看到它们是完全一样的!


在前一部分中我们选择的变换是 T 的逆,因此它一直在试图去除样本 x 对θ的依赖。这一部分允许我们从另一方面来观察同样的方法:如果你有一些独立的噪声 ε 以及一个能让样本看起来像是服从目标分布 p(x|θ) 的变换 T,那么你可以在上面加一些拒绝采样来弥补误采样,这样同样可以得到小方差的梯度估计。


一个非常简单的例子


让我们来看一下参数重设的技巧实际上让方差减小了多少,以一个简单的问题为例。我们尝试将高斯随机变量平方(x^2)的期望最小化 [8](再加上一些正的常数 c 作为偏移量,我们会在后面看到它们所起的作用):

首先,重设参数的目标函数是:

然后它的随机梯度为:

基于得分函数的梯度如下:

两个估计器都是无偏估计,但是它们的方差会怎么样呢?WolframAlpha 表明:

你能够发现,基于得分函数的梯度不仅方差总是比较大,而且随着 μ=0、σ=0(除非 c=0,μ足够小),梯度的方差还会趋于无穷大。这是因为:随着方差的变小,采样点远离均值的概率会非常小,所以基于得分函数的梯度认为应该多尝试让它们变得更加符合概率分布。


你也许会好奇,泛化重设参数是如何工作的?如果我们考虑到 [T(x|μ,σ)]^-1=x−μ的逆变换(它仅仅在一阶矩进行「白噪声化处理」),我们将得到以下的梯度估计:

这就是与 μ 对应的参数重设梯度和与 σ 对应的得分函数梯度(这里 ε∼N(0,σ^2))。我并不认为这是一个有趣的场景,所以我们会考虑看起来很奇怪的二阶矩白噪声化处理变换 [T(x|μ,σ)]^-1=x−μσ+μ,其中 T(ε|μ,σ)=σ(ϵ−μ)+μ。这种变换下的梯度可以表示如下:

你可以发现,当 σ 接近 0 的时候,梯度的幅值不在趋近于无穷大。让我们检查一下这些变量:

首先,我们可以看到,与 σ 对应的梯度的方差与重设参数的情况下的梯度方差是一样的。其次,我们可以确定,在接近最优解的时候,梯度的方差不会「爆炸」(趋于无穷大)。


  • Gen Rep 1 是只进行了一阶矩白噪声化处理的泛化参数重设。

  • Gen Rep 2 是只在二阶矩进行了白噪声化变换处理的泛化参数重设。


模拟曲线清楚地展示:基于得分函数的梯度和第一个泛化参数重设都没能成功地收敛,这和我们的方差分析是一致的。然而,第二个泛化参数重设则表现得和全参数重设一样好,即便它的方差还是比较大。


我这篇博文中涉及的工作的源代码可以在这里找到(https://gist.github.com/artsobolev/fec7c052d712889ef69656825634c4d4)。但是我要提醒你,代码相当凌乱。


总结


我们讨论了让随机变分推理在连续性隐藏变量中变得可计算的技巧。然而,我们往常都是只对连续的潜在变量模型感兴趣。例如,我们可能会对动态选择一个计算路径或另一个计算路径的模型感兴趣,这往往要控制在一个给定样本上花费的计算时间。也许在文本上训练 GAN 时,我们需要一种在鉴别器的输入上进行反向传播的新方式。


原文链接:http://artem.sobolev.name/posts/2017-09-10-stochastic-computation-graphs-continuous-case.html



本文为机器之心编译,转载请联系本公众号获得授权

✄------------------------------------------------

加入机器之心(全职记者/实习生):hr@jiqizhixin.com

投稿或寻求报道:content@jiqizhixin.com

广告&商务合作:bd@jiqizhixin.com

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接