赞
踩
关于变分自编码器的教程
作者:Carl Doersch
卡内基梅隆大学/加州大学伯克利分校
2016年8月16日,2021年1月3日进行了非常小的修订
摘要
仅在三年内,变分自编码器(VAE)已经成为无监督学习复杂分布的最受欢迎方法之一。VAE吸引人之处在于它们建立在标准函数逼近器(神经网络)之上,并且可以通过随机梯度下降进行训练。VAE已经在生成多种复杂数据方面显示出前景,包括手写数字[1, 2]、面孔[1, 3, 4]、家庭号码[5, 6]、CIFAR图像[6]、物理场景模型4、分割[7]和从静态图像预测未来[8]。本教程介绍了VAE背后的直觉,解释了它们的数学原理,并描述了一些实证行为。无需事先了解变分贝叶斯方法。
关键词:变分自编码器、无监督学习、结构化预测、神经网络
“生成建模”是机器学习的一个广泛领域,涉及对定义在某些潜在高维空间X中的数据点X上的分布P(X)进行建模。例如,图像是一种我们可能会创建生成模型的数据。每个“数据点”(图像)有成千上万个维度(像素),生成模型的任务是以某种方式捕捉像素之间的依赖关系,例如,邻近像素具有相似的颜色,并且组织成对象。具体来说,“捕捉”这些依赖关系意味着什么取决于我们想用模型做什么。一种简单的生成模型允许我们计算P(X)的数值。在图像的情况下,看起来像真实图像的X值应该有高概率,而看起来像随机噪声的图像应该有低概率。然而,这样的模型不一定有用:知道一个图像不可能有助于我们合成一个可能的图像。
相反,人们通常关心的是生成更多类似于数据库中已有数据的例子,但不是完全相同的例子。我们可以从一个原始图像的数据库开始,合成新的、未见过的图像。我们可能会收集一组3D模型,比如植物,并生成更多这些模型来填充视频游戏中的森林。我们可以收集手写文本并尝试生成更多手写文本。像这样的工具可能对图形设计师有用。我们可以通过说我们得到根据某些未知分布Pgt(X)分布的例子X来正式化这个设置,我们的目标是学习一个可以采样的模型P,使得P尽可能类似于Pgt。
训练这种类型的模型一直是机器学习社区的一个长期问题,传统上,大多数方法都有三个主要缺点之一。首先,它们可能需要对数据结构的强假设。其次,它们可能会做出严重的近似,导致次优模型。或者第三,它们可能依赖于计算昂贵的推理过程,如马尔可夫链蒙特卡罗。最近,一些工作在通过反向传播训练神经网络作为强大函数逼近器方面取得了巨大进展[9]。这些进展催生了有希望的框架,这些框架可以使用基于反向传播的函数逼近器来构建生成模型。
其中最受欢迎的框架之一是变分自编码器[1, 3],本教程的主题。该模型的假设较弱,并且通过反向传播训练速度快。VAE确实做出了一个近似,但这个近似引入的误差在高容量模型下可以说是很小的。这些特性促成了它们的快速普及。
本教程旨在对VAE进行非正式介绍,而不是正式的科学论文。它面向可能对生成模型有用的人,但可能没有强大的变分贝叶斯方法和“最小描述长度”编码模型的背景知识。本教程最初是为UC伯克利和卡内基梅隆的计算机视觉阅读小组准备的演讲,因此有偏向视觉受众的倾向。欢迎提出改进建议。
当训练生成模型时,维度之间的依赖关系越复杂,模型越难训练。以生成手写字符的图像为例。为了简化起见,假设我们只关心建模数字0-9。如果字符的左半部分包含数字5的左半部分,那么右半部分不能包含数字0的左半部分,否则该字符显然不会像任何真实的数字。从直觉上讲,如果模型在为任何特定像素分配值之前,先决定要生成哪个字符,那将会有所帮助。这种决策被正式称为潜在变量。也就是说,在我们的模型绘制任何东西之前,它首先从集合[0, …, 9]中随机抽取一个数字值z,然后确保所有笔画都匹配该字符。z被称为“潜在的”,因为仅根据模型生成的字符,我们不一定知道生成该字符的潜在变量的设置。我们需要使用计算机视觉等方法来推断。
在我们能够说我们的模型代表我们的数据集之前,我们需要确保在数据集中的每个数据点X都有一个(或多个)潜在变量的设置,使得模型生成的东西与X非常相似。正式地说,假设我们有一个在高维空间Z中可以轻松采样的潜在变量向量z,其概率密度函数(PDF)为P(z)定义在Z上。然后,假设我们有一族由向量θ参数化的确定性函数f(z; θ),其中f: Z × Θ → X。f是确定性的,但如果z是随机的而θ是固定的,那么f(z; θ)是空间X中的随机变量。我们希望优化θ,使得我们可以从P(z)中采样z,并且高概率地,f(z; θ)将像我们数据集中的X。
为了在数学上明确这一概念,我们的目标是最大化每个训练集中X在整个生成过程中出现的概率,根据:
[P(X) = \int P(X|z; θ)P(z)dz.]
这里,f(z; θ)被替换为分布P(X|z; θ),它允许我们通过使用全概率公式明确地表达X对z的依赖。该框架背后的直觉——称为“最大似然”——是,如果模型可能生成训练集样本,那么它也可能生成类似的样本,并且不可能生成不相似的样本。在VAE中,这个输出分布通常是高斯分布,即,P(X|z; θ) = N(X|f(z; θ), σ²*I)。也就是说,它的均值是f(z; θ),协方差等于单位矩阵I乘以某个标量σ(这是一个超参数)。这种替换对于形式化某些z需要生成仅像X的样本的直觉是必要的。一般来说,尤其是在训练初期,我们的模型不会生成与任何特定X完全相同的输出。通过具有高斯分布,我们可以使用梯度下降(或任何其他优化技术)通过使f(z; θ)逐渐接近某个z的X来增加P(X),即逐渐使生成模型下的训练数据更加可能。如果P(X|z)是一个狄拉克δ函数,就像我们确定性地使用X=f(z; θ)一样,这将不可能!请注意,输出分布不必是高斯分布:例如,如果X是二元的,那么P(X|z)可能是由f(z; θ)参数化的伯努利分布。重要的属性只是P(X|z)可以被计算,并且在θ上是连续的。从此以后,我们将省略f(z; θ)中的θ以避免混乱。
VAE的数学基础实际上与经典的自编码器,如稀疏自编码器[10, 11]或去噪自编码器[12, 13]没有太多关系。VAE大致最大化公式1,根据图1所示的模型。它们被称为“自编码器”,仅仅是因为从这个设置派生的最终训练目标确实有一个编码器和一个解码器,并且类似于传统的自编码器。与稀疏自编码器不同,通常没有类似稀疏惩罚的调参参数。与稀疏和去噪自编码器不同,我们可以直接从P(X)中采样(无需执行如[14]中的马尔可夫链蒙特卡罗)。
解决公式1时,VAE必须处理两个问题:如何定义潜在变量z(即,决定它们表示什么信息),以及如何处理对z的积分。VAE对这两个问题都给出了明确的答案。
首先,我们如何选择潜在变量z,以便捕获潜在信息?回到我们的数字示例,模型在开始绘制数字之前需要做出的“潜在”决策实际上相当复杂。它不仅需要选择数字,还需要选择绘制数字的角度、笔画宽度以及抽象的风格属性。更糟糕的是,这些属性可能是相关的:如果一个人写得更快,可能会导致更倾斜的数字,这也可能导致笔画变细。理想情况下,我们希望避免手动决定z的每个维度编码的信息(尽管我们可能希望手动指定某些维度的信息4)。我们还希望避免明确描述z的各个维度之间的依赖关系,即潜在结构。VAE采用了一种不寻常的方法来处理这个问题:它们假设z的维度没有简单的解释,而是断言可以从一个简单的分布中抽取z的样本,即,N(0, I),其中I是单位矩阵。如何实现这一点呢?关键是注意到,在d维空间中的任何分布都可以通过将一组d个正态分布的变量映射到一个足够复杂的函数来生成。例如,假设我们想构造一个值在环上的2D随机变量。如果z是2D且正态分布,g(z) = z/10 + z/||z||大致呈环形,如图2所示。因此,只要提供强大的函数逼近器,我们可以简单地学习一个函数,将我们的独立、正态分布的z值映射到模型可能需要的任何潜在变量,然后将这些潜在变量映射到X。实际上,回忆P(X|z; θ) = N(X|f(z; θ), σ²*I)。如果f(z; θ)是一个多层神经网络,那么我们可以想象该网络使用其前几层将正态分布的z映射到具有正确统计特性的潜在值(如数字身份、笔画宽度、角度等)。然后,它可以使用后几层将这些潜在值映射到一个完全渲染的数字。一般来说,我们不需要担心确保潜在结构的存在。如果这种潜在结构有助于模型准确再现(即最大化)训练集,那么网络将在某一层学习该结构。
现在剩下的就是最大化公式1,其中P(z) = N(z|0, I)。在机器学习中,如果我们可以找到一个可计算的P(X)公式,并且可以对该公式求导,那么我们可以使用随机梯度上升来优化模型。概念上计算P(X)的近似值实际上是简单的:我们首先抽取大量z值样本{z1, …, zn},然后计算P(X) ≈ 1/n Σi P(X|zi)。这里的问题是在高维空间中,n可能需要非常大才能获得P(X)的准确估计。为了理解这一点,请考虑我们的手写数字示例。假设我们的数字数据点存储在像素空间中,在28x28图像中,如图3所示。由于P(X|z)是各向同性的高斯分布,X的负对数概率与f(z)和X之间的平方欧几里得距离成比例。假设图3(a)是我们试图找到P(X)的目标(X)。生成图3(b)所示图像的模型可能是一个糟糕的模型,因为该数字不像一个2。因此,我们应该设置高斯分布的σ超参数,使得这种错误的数字不贡献于P(X)。另一方面,生成图3©所示图像(与X相同,但向下和向右移动了半个像素)的模型可能是一个好的模型。我们希望这个样本能贡献于P(X)。然而,不幸的是,我们不能两者兼得:X和图3©之间的平方距离为0.2693(假设像素值在0和1之间),但X和图3(b)之间的平方距离仅为0.0387。这里的教训是,为了拒绝像图3(b)这样的样本,我们需要设置非常小的σ,使得模型需要生成与X显著更相似的东西!即使我们的模型是一个准确的数字生成器,我们可能需要抽取成千上万个数字样本才能生成一个与图3(a)中2足够相似的数字。
使用抽样来计算公式1时,有没有捷径?在实际操作中,对于大多数z,P(X|z)几乎为零,因此对P(X)的估计几乎没有贡献。变分自编码器的关键思想是尝试抽样可能产生X的z值,并仅从这些值计算P(X)。这意味着我们需要一个新函数Q(z|X),它可以获取X的值并给我们一个z值分布,这些z值可能产生X。希望在Q下可能的z值空间比在先验P(z)下可能的z值空间要小得多。例如,这使我们可以相对容易地计算Ez~Q[P(X|z)]。然而,如果z是从任意分布Q(z)中抽样的,而不是N(0, I),那这对我们优化P(X)有什么帮助呢?我们首先需要的是将Ez~Q[P(X|z)]与P(X)联系起来。稍后我们会看到Q是如何得出的。
Ez~Q[P(X|z)]与P(X)之间的关系是变分贝叶斯方法的基石之一。我们从定义P(z|X)和任意Q(z)之间的Kullback-Leibler散度(KL散度或D)开始:
[ D[Q(z)‖P(z|X)] = E_{z~Q} [\log Q(z) - \log P(z|X)] ]
通过应用贝叶斯规则对P(z|X)进行操作,我们可以将P(X)和P(X|z)引入这个等式:
[ D[Q(z)‖P(z|X)] = E_{z~Q} [\log Q(z) - \log P(X|z) - \log P(z)] + \log P(X) ]
这里,(\log P(X))被移出了期望,因为它不依赖于z。两边取负,重新排列,并将部分E_{z~Q}项收缩成KL散度项得出:
[ \log P(X) - D[Q(z)‖P(z|X)] = E_{z~Q} [\log P(X|z)] - D[Q(z)‖P(z)] ]
注意,X是固定的,Q可以是任意分布,不仅仅是一个能很好地将X映射到能产生X的z的分布。既然我们对推断P(X)感兴趣,那么构造一个依赖于X的Q是合理的,特别是一个使D[Q(z|X)‖P(z|X)]小的Q:
[ \log P(X) - D[Q(z|X)‖P(z|X)] = E_{z~Q} [\log P(X|z)] - D[Q(z|X)‖P(z)] ]
这个等式作为变分自编码器的核心,值得花些时间来思考它的意义。简而言之,左边是我们要最大化的量:(\log P(X))(加上一个误差项,这使Q产生的z可以重现给定的X;如果Q是高容量的,这个项将变小)。右边是我们可以通过随机梯度下降来优化的项,给定适当的Q选择。注意,这个框架——特别是公式5的右边——突然采取了类似自编码器的形式,因为Q在将X“编码”成z,而P在将其“解码”以重建X。我们稍后将详细探讨这种联系。
那么我们如何对公式5的右边进行随机梯度下降?首先,我们需要更具体地说明Q(z|X)的形式。通常的选择是说Q(z|X) = N(z|μ(X; ϑ), Σ(X; ϑ)),其中μ和Σ是可以从数据中学习的任意确定性函数(我们将在后面的公式中省略ϑ)。实际上,μ和Σ再次通过神经网络实现,并且Σ被限制为对角矩阵。这种选择的优势在于计算,因为它们使得如何计算右边变得清晰。最后一项——D[N(μ0, Σ0)‖N(μ1, Σ1)]——现在是两个多变量高斯分布之间的KL散度,可以封闭形式计算为:
[ D[N(μ0, Σ0)‖N(μ1, Σ1)] = \frac{1}{2} \left( tr(Σ1^{-1}Σ0) + (μ1 - μ0)^T Σ1^{-1} (μ1 - μ0) - k + \log\left( \frac{det Σ1}{det Σ0} \right) \right) ]
其中k是分布的维度。在我们的情况下,这简化为:
[ D[N(μ(X), Σ(X))‖N(0, I)] = \frac{1}{2} \left( tr(Σ(X)) + μ(X)^T μ(X) - k - \log det(Σ(X)) \right) ]
公式5右边的第一项稍微复杂一些。我们可以用抽样来估计E_{z~Q}[log P(X|z)],但得到一个好的估计需要通过f传递许多z样本,这将是昂贵的。因此,正如在随机梯度下降中标准做法,我们取一个z样本,并将该z的log P(X|z)作为E_{z~Q}[log P(X|z)]的近似。毕竟,我们已经在不同的X样本上进行随机梯度下降了。从数据集D中抽样的完整公式是:
[ E_{X~D} [log P(X) - D[Q(z|X)‖P(z|X)]] = E_{X~D} [E_{z~Q} [log P(X|z)] - D[Q(z|X)‖P(z)]] ]
如果我们对这个公式求梯度,可以将梯度符号移入期望值内。因此,我们可以从分布Q(z|X)中抽取单个X和单个z值,并计算以下函数的梯度:
[ log P(X|z) - D[Q(z|X)‖P(z)] ]
然后我们可以对任意多个X和z样本的梯度进行平均,结果收敛到公式8的梯度。
然而,公式9存在一个重大问题。E_{z~Q}[log P(X|z)]不仅取决于P的参数,还取决于Q的参数。然而,在公式9中,这种依赖关系消失了!为了使VAE工作,必须驱使Q生成P可以可靠解码的X代码。换句话说,这个网络在公式9中的描述类似于图4(左)所示的网络。该网络的前向传递工作正常,如果输出在许多X和z样本上取平均,产生的预期值是正确的。然而,我们需要通过一个从Q(z|X)抽样z的层反向传播误差,这是一个不连续操作,没有梯度。通过反向传播处理随机输入没问题,但处理网络中的随机单元不行!解决方案如1中所述的“重参数化技巧”,将抽样移到输入层。给定μ(X)和Σ(X)——Q(z|X)的均值和协方差——我们可以通过先抽样ε ~ N(0, I),然后计算z = μ(X) + Σ^{1/2}(X) * ε,从N(μ(X), Σ(X))中抽样。因此,我们实际求梯度的公式是:
[ E_{X~D} \left[ E_{ε~N(0, I)}[log P(X|z = μ(X) + Σ^{1/2}(X) * ε)] - D[Q(z|X)‖P(z)] \right] ]
如图4(右)所示。注意,这些期望值没有一个依赖于我们的模型参数,因此我们可以安全地在保持等式的前提下将梯度符号移入它们。也就是说,给定一个固定的X和ε,这个函数在P和Q的参数上是确定的和连续的,这意味着反向传播可以计算出适用于随机梯度下降的梯度。值得指出的是,“重参数化技巧”仅在我们可以通过评估函数h(η, X)来从Q(z|X)中抽样时才有效,其中η是来自非学习分布的噪声。此外,h必须在X上是连续的,以便我们可以通过它进行反向传播。这意味着Q(z|X)(因此P(z))不能是离散分布!如果Q是离散的,那么对于固定的η,要么h需要忽略X,要么在某个点上h(η, X)会从Q的样本空间中的一个可能值“跳跃”到另一个,即,不连续。
在测试时,当我们想生成新样本时,我们只需将z ~ N(0, I)的值输入到解码器中。也就是说,我们移除“编码器”,包括改变z分布的乘法和加法操作。这种(非常简单的)测试时网络如图5所示。
假设我们想评估一个测试样本在模型下的概率。这通常是不可计算的。然而,D[Q(z|X)‖P(z|X)]为正,这意味着公式5的右侧是P(X)的下界。由于对z的期望值需要抽样,因此这个下界仍然不能完全闭合形式计算。然而,从Q中抽样z比从N(0, I)中抽样z收敛得更快,如第2节所述。因此,这个下界可以作为评估模型捕获特定数据点X的效果的一个有用工具。
到现在为止,希望您已经相信VAEs的学习是可行的,并且它优化了我们整个数据集上的类似log P(X)的东西。然而,我们并没有精确地优化log P(X),所以这一节旨在更深入地探讨目标函数实际在做什么。我们将讨论三个主题。首先,我们问优化D[Q(z|X)‖P(z|X)]而不是log P(X)引入了多少误差。其次,我们从信息论的角度描述VAE框架——特别是公式5的右侧——将其与基于最小描述长度的其他方法联系起来。最后,我们调查VAE是否有类似稀疏自编码器中的稀疏惩罚的“正则化参数”。
该模型的可行性依赖于我们的假设,即Q(z|X)可以建模为具有均值μ(X)和方差Σ(X)的高斯分布。P(X)在分布上收敛到真实分布的条件是D[Q(z|X)‖P(z|X)]趋近于零。不幸的是,确保这种情况发生并不简单。即使我们假设μ(X)和Σ(X)具有任意高的容量,后验分布P(z|X)对于我们用来定义P的任意f函数来说不一定是高斯分布。对于固定的P,这可能意味着D[Q(z|X)‖P(z|X)]永远不会为零。然而,好消息是,给定足够高容量的神经网络,有许多f函数可以使我们的模型生成任何给定的输出分布。任何这些函数都可以同样好地最大化log P(X)。因此,我们只需要一个f函数,它既最大化log P(X),又使得P(z|X)对于所有X来说是高斯分布。如果是这样,D[Q(z|X)‖P(z|X)]将拉动我们的模型朝着该分布的参数化方向。因此,是否存在这样一个函数来近似我们可能想要的所有分布?目前还没有人证明这一点,但事实证明,可以证明只要σ相对于真实分布的CDF的曲率很小(至少在1D情况下),这样的函数确实存在。在实际操作中,这样的小σ可能会导致现有机器学习算法出现问题,因为梯度会变得非常不平衡。然而,知道VAE在至少这种情况下具有零近似误差是令人安心的。这一事实表明未来的理论工作可能会告诉我们VAEs在更实际设置中的近似误差有多大。(我认为有可能将附录A中的证明技巧扩展到多维,但这留待未来工作。)
从信息论的角度看公式5的右侧是另一种重要的方法,特别是激发了许多VAE前身(如Helmholtz Machines [16]、Wake-Sleep算法[17]、深度信念网络[18]和玻尔兹曼机[19])的“最小描述长度”原则。-log P(X)可以被视为使用理想编码构建给定X所需的总位数。公式5的右侧将其视为两步构建X的过程。我们首先使用一些位来构建z。回想一下,KL散度的单位是比特(更准确地说是nats)。具体来说,D[Q(z|X)‖P(z)]是将来自P(z)的非信息样本转换为来自Q(z|X)的样本所需的期望信息量(KL散度的“信息增益”解释)。也就是说,它衡量了当z来自Q(z|X)而不是P(z)时我们关于X获得的额外信息量(有关更多详细信息,请参见[20, 21]的“bits back”论点)。在第二步中,P(X|z)衡量在理想编码下从z重建X所需的信息量。因此,总位数(-log P(X))是这两步的总和,减去Q作为次优编码的惩罚(D[Q(z|X)‖P(z|X)])。
从公式5来看,将D[Q(z|X)‖P(z)]视为正则化项是有趣的,就像稀疏自编码器中的稀疏正则化[10]。从这个角度来看,VAE是否有任何“正则化参数”是有趣的。也就是说,在稀疏自编码器目标中,我们有一个λ正则化参数,其目标函数如下所示:
[ |φ(ψ(X)) - X|^2 + λ|ψ(X)|_0 ]
其中ψ和φ分别是编码器和解码器函数,|·|_0是L0范数,鼓励编码是稀疏的。这个λ必须手动设置。
然而,变分自编码器通常没有这样的正则化参数,这很好,因为这意味着编程人员需要调整的参数更少。然而,对于某些模型,我们可以使其看起来像存在这样的正则化参数。人们可能会认为这个参数可以通过将z ~ N(0, I)改为类似z’ ~ N(0, λ * I)来得到,但事实证明,这并不会改变模型。为了说明这一点,请注意,我们可以通过用f’(z’) = f(z’/λ)、μ’(X) = μ(X) * λ和Σ’(X) = Σ(X) * λ²来吸收这个常数。这将产生一个目标函数,其值(公式5的右侧)与我们使用z ~ N(0, I)时的损失值相同。此外,用于采样X的模型将是相同的,因为z’/λ ~ N(0, I)。
然而,还有另一个地方可以出现正则化参数。回想一下,对于连续数据的输出分布,好的选择是P(X|z) ~ N(f(z), σ² * I)(对于我们提供的某个σ)。因此,log P(X|z) = C - 1/2 |X - f(z)|²/σ²(其中C是一个不依赖于f的常数,可以在优化过程中忽略)。当我们写出完整的优化目标时,σ出现在公式5的右边第二项中,但不在第一项中;从这个意义上说,我们选择的σ行为类似于控制两项权重的λ。注意,存在这个参数依赖于我们对给定z的X的分布选择。如果X是二进制的并且我们使用伯努利输出模型,那么这个正则化参数消失,并且唯一恢复它的方法是使用像复制X维度这样的技巧。从信息论的角度来看,这是有意义的:当X是二进制时,我们可以实际计算编码X所需的位数,并且公式5右侧的两项使用相同的单位来计算这些位。然而,当X是连续的时,每个样本包含无限的信息。我们选择的σ决定了我们期望模型重建X的精度,这是必要的,以便信息内容变得有限。
让我们回到生成手写数字的示例。假设我们不仅希望生成新数字,而且希望将数字添加到某个人书写的现有字符串中。这类似于计算机图形学中的一个实际问题,称为填补漏洞:给定一个用户删除不需要对象的现有图像,目标是用看起来合理的像素填充这个漏洞。两个问题的一个重要难点是,合理输出的空间是多模态的:下一个数字或外推像素有许多可能性。标准回归模型在这种情况下会失败,因为训练目标通常会惩罚单个预测与真实值之间的距离。面对这样的问题,回归器能够产生的最佳解决方案是介于可能性之间的某种东西,因为它最小化了期望距离。
在数字的情况下,这很可能看起来像一个没有意义的模糊,既包括所有可能的数字,又包括所有可能的风格。我们需要的是一个算法,它可以接受一个字符串或图像,并生成一个复杂的、多模态的分布,我们可以从中抽样。进入条件变分自编码器(CVAE)[7, 8],它通过简单地在整个生成过程中以输入为条件来修改前一节中的数学公式。CVAEs允许我们解决输入到输出的映射是多对一的问题,而不需要我们明确地指定输出分布的结构。
给定输入X和输出Y,我们希望创建一个模型P(Y|X),它最大化真实值的概率(我为这里重新定义X感到抱歉。然而,标准机器学习符号将X映射到Y,所以我也会这样做)。我们通过引入潜在变量z ~ N(0, I)来定义模型,这样:
[ P(Y|X) = N(f(z, X), \sigma^2 * I) ]
其中f是一个可以从数据中学习的确定性函数。我们可以通过对X进行条件化来重写公式2到公式5,如下所示:
[ D[Q(z|Y, X)‖P(z|Y, X)] = E_{z~Q(·|Y, X)} [\log Q(z|Y, X) - \log P(z|Y, X)] ]
[ D[Q(z|Y, X)‖P(z|Y, X)] = E_{z~Q(·|Y, X)} [\log Q(z|Y, X) - \log P(Y|z, X) - \log P(z|X)] + \log P(Y|X) ]
[ \log P(Y|X) - D[Q(z|Y, X)‖P(z|Y, X)] = E_{z~Q(·|Y, X)} [\log P(Y|z, X)] - D[Q(z|Y, X)‖P(z|X)] ]
注意,由于我们的模型假设在测试时z独立于X抽样,因此P(z|X)仍然是N(0, I)。这个模型的结构如图6所示。
在测试时,我们可以通过简单地从分布P(Y|X)中抽样z ~ N(0, I)来抽样。
使用Caffe实现这些示例,可以在以下网址找到: GitHub
为了展示VAE框架的分布学习能力,让我们在MNIST上训练一个变分自编码器。为了展示框架不依赖于初始化或网络结构,我们不使用现有的已发表的VAE网络结构,而是改编了Caffe自带的基本MNIST自编码器示例(然而,我们使用ReLU非线性[9]和ADAM[23],因为两者都是加速收敛的标准技术)。尽管MNIST是实值的,但它在0和1之间,所以我们使用Sigmoid交叉熵损失来计算P(X|z)。这具有概率解释:想象我们通过独立地抽样每个维度为X’来创建一个新数据点X’,使得X’_i ~ Bernoulli(X_i)。交叉熵衡量X’的期望概率。因此,我们实际上是在建模X’,即MNIST的随机二值化版本,但我们仅给q一个数据总结X。尽管这不是VAE框架的完全规定,但在实践中效果很好,并且在其他VAE文献中也有使用[6]。尽管我们的模型比1和3中的模型要深,但训练模型并不困难。训练只运行了一次(虽然训练重启了5次,以找到使损失下降最快的学习率)。从噪声中生成的数字如图7所示。值得注意的是,这些样本很难评估,因为没有简单的方法来衡量这些与训练集的不同程度[24]。然而,失败案例是有趣的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。