乐读窝

深度学习

乐读窝 > 文学理论 > 深度学习

19.4 变分推断和变分学习

书籍名:《深度学习》    作者:伊恩.古德费洛



我们已经说明过了为什么证据下界(ν,θ,q)是log  p(ν;θ)的一个下界,如何将推断看作关于分布q最大化的过程,以及如何将学习看作关于参数θ最大化的过程。我们也讲到了EM算法在给定了分布q的条件下能够进行大学习步骤,而基于MAP推断的学习算法则是学习一个p(h|ν)的点估计而非推断整个完整的分布。在这里我们介绍一些变分学习中更加通用的算法。

变分学习的核心思想就是在一个关于q的有约束的分布族上最大化。选择这个分布族时应该考虑到计算的难易度。一个典型的方法就是添加分布q如何分解的假设。

一种常用的变分学习的方法是加入一些限制使得q是一个因子分布:

这被称为均值场(mean-field)方法。更一般地说,我们可以通过选择分布q的形式来选择任何图模型的结构,通过选择变量之间相互作用的多少来灵活地决定近似程度的大小。这种完全通用的图模型方法被称为结构化变分推断(structured  variational  inference)(Saul  and  Jordan,1996)。

变分方法的优点是,我们不需要为分布q设定一个特定的参数化形式。我们设定它如何分解,之后通过解决优化问题来找出在这些分解限制下最优的概率分布。对离散型潜变量来说,这意味着我们使用传统的优化技巧来优化描述分布q的有限个变量。对连续型潜变量来说,这意味着我们使用一个被称为变分法的数学分支工具来解决函数空间上的优化问题。然后决定哪一个函数来表示分布q。变分法是“变分学习”或者“变分推断”这些名字的来因,尽管当潜变量是离散时变分法并没有用武之地。当遇到连续型潜变量时,变分法不需要过多地人工选择模型,是一种很有用的工具。我们只需要设定分布q如何分解,而不需要去猜测一个特定的能够精确近似原后验分布的分布q。

因为(ν,θ,q)被定义成log  p(ν;θ)−DKL(q(h|ν)‖p(h|ν;θ)),我们可以认为关于q最大化的问题等价于(关于q)最小化DKL(q(h|ν)‖p(h|ν))。在这种情况下,我们要用q来拟合p。然而,与以前的方法不同,我们使用KL散度的相反方向来拟合一个近似。当我们使用最大似然估计来用模型拟合数据时,我们最小化DKL(pdata‖pmodel)。如图3.6所示,这意味着最大似然鼓励模型在每一个数据达到高概率的地方达到高概率,而基于优化的推断则鼓励了q在每一个真实后验分布概率低的地方概率较小。这两种基于KL散度的方法都有各自的优点与缺点。选择哪一种方法取决于在具体每一个应用中哪一种性质更受偏好。在基于优化的推断问题中,从计算角度考虑,我们选择使用DKL(q(h|ν)p(h|ν))。具体地说,计算DKL(q(h|ν)p(h|ν))涉及计算分布q下的期望。所以通过将分布q设计得较为简单,我们可以简化求所需要的期望的计算过程。KL散度的相反方向需要计算真实后验分布下的期望。因为真实后验分布的形式是由模型的选择决定的,所以我们不能设计出一种能够精确计算DKL(p(h|ν)q(h|ν))的开销较小的方法。



19.4.1 离散型潜变量


关于离散型潜变量的变分推断相对来说比较直接。我们定义一个分布q,通常分布q的每个因子都由一些离散状态的可查询表格定义。在最简单的情况中,h是二值的并且我们做了均值场假定,分布q可以根据每一个hi分解。在这种情况下,我们可以用一个向量来参数化分布q,的每一个元素都代表一个概率,即。

在确定了如何表示分布q以后,我们只需要优化它的参数。在离散型潜变量模型中,这是一个标准的优化问题。基本上分布q的选择可以通过任何优化算法解决,比如梯度下降算法。

因为它在许多学习算法的内循环中出现,所以这个优化问题必须可以很快求解。为了追求速度,我们通常使用特殊设计的优化算法。这些算法通常能够在极少的循环内解决一些小而简单的问题。一个常见的选择是使用不动点方程,换句话说,就是解关于的方程

我们反复地更新不同的元素直到满足收敛准则。

为了具体化这些描述,我们接下来会讲如何将变分推断应用到二值稀疏编码(binary  sparse  coding)模型(这里我们所描述的模型是Henniges  et  al.(2010)提出的,但是我们采用了传统、通用的均值场方法,而原文作者采用了一种特殊设计的算法)中。数学推导过程非常详细,为希望完全了解我们描述过的变分推断和变分学习高级概念描述的读者所准备。而对于并不计划推导或者实现变分学习算法的读者来说,可以放心跳过,直接阅读下一节,这并不会遗漏新的高级概念。建议那些从事二值稀疏编码研究的读者可以重新看一下第3.10节中描述的一些经常在概率模型中出现的有用的函数性质。我们在推导过程中随意地使用了这些性质,并没有特别强调它们。

在二值稀疏编码模型中,输入,是由模型通过添加高斯噪声到m个或有或无的不同成分的和而生成的。每一个成分可以是开或者关的,对应着隐藏单元h∈{0,1}m:

其中b是一个可以学习的偏置集合,W是一个可以学习的权值矩阵,β是一个可以学习的对角精度矩阵。

使用最大似然来训练这样一个模型需要对参数进行求导。我们考虑对其中一个偏置进行求导的过程:



这需要计算p(h|ν)下的期望。不幸的是,p(h|ν)是一个很复杂的分布。关于p(h,ν)和p(h|ν)的图结构可以参考图19.2。隐藏单元的后验分布对应的是关于隐藏单元的完全图,所以相对于暴力算法,变量消去算法并不能有助于提高计算期望的效率。

图19.2 包含4个隐藏单元的二值稀疏编码的图结构。(左)p(h,ν)的图结构。要注意边是有向的,每两个隐藏单元都是每个可见单元的共父。(右)p(h,ν)的图结构。为了解释共父之间的活跃路径,后验分布所有隐藏单元之间都有边

取而代之的是,我们可以应用变分推断和变分学习来解决这个难点。

我们可以做一个均值场近似:

二值稀疏编码中的潜变量是二值的,所以为了表示可分解的q我们假设对m个Bernoulli分布q(hi|ν)建模。表示Bernoulli分布的一种很自然的方法是使用一个概率向量,满足。为了避免计算中的误差,比如说计算时,我们对添加一个约束,即不等于0或者1。

我们将会看到变分推断方程理论上永远不会赋予为0或者1。然而在软件实现过程中,机器的舍入误差会导致0或者1的值。在二值稀疏编码的软件实现中,我们希望使用一个没有限制的变分参数向量z以及通过关系=σ(z)来获得h。因此通过使用等式logσ(zi)=−ζ(−zi)来建立sigmoid函数和softplus函数的关系,我们可以放心地在计算机上计算。

在开始二值稀疏编码模型中变分学习的推导时,我们首先说明了均值场近似的使用可以使得学习过程更加简单。

证据下界可以表示为



尽管这些方程从美学观点来看有些不尽如人意。它们展示了可以被表示为少量简单的代数运算。因此,证据下界是易于处理的。我们可以把看作难以处理的对数似然函数的一个替代。

原则上说,我们可以使用关于ν和h的梯度上升。这会成为一个推断和学习算法的完美组合。但是,由于两个原因,我们往往不这么做。第一点,对每一个ν我们需要存储。我们通常更加偏向于那些不需要为每一个样本都准备内存的算法。如果我们需要为每一个样本都存储一个动态更新的向量,使得算法很难处理几十亿的样本。第二个原因就是为了能够识别ν的内容,我们希望能够有能力快速提取特征。在实际应用场景中,我们需要在有限时间内计算出。

由于以上两个原因,我们通常不会采用梯度下降来计算均值场参数。取而代之的是,我们使用不动点方程来快速估计。

不动点方程的核心思想是,我们寻找一个关于h的局部极大点,满足。我们无法同时高效地计算所有的元素。然而,我们可以解决单个变量的问题:

我们可以迭代地将这个解应用到i=1,…,m,然后重复这个循环直到我们满足了收敛准则。常见的收敛准则包含了当整个循环所改进的L不超过预设的容差量时停止,或者是循环中改变的不超过某个值时停止。

在很多不同的模型中,迭代的均值场不动点方程是一种能够提供快速变分推断的通用算法。为了使它更加具体,我们详细地讲一下如何推导出二值稀疏编码模型的更新过程。

首先,我们给出了对的导数表达式。为了得到这个表达式,我们将式(19.36)代入到式(19.37)的左边:



为了应用固定点更新的推断规则,我们通过令式(19.43)等于0来解:

此时,我们可以发现图模型中的推断和循环神经网络之间存在着紧密的联系。具体地说,均值场不动点方程定义了一个循环神经网络。这个神经网络的任务就是完成推断。我们已经从模型描述的角度介绍了如何推导这个网络,但是直接训练这个推断网络也是可行的。有关这种思路的一些想法在第20章中有所描述。

在二值稀疏编码模型中,我们可以发现式(19.44)中描述的循环网络连接包含了根据相邻隐藏单元变化值来反复更新当前隐藏单元的操作。输入层通常给隐藏单元发送一个固定的信息,然而隐藏单元不断地更新互相传送的信息。具体地说,当两个单元的权重向量平行时,它们会互相抑制。这也是一种形式的竞争——两个解释输入的隐藏单元之间,只有一个解释得更好的才被允许继续保持活跃。在二值稀疏编码的后验分布中,均值场近似试图捕获到更多的相消解释相互作用,从而产生了这种竞争。事实上,相消解释效应会产生一个多峰值的后验分布,以至于如果我们从后验分布中采样,一些样本在一个单元是活跃的,其他的样本在另一个单元活跃,只有很少的样本能够两者都处于活跃状态。不幸的是,相消解释作用无法通过均值场中因子分布q来建模,因此建模时均值场近似只能选择一个峰值。这个现象的一个例子可以参考图3.6。

我们将式(19.44)重写成等价的形式来揭示一些深层的含义:

在这种新的形式中,我们可以将看作输入,而不是ν。因此,我们可以把第i个单元视作给定其他单元编码时给ν中的剩余误差编码。由此我们可以将稀疏编码视作一个迭代的自编码器,将输入反复地编码解码,试图在每一轮迭代后都能修复重构中的误差。

在这个例子中,我们已经推导出了每一次更新单个结点的更新规则。如果能够同时更新更多的结点,那会更令人满意。某些图模型,比如深度玻尔兹曼机,我们可以同时解出中的许多元素。不幸的是,二值稀疏编码并不适用这种块更新。取而代之的是,我们使用一种被称为衰减(damping)的启发式技巧来实现块更新。在衰减方法中,对中的每一个元素我们都可以解出最优值,然后对于所有的值都在这个方向上移动一小步。这个方法不能保证每一步都能增加,但是对于许多模型都很有效。关于在信息传输算法中如何选择同步程度以及使用衰减策略可以参考Koller  and  Friedman(2009)。



19.4.2 变分法


在继续介绍变分学习之前,我们有必要简单地介绍一种变分学习中重要的数学工具:变分法(calculus  of  variations)。

许多机器学习的技巧是基于寻找一个输入向量来最小化函数J(θ),使得它取到最小值。这个步骤可以利用多元微积分以及线性代数的知识找到满足的临界点来完成。在某些情况下,我们希望能够解一个函数f(x),比如当我们希望找到一些随机变量的概率密度函数时。正是变分法能够让我们完成这个目标。

函数f的函数被称为泛函(functional)J[f]。正如许多情况下对一个函数求关于以向量的元素为变量的偏导数一样,我们可以使用泛函导数(functional  derivative),即在任意特定的x值,对一个泛函J[f]求关于函数f(x)的导数,这也被称为变分导数(variational  derivative)。泛函J的关于函数f在点x处的泛函导数被记作。

完整正式的泛函导数的推导不在本书的范围之内。对于我们的目标而言,了解可微分函数f(x)以及带有连续导数的可微分函数g(y,x)就足够了:

为了使上述等式更加直观,我们可以把f(x)看作一个有着无穷不可数多元素的向量,由一个实数向量x表示。在这里(看作一个不完全的介绍),这种关系式中描述的泛函导数和向量的导数相同:

在其他机器学习文献中的许多结果则使用了更为通用的欧拉—拉格朗日方程(Euler-Lagrange  Equation),它能够使得g不仅依赖于f的值,还依赖于f的导数。但是在本书中我们不需要这个通用版本。

为了关于一个向量优化某个函数,我们求出了这个函数关于这个向量的梯度,然后找这个梯度中每一个元素都为0的点。类似地,我们可以通过寻找一个函数使得泛函导数的每个点都等于0,从而来优化一个泛函。

下面介绍一个该过程如何运行的例子,我们考虑寻找一个定义在上的有最大微分熵的概率密度函数。我们回过头来看一下一个概率分布P(x)的熵,定义如下:

对于连续的值,这个期望可以被看作一个积分:


我们不能简单地仅仅关于函数P(x)最大化H[p],因为那样的话结果可能不是一个概率分布。为了解决这个问题,我们需要使用一个拉格朗日乘子来添加一个分布P(x)积分值为1的约束。同样地,当方差增大时,熵也会无限制地增加。因此,寻找哪一个分布有最大熵这个问题是没有意义的。但是,在给定固定的方差σ2时,我们可以寻找一个最大熵的分布。最后,这个问题还是欠定的,因为在不改变熵的条件下一个分布可以被随意地改变。为了获得一个唯一的解,我们再加一个约束:分布的均值必须为µ。那么这个问题的拉格朗日泛函如下:

为了关于p最小化拉格朗日乘子,我们令泛函导数等于0:

这个条件告诉我们P(x)的泛函形式。通过代数运算重组上述方程,我们可以得到

我们并没有直接假设P(x)取这种形式,而是通过最小化泛函从理论上得到了这个P(x)的表达式。为了解决这个最小化问题,我们需要选择λ的值来确保所有的约束都能够满足。我们有很大的自由去选择λ。因为只要满足约束,拉格朗日关于λ这个变量的梯度就为0。为了满足所有的约束,我们可以令,从而得到

这也是当我们不知道真实的分布时,总是使用正态分布的一个原因。因为正态分布拥有最大的熵,我们通过这个假定来保证了最小可能量的结构。

当寻找熵的拉格朗日泛函的临界点并且给定一个固定的方差时,我们只能找到一个对应最大熵的临界点。那最小化熵的概率密度函数是什么样的呢?为什么我们无法发现对应着极小点的第二个临界点呢?原因是没有一个特定的函数能够达到最小的熵值。当函数把越多的概率密度加到x=µ+σ和x=µ−σ两个点上,越少的概率密度到其他点上时,它们的熵值会减少,而方差却不变。然而任何把所有的权重都放在这两点的函数的积分都不为1,不是一个有效的概率分布。所以不存在一个最小熵的概率密度函数,就像不存在一个最小的正实数一样。然而,我们发现存在一个收敛的概率分布的序列,收敛到权重都在两个点上。这种情况能够退化为混合Dirac分布。因为Dirac分布并不是一个单独的概率密度函数,所以Dirac分布或者混合Dirac分布并不能对应函数空间的一个点。所以对我们来说,当寻找一个泛函导数为0的函数空间的点时,这些分布是不可见的。这就是这种方法的局限之处。诸如Dirac分布这样的分布可以通过其他方法被找到,比如可以先猜测一个解,然后证明它是满足条件的。



19.4.3 连续型潜变量


当我们的图模型包含连续型潜变量时,仍然可以通过最大化进行变分推断和变分学习。然而,我们需要使用变分法来实现关于q(h|ν)最大化。

在大多数情况下,研究者并不需要解决任何变分法的问题。取而代之的是,均值场固定点迭代更新有一个通用的方程。如果我们做了均值场近似:

并且对任何的j≠i固定q(hj|ν),那么只需要满足分布p中任何联合分布变量的概率值不为0,我们就可以通过归一化下面这个未归一的分布

来得到最优的q(hi|ν)。在这个方程中计算期望就能得到正确的q(hi|ν)的表达式。我们只有在希望提出一种新形式的变分学习算法时才需要使用变分法来直接推导q的函数形式。式(19.56)给出了适用于任何概率模型的均值场近似。

式(19.56)是一个不动点方程,对每一个i它都被迭代地反复使用直到收敛。然而,它还包含着更多的信息。它还包含了最优解取到的泛函形式,无论我们是否能够通过不动点方程来解出它。这意味着我们可以利用方程中的泛函形式,把其中一些值当成参数,然后通过任何我们想用的优化算法来解决这个问题。

我们拿一个简单的概率模型作为例子,其中潜变量满足,可见变量只有一个ν。假设以及,我们可以积掉h来简化这个模型,结果是关于ν的高斯分布。这个模型本身并不有趣。只是为了说明变分法如何应用在概率建模之中,我们才构造了这个模型。

忽略归一化常数时,真实的后验分布如下:



在上式中,我们发现由于带有h1、h2乘积项的存在,真实的后验并不能关于h1、h2分解。

应用式(19.56),我们可以得到

从这里,我们可以发现其中我们只需要从q(h2|ν)中获得两个有效值:和。把这两项记作和,我们可以得到:

从这里,我们可以发现的泛函形式满足高斯分布。因此,我们可以得到q(h|ν)=,其中µ和对角的β是变分参数,我们可以使用任何方法来优化它。有必要再强调一下,我们并没有假设q是一个高斯分布,这个高斯的形式是使用变分法来关于分布q最大化而推导出来的。在不同的模型上应用相同的方法可能会得到不同泛函形式的分布q。

当然,上述模型只是为了说明情况的一个简单例子。深度学习中关于变分学习中连续型变量的实际应用可以参考Goodfellow  et  al.(2013f)。



19.4.4 学习和推断之间的相互作用


在学习算法中使用近似推断会影响学习的过程,反过来学习的过程也会影响推断算法的准确性。

具体来说,训练算法倾向于朝使得近似推断算法中的近似假设变得更加真实的方向来适应模型。当训练参数时,变分学习增加

对于一个特定的ν,对于q(h|ν)中概率很大的h,它增加了p(h|ν);对于q(h|ν)中概率很小的h,它减小了p(h|ν)。

这种行为使得我们做的近似假设变得合理。如果我们用单峰值近似后验来训练模型,那么所得具有真实后验的模型会比我们使用精确推断训练模型获得的模型更接近单峰值。

因此,估计变分近似对模型的破坏程度是很困难的。存在几种估计log  p(ν)的方式。通常我们在训练模型之后估计log  p(ν;θ),然后发现它和(ν,θ,q)的差距是很小的。从这里我们可以得出结论,对于特定的从学习过程中获得的θ来说,变分近似是很准确的。然而我们无法直接得到变分近似普遍很准确或者变分近似几乎不会对学习过程产生任何负面影响这样的结论。为了准确衡量变分近似带来的危害,我们需要知道。≈和同时成立是有可能的。如果存在,即在θ∗点处后验分布太过复杂使得q分布族无法准确描述,那么学习过程永远无法到达θ∗。这样的一类问题是很难发现的,因为只有在我们有一个能够找到θ∗的较好的学习算法时,才能确定进行上述的比较。