Tutorial on Variational Autoencoders 论文
Tutorial on Variational Autoencoders 论文
引言
生成建模是机器学习中的一个重要领域,目标是建立对数据点
模型的具体含义取决于我们想用它完成什么。最基础的生成模型能够数值计算
实际应用中,人们更关心的是能否基于已有数据库,生成更多类似但不完全相同的新样本。比如:
从图像数据库合成新的未见图像;
从三维植物模型生成更多植被以填充游戏场景;
从手写文本生成更多手写内容。
这些生成工具对设计师等用户非常有用。
我们假设数据来自一个未知的真实分布
训练这类模型长期以来面临三大难题:
需要对数据结构做强假设;
进行严重近似,导致模型性能不佳;
依赖计算量大、效率低的推断方法,如马尔可夫链蒙特卡洛(MCMC)。
近年来,借助反向传播训练神经网络这一强大函数逼近器的突破,出现了基于神经网络的生成模型框架。其中变分自编码器(VAE)是一种非常流行的方法,具有如下优点:
假设较弱,不强制对数据结构做过多限制;
训练速度快,可通过反向传播高效优化;
引入近似但误差较小,尤其是在高容量模型下。
这些特点使得 VAE 快速流行,成为研究和应用的热门工具。
论文面向对生成模型感兴趣但不熟悉变分贝叶斯方法的读者,主要偏重计算机视觉领域。教程起源于加州大学伯克利分校和卡内基梅隆大学的读书分享。
预备知识: 潜变量模型
生成模型训练时,维度间的复杂依赖会增加难度。以生成手写数字图像为例,模型若先随机选择一个数字
为了让模型能生成接近训练数据的样本,必须确保对数据集中的每个样本
用概率分布形式表达即为最大化
其中
在变分自编码器中,常用的
这个设计使得模型输出能“软匹配”训练样本,便于通过梯度下降逐渐调整参数,增加数据的生成概率。如果使用确定映射(即
输出分布不一定是高斯分布,例如二值数据可用伯努利分布。关键是
变分自编码器
虽然 VAE 含有编码器和解码器结构,看起来像传统的自编码器,但它的数学基础与稀疏自编码器或去噪自编码器并不相同。VAE 的目标是近似最大化训练样本的概率:
它最大的优势在于可以直接从
VAE 需要解决两个核心问题:
如何定义潜变量
,即 应该包含哪些信息?如何计算
中对 的积分?
针对第一个问题,以手写数字为例,一个合理的
我们不希望人为规定
直接假设
来自一个简单的分布,通常是标准正态分布 。
为什么这样可行?因为任意复杂分布都可以通过把简单分布输入到一个足够复杂的函数中得到。例如:
若

所以,使用神经网络等强函数逼近器,我们可以将标准正态的
在 VAE 中,生成图像的过程被建模为高斯分布:
其中
这意味着:
网络会自动学习潜在结构,只要这样的结构有助于拟合训练数据(即使最大似然更大)。
现在剩下的问题是如何优化上述积分。一个直接的近似方法是采样多个
但在高维空间中,这种方式效率极低,需要非常多的样本

图3 中说明了这个问题的本质:
图3(a):目标图像
,我们希望估计其 。图3(b):模型生成的图像,看起来不像“2”,质量很差。
图3(c):仅比
偏移半个像素,看起来很像原图。
问题在于:
图3(c) 与
的欧式距离为 0.2693图3(b) 与
的欧式距离为 0.0387
由于
如果我们希望图3(b) 对
设随机向量
,其分布为维度为 的多元高斯分布,记作: 其概率密度函数为:
在 VAE 里,我们通常假设协方差矩阵是对角的,甚至直接是单位矩阵的倍数:
此时公式简化为:
其中
是欧几里得距离的平方,表示 与生成样本的距离。
现存问题(如图3所示):
要排除错误样本(图3b),需要
非常小但这样也会排除相似的好样本(图3c)
采样效率低,需大量
才能采到接近目标图像的样本
虽然可以尝试用更好的相似性度量代替欧氏距离,但在复杂视觉任务中,这类度量难以设计,也难以训练。为此,VAE 选择不改变相似性度量,而是优化采样方式,以提高效率。这为后续的变分推断方法奠定了基础。
构建目标函数
当我们尝试通过采样计算公式 (1) 中的
变分自编码器(VAE)的关键思想是:尝试只采样那些很可能生成
这使得我们可以更容易地计算:
但问题来了:如果
我们先从变分贝叶斯方法的基础出发:Kullback-Leibler 散度(KL 散度),它衡量两个概率分布之间的距离。我们用它来衡量
为了将
注意:
不依赖于 ,因此可以移出期望符号。
我们从 KL 散度的定义开始:
接下来使用 贝叶斯公式 展开
: 带入上式中:
对右侧进行对数展开:
将其带入 KL 散度的期望中:
因为
与 无关,是一个常数,可以移出期望符号: 最终得到目标公式:
接着,我们将等式两边都取负号、重新排列,并将期望中的部分转换为另一个 KL 散度,从而得到:
其中:
左边是我们想要的目标
减去一个误差项(让 逼近真实后验分布 );右边则是我们可以实际优化的目标。
由于我们关心的是给定样本
这个公式(式 5)正是变分自编码器的核心思想,非常值得深入理解:
左边的
是我们希望最大化的目标;减去的 KL 散度项会鼓励
生成那些可以还原 的 ;如果我们能让
,那么这个误差项趋近于 0,我们就真正最大化了 ;更重要的是,这样一来我们就绕过了后验分布
无法精确计算的问题,用 代替它。
同时,右边的结构也变得非常像一个自编码器:
我们会在后续进一步探索这种“看起来像自编码器”的结构。
优化目标函数
那么我们该如何对公式(5)右边的目标函数使用随机梯度下降进行优化呢?首先,我们需要更具体地定义
其中
这样的设定具有计算上的优势,因为它可以明确地定义如何计算公式右边的两项。最后一项
其中
在我们的设定中,
现在来看公式(5)右边的第一项:
因此,和随机梯度下降中常用的做法一样,我们通常只对
毕竟,我们已经在对从数据集
最终我们要优化的目标是:
若我们对该公式求梯度,由于期望的线性性质,可以将梯度操作符移入期望内。这样我们只需采样一个
我们可以对多个样本的
然而,公式(9)存在一个重要问题:
为了让 VAE 正常工作,我们必须推动
换种方式理解这个问题:公式(9)描述的神经网络结构类似图4左侧所示的网络。其前向传播没有问题,若对多个

虽然反向传播可以应对带噪输入(例如 dropout),但无法直接穿过一个采样操作的节点反向传播梯度。
解决方案来自 Kingma 等人在 [1] 中提出的 “重参数化技巧”(reparameterization trick):
我们将采样从网络内部移动到输入层。具体做法是:
先从标准正态分布采样
再计算
这样我们就可以将期望写为如下形式:
该结构如图4右侧所示。
注意:现在所有的期望都关于不依赖模型参数的分布,因此我们可以安全地将梯度符号移入期望中而不会影响等式成立。换言之,在固定
需要指出的一点是:重参数化技巧仅适用于连续变量的分布。为了能写成
因此,如果
测试已学习的模型
在测试阶段,当我们希望从训练好的模型中生成新样本时,过程非常简单:只需从标准正态分布中采样

当我们希望评估某个测试样本
尽管这个下界仍然包含一个关于
与直接从
因此,在测试阶段,直接从标准正态分布采样
在 训练阶段,VAE 的工作流程是这样的:
给一个真实样本
(比如一张图像)。 用 编码器 生成潜在变量
的分布参数:均值 和方差 。 从这个分布中采样出一个
(使用 reparameterization trick)。 用 解码器 根据
生成图像 。 同时优化两个目标:重建损失(
与 的相似程度) + KL 散度(让 尽量接近 )。
训练完成后,编码器的目标是让
尽可能逼近标准正态分布 。也就是说,模型已经学会了将数据编码到一个“标准正态空间”中。
因此在 测试时,我们就不需要真实的了。我们可以:
直接从
中采样一个 (比如 ) 把这个
传给 训练好的解码器 解码器会输出一个图像,这就是一个新的、合理的样本
因为 VAE 在训练过程中不断把
分布“推近”标准正态分布,所以训练好的解码器知道:从标准正态分布中采样 ,应该能生成“像样”的图像。这也是变分推断的精髓所在。
原始的变分自编码器(VAE) 只能学习如何根据某种隐变量来重建训练数据 ,并不能直接学会如何根据文本或其他条件信息来生成对应图像。
解读目标函数
到目前为止,你应该已经相信 VAE 的学习过程是可行的,并且它确实在对整个数据集上的
我们将讨论三个关键主题:
首先,我们会探讨:在优化
的同时,还优化了 ,这一步到底引入了多少误差?接着,我们会从信息论(Information Theory)的角度描述 VAE 框架,特别是分析等式 (5) 右侧的表达式,并将其与基于最小描述长度(Minimum Description Length,简称 MDL)等其他方法联系起来。
最后,我们会调查:VAE 是否拥有类似于稀疏自编码器中稀疏性惩罚项那样的“正则化参数”,也就是说,是否存在一种类似于手动控制模型约束程度的机制?
项引入的误差分析
本模型之所以具备可计算性,依赖于我们作出的一个假设:即
然而,确保
如果
如果
固定,且对应的 不是高斯分布,那么我们用高斯近似的 来学习会引入误差,导致从标准正态分布采样得到的 经 decoder 生成的图像 难以还原原始数据。
不过,好消息是,只要我们拥有足够高容量(high-capacity)的神经网络,那么就存在很多种函数
这里提到的函数
是指 decoder 端的神经网络,即从潜在变量 映射到图像 的那个函数。
如果这样的函数存在,那么 KL 散度
那么,是否对我们想要逼近的所有分布都存在这样一种函数
但幸运的是,作者指出,在某些特定情形下,可以证明这样的函数确实存在:前提是标准差
虽然在实际中这样的小
这一发现也暗示,未来的理论研究有望揭示 VAE 在更实际设定下到底存在多少近似误差。作者认为,附录 A 中的证明方法可能可以推广到多维情形,但这部分工作尚留待未来完成。
信息论视角
我们可以从信息论的角度,特别是“最小描述长度(Minimum Description Length, MDL)”的原则,来理解公式(5)右边的意义。这种视角也正是许多 VAE 的前辈模型(如 Helmholtz 机器 [16]、Wake-Sleep 算法 [17]、深度置信网络 [18] 和玻尔兹曼机 [19])的动机来源。
在信息论中,
第一步是构建潜变量
第二步是利用
因此,总的信息量(
不过这里要注意一点:由于我们用的是近似的编码分布
VAE 与正则化参数
从公式(5)的角度看,将
在稀疏自编码器的目标函数中,确实存在一个正则化参数
其中
相比之下,变分自编码器(VAE)通常并没有这样的正则化参数,这其实是一个好处:程序员就少了一个需要调节的超参数。
但在某些模型中,我们可以人为“制造出”一个看起来像正则化参数的东西。有些人可能会认为:通过将潜变量的分布从
然而,事实证明,这种修改不会改变模型本质。原因如下:
我们可以通过以下重参数方式,把这个
令
令
令
这样处理之后,右侧的损失函数值(也就是公式5的右边)将与原来
但还有另一种方式可以引入“正则化参数”的作用。回忆一下:对于连续型数据,一个比较合适的输出分布是:
其中
这里的
这意味着在 VAE 的完整优化目标中,
不过,这种参数的存在依赖于我们对
如果
是连续变量,我们就会使用上述的高斯分布,并引入 来控制建模精度。但如果
是二值变量,我们会使用 Bernoulli(伯努利)分布作为输出模型。在这种情况下,正则化参数 就消失了。
如果仍然希望引入一个调节项,那只能靠“技巧”——比如把
从信息论的角度看,这种现象是合理的:
当
是二值变量时,我们可以明确地“数清楚”编码 所需的比特数,两个损失项的单位是一致的(都是比特)。但当
是连续变量时,每个样本理论上都包含“无限信息”。在这种情况下,我们必须设定 ,以决定我们允许模型“多不精确”,这样才能让总的信息量变得有限(否则就永远不能完全编码一个实数向量)。
条件变分自编码器
让我们回到之前生成手写数字的例子。假设我们不仅想生成新的数字,而是想在一个由同一个人写成的数字串中添加数字。这类似于计算机图形学中的一个实际问题——“补洞”:给定一张用户已经去除了不需要物体的图像,目标是用看起来合理的像素填补这个空洞。
这两个问题的一个重要难点是,合理输出的空间是多模态的:下一个数字或者补充的像素有许多可能。标准的回归模型在这种情况下会失败,因为训练目标通常会惩罚预测结果与真实结果之间的距离。在面对这种问题时,回归模型的最佳结果往往是“介于多种可能之间”的某种平均值。就数字生成而言,这通常表现为模糊无意义的“平均图像”,融合了所有可能的数字和各种可能的书写风格。
我们需要的是一种算法,能输入一个字符串或图像,输出一个复杂的、多模态的概率分布,并从中采样。条件变分自编码器(CVAE)应运而生,它通过简单地对整个生成过程加上条件限制来修改上一节中的数学模型。
CVAE使我们能够解决输入到输出是一对多映射的问题,而无需显式指定输出分布的结构。
给定输入
其中,
我们可以将之前的公式(公式2到5)改写为条件形式:
注意,
该模型的结构如图6所示。测试时,我们只需从
