【摘 要】本文从自编码器入手,讨论了自编码器与变分自编码器之间的本质区别,并简单介绍了变分自编码器的工作原理,适合于认识变分自编码器的第一篇入门读物。
【原 文】Joseph Rocca & Baptiste Rocca,Understanding Variational Autoencoders VAEs

1. 简介

在过去的几年中,由于一些惊人的进步,基于深度学习的生成模型越来越受到关注。依靠大量数据,精心设计的网络结构和训练技术,深度生成模型已经显示出了令人难以置信的能力,可以生成高度逼真的各种内容,例如图像,文本和声音。在这些深度生成模型中,有两个类别脱颖而出,值得特别关注:生成对抗网络(GAN)和 变分自编码器(VAE)

图 1 VAE 生成的人脸图片

简而言之,VAE 是一种自编码器,在训练过程中其编码的概率分布是正则化的,以确保其在隐空间具有良好特性,进而允许我们生成一些新数据。术语 “变分” 源自统计中的 正则化变分推断 方法。

虽然最后两句话很好地概括了 VAE 的概念,但是它们也会引出很多问题。什么是自编码器?什么是隐空间?为什么要对其进行正则化?如何用 VAE 生成新数据?VAE 与变分推断之间有何联系?为尽可能地描述 VAE,我们将尝试回答上述所有问题,并为读者提供尽可能多的知识。本文的目的不仅是讨论 变分自编码器 所依赖的基本概念,还要逐步构建出这些概念的推导过程。

本文第一节将回顾一些有关降维和自编码器的基础概念,这些概念有助于理解 VAE。第二节说明为什么自编码器不能用来生成新数据,并将介绍 变分自编码器变分自编码器 是自编码器的正则化版本,其使数据生成变为可能。最后一节将基于变分推断对 VAE 进行更数学的描述。

注意:在最后一节中,我们试图使数学推导尽可能完整和清楚,以弥合直觉和方程之间的差距。但不想深入了解 VAE 数学细节的读者可以跳过该节,而不会影响对主要概念的理解。还要注意,本文将大量使用以下符号:对于随机变量 z\mathbf{z} ,我们将用 p(z)p(\mathbf{z}) 表示该随机变量的分布(或概率密度,取决于上下文)。

2. 降维、PCA 和自编码器

本节从降维相关概念开始,简要回顾主成分分析(PCA)和自编码器,以展示这两种方法之间的相互关系。

2.1 什么是降维?

在机器学习中,降维是减少描述数据的特征数量的过程。可以通过选择(仅保留一些现有特征)或通过提取(基于旧特征组合来生成数量更少的新特征)来进行降维。降维在许多需要低维数据(数据可视化、数据存储、海量计算…)的场景中很有用。

尽管有许多不同的降维方法,但是可以构建一个适用于大多数方法的总体框架(见图 2)。首先,编码器为从 “旧特征表示” 中产生“新特征表示”的过程(通过选择或提取),然后将其逆过程称为解码。降维可被理解为数据压缩,其中编码器压缩数据(从原始空间到编码空间,也称为隐空间),而解码器则用于解压缩。

当然,根据原始数据分布、隐空间大小和编码器的选择不同,压缩可能是有损的,即一部分信息会在编码过程中丢失,并且在解码时无法恢复。

图 2 用编码器和解码器构建的降维过程。〖蓝色的高维原始数据被编码器压缩到浅黄色的低维隐空间中,再由解码器解压缩。如果解码后的数据和原始数据相同(右上)则称为无损降维,否则为有损降维。〗

降维算法的主要目的是在给定候选中找到最佳的编码器/解码器对。换言之,对于给定一组可选的编码器/解码器,我们希望编码时保持信息量最大,从而在解码时具有尽可能小的重构误差。如果分别用 EEDD 表示正在考虑的编码器和解码器,则降维问题可以表示为

(e,d)=argmin(e,d)E×Dσ(x,d(e(x)))( e ^ { * } , d ^ { * } ) = \operatorname {argmin} \limits_{(e,d)\in E \times D} \sigma ( x , d ( e ( \mathbf{x} ) ) )

其中: $ \sigma ( \mathbf{x} , d ( e ( \mathbf{x} ) ) )$ 为输入数据 xx 和编码/解码后数据 d(e(x))d(e(\mathbf{x})) 之间的重构误差。需注意,下面将用 NN 表示数据点的个数,ndn_d 表示原始(解码)空间的维数,nen_e 表示编码(降维)空间的维数,通常 ne<<ndn_e << n_d

2.2 主成分分析(PCA

降维首先想到的方法就是主成分分析(PCA)。为展示PCA 如何符合上述框架,并建立与自编码器的联系,可以对 PCA 的工作方式进行简要描述。

PCA 的想法是构建 nen_e 个新的独立特征,这些特征是 ndn_d 个旧特征的某种线性组合,该线性组合使得这些新特征所定义的子空间上的数据投影尽可能接近初始数据(就欧几里得距离而言)。换句话说,PCA 寻找初始空间的最佳线性子空间(由新特征的正交基定义),以使投影到该子空间上的近似数据的误差尽可能小

图 3 PCA 是在寻找最佳子空间。〖B 为原始空间中的点,其坐标为 (-0.4,-0.1),投影(降维)到黑色实线表示的子空间后为对应圆点,再解压缩之后的坐标是(-0.34,-0.2),与原始点并不重合。两点之间的距离便可理解为误差〗

如果用前面定义的框架来描述,我们正在 nendn_e -n_d 矩阵族 EE 中搜寻一个线性变换编码器,该变换的各行是正交的(特征独立性);并且在 ndnen_d-n_e 的矩阵族 DD 中寻找一个相应的解码器。可以证明,与协方差特征矩阵的 nen_e 个最大特征值相对应的单位特征向量是正交的,并且组成了维度为 nen_e 的最佳子空间,使得数据投影到该子空间的误差最小,可以选择这 ndn_d 个特征向量作为新特征。因此,降维问题可以转化为特征值/特征向量求解问题。此外,还可以推出,解码器矩阵是编码器矩阵的转置。

图 4 PCA 与总体框架是兼容的。〖本图的等式大家可以回顾一下 SVD 分解相关的知识〗

2.3 自编码器 (AutoEncoder, AE)

本小节讨论自编码器,以及如何使用神经网络进行降维。自编码器的总体思路非常简单:采用神经网络来作为编码器和解码器,并使用迭代优化学习最佳的编码-解码方案。在每次迭代中,向自编码器结构提供一些输入数据,将编码并再解码后的输出与原始输入数据进行比较,并通过反向传播误差来更新网络权重。

直观地看,自编码器结构(“编码器+解码器”)会构造出一个降维的瓶颈(bottleneck),从而确保只有信息的主要部分可通过瓶颈并进行重构。从总体框架来看,编码器族由编码器网络结构定义,解码器族由解码器网络结构定义,而重构误差的减小则通过对编码器和解码器参数进行梯度下降来实现。

图 5 带有损失函数的自编码器。〖编码器和解码器中间即为低维隐空间,通过利用图中的 loss 函数可以训练出最优的自编码器〗

从简单角度出发,先假设编码器和解码器网络结构都为单层线性结构。这样编码器和解码器均为简单的线性变换,可用矩阵表示。在这种情况下,可以看到这种线性自编码器结构与 PCA 存在明显关联,与 PCA 中一样,线性自编码器结构在寻找最佳的线性子空间来投影数据,并使信息损失尽可能少。用 PCA 获得的编码和解码矩阵自然地也是梯度下降所能得到的一种解决方案,但是应指出,其并不是唯一的解决方案。实际上,可以选择几组不同的基向量来描述相同的最佳子空间,理论上存在多个不同的 编码器/解码器对 可以提供最小的重构误差。此外,与 PCA 不同,线性自编码器最终获得的新特征不必是独立的(神经网络中没有正交性约束)。

图 6 线性自编码器和 PCA 的联系 〖 PCA 和线性自编码器的目标是完全一致的,但两者得到的最佳子空间不必是相同的。图中蓝色为 PCA 得到的基,它们必然是正交的,但自编码器得到的基不一定是正交的。〗

现在,进一步假设编码器解码器都是深度非线性网络结构。此时网络结构越复杂,自编码器就可进行更多的降维,同时保持较低的重构损失。直观地看,如果编码器解码器具有足够自由度,则可以将任何原始维度 ndn_d 减小为 1。实际上,具有 “无限大能力” 的编码器理论上可以将 NN 个初始数据编码为 1、2、3,…,最多 N 个(或更一般地说,为实轴上的 N 个整数),相应解码器再进行逆变换,而且这种过程不会造成任何损失。

但是应牢记两点:

(1)在没有重建损失的情况下进行降维通常会带来一个代价:隐空间中缺乏可解释和可利用的结构(缺乏正则性,lack of regularity);

(2)大多数时候,降维的最终目的不仅是减少数据维数,而是在减少维数同时将数据主要的结构信息保留在简化表示中。

出于上述两个原因,必须根据降维的最终目的来控制和调整隐空间大小和自编码器的“深度”。

图 7 降维时希望保留主要信息。〖图中对中间的原始 9 维数据进行了两种降维,左边为降到了 1 维生物性,这样丢失了很多信息;右边降到了生物性和飞行能力 2 个维度,丢失的信息大大减少〗

3. 变分自编码器 (VAE)

上面讨论了降维问题和自编码器,自编码器是可以通过梯度下降训练的编码器-解码器结构。本节将考虑数据生成的问题,看一下自编码器对此问题的局限性,并引出 变分自编码器

3.1 自编码器用于生成数据的局限性

此时,自然会想到一个问题:“自编码器和数据生成之间存在什么联系?”。确实,一旦对自编码器进行了训练,则我们既有了编码器又有了解码器,但仍然无法产生任何新内容。乍一看可能会认为,如果隐空间具备足够的正则性(即在训练过程中被编码器很好地“组织”了),则我们可以从该隐空间中随机取一个点并将其解码,以获得新的数据内容,就像 生成对抗网络 (GAN) 中的生成器一样。

图 8 可以通过对隐空间中随机采样的点进行解码来生成新数据。生成数据的质量取决于隐空间的正则性。

但正如在上一节中讨论的那样,自编码器隐空间的正则性是一个难点,它取决于原始空间中的数据分布、隐空间大小、编码器结构等诸多因素,很难先验地确保编码器能够以与生成过程相兼容的方式,智能地组织隐空间。

为说明此点,再看一遍图 9 给出的极端示例,该示例描述了一种强大的编码器和解码器,可以将任何 NN 个初始训练数据放到实轴上(每个数据点都被编码为实值)并无损失地解码。在这种情况下,自编码器的高自由度使得可以在无信息损失情况下进行编码和解码,但会导致严重的过拟合。这意味着隐空间中某些点在解码时会给出豪无意义的内容。虽然本例太过极端,但可注意到自编码器隐空间的正则性问题是普遍的,值得特别注意。

图 9 非正则隐空间妨碍了用自编码器生成新数据。〖一个无限长自编码器的例子,虽然输入的训练数据可被无损失地压缩、重构,但从隐空间中随机采样的点会解码出豪无意义的数据〗

进入隐空间的编码数据间缺乏结构很正常。在自编码器训练任务中,并没有什么东西能够保证得到这种结构:自编码器仅以尽可能少的损失为目标进行训练,而不会考虑隐空间如何组织。因此,如果对架构定义不小心,则在训练过程中,网络很自然地会尽可能地利用任何过拟合方式来完成其任务……除非明确对其进行正则化!

3.2 变分自编码器 的定义

为了能够将自编码器的解码器部分用于数据生成任务,必须确保隐空间具备足够正则化。其中一种方案是在训练过程中显式引入正则化(regularisation)。变分自编码器 就是这样一种自编码器,其训练过程通过正则化避免过拟合,并确保隐空间具有能够支持数据生成过程的良好属性。

与标准自编码器类似, 变分自编码器由编码器和解码器组成,经过训练以使编码-解码后的数据与原始数据间的重构误差最小。但为了引入隐空间的正则化,需要对编码-解码过程进行一些修改:不再将原始输入数据编码为隐空间中确定的单点,而是将其编码为隐空间中的某个概率分布。从而模型训练过程调整为:

  • 首先,将输入编码为在隐空间上的某个分布;

  • 其次,从该分布中采样隐空间中的一个点;

  • 再次,对采样点进行解码并计算出重建误差;

  • 最后,重建误差通过网络反向传播。

图 10 自编码器(确定性)和 变分自编码器 (概率性)之间的差异。变分自编码器把原始数据编码为隐空间中的概率分布,解码时从该分布中采样一个点来进行解码。

实践中,通常选择正态分布作为隐空间编码的分布,则训练任务从求解单个隐空间表示,转换为求解隐空间中概率分布的参数,即均值和协方差矩阵。将原始数据编码为具有一定方差的分布而不是单个点,可以比较自然地表达隐空间的正则性:编码器返回的概率分布被强制接近标准正态分布。在下一节中,我们将通过这种方式确保隐空间的局部和全局正则化(注:局部正则化由方差控制,全局正则化由均值控制)。

因此,在训练 VAE 时,最小化的损失函数由一个重构项(在最后一层)和一个正则化项组成,重构项倾向于使编码解码方案尽可能地具有高性能,而正则化项 则通过使编码器输出的分布接近标准正态分布,来规范隐空间的组织。该正则化项编码器输出的分布与标准高斯之间的 KL 散度 [1],这将在下一节中进一步说明。我们注意到,两个高斯分布之间的 KL 散度 具有封闭形式的解析解,并可直接用两个分布的均值和协方差矩阵表示。

图 11 在变分自动编码器中,损失函数由一个重构项和一个正则化项组成。 其中,重构项即自编码器的“编码-解码”部分,而正则化项则通过将其规范为一个正态分布形式来进行约束。由于正态分布的概率密度函数是确定的,所以两个高斯分布的 KL 散度存在解析形式解

注:KL 散度又称为相对熵,其定义为:

KL(p(x),q(x))=p(x)logp(x)q(x)K L ( p ( \mathbf{x} ) , q ( \mathbf{x} ) ) = \sum p ( \mathbf{x} ) \log \frac { p ( \mathbf{x} ) } { q ( \mathbf{x}) }

此概念很重要,不只是 VAE,很多地方都会用到。

3.3 正则化及其直观解释

为使生成过程成为可能,我们期望隐空间具有正则性,主要体现在两个主要属性:连续性和完整性。其中:连续性指隐空间中相邻的点解码后不应呈现完全不同的两个内容,而完整性指对于给定分布,从隐空间中采样的点,在解码后应提供 “有意义” 的内容。

图 12 非正则的隐空间 vs 正则的隐空间。非正则的隐空间中相邻的点在解码后并不相似(如图中的正方形和三角形),甚至有些点根本无法解析出有意义的数据(如图中的紫色图形)

VAE 将输入数据编码为分布而非点的这种处理方式,不足以确保上述 连续性和完整性。因为如果不明确指定正则化项,则模型通过最小化重构误差的训练过程,最终会自然地 “忽略” 掉要返回的是一个分布,而表现得和普通自编码器没有区别。也就是说,编码器可能返回一个仅含极小方差的分布(数据在隐空间中接近于一个点,可称为斑点分布),或返回一个具有巨大均值差异的分布(数据在隐空间中彼此相距很远)。这两种情况都无法得到理想的分布,并且无法满足连续性和/或完整性。

为避免上述影响,必须同时对编码器返回分布的均值和协方差矩阵进行正则化。实际中,大多强制编码器的输出分布接近于标准正态分布来实现该正则化,即要求协方差矩阵接近于单位矩阵(假设隐空间各维度相互独立)、避免出现极小方差( 各维度分布具有一定的宽度)、均值接近于 0(防止编码分布彼此相距太远)。

图 13 必须对返回的 VAE 分布进行正则化,以获得具有良好特性的隐空间。

使用上述正则化项可以防止模型在隐空间中的编码彼此远离,并鼓励返回的分布之间尽可能多的发生“重叠”(体现不确定性),从而满足连续性和完整性条件。当然,任何正则化项都会增加训练数据上的整体重建误差,但可以通过调整重建项和正则化项之间的权重来调和这种关系,下一节中将形式化推导得出平衡的表达。

3.4 小结

通过正则化获得的连续性和完整性,会在隐空间的编码信息上产生一定“梯度”,即将隐空间中两个编码分布均值之间的点(图 14 中的不同颜色中心点之间的过渡区域) 解码为第一个编码分布所对应输入数据和第二个编码分布随对应输入数据之间的某个数据,因为它可能在两种情况下都被自编码器采样到。例如:在隐空间中橙色和蓝色编码分布之间的点,应当被解码为三角形和圆形之间的某个输入数据,有可能是一个圆角三角形。类似,在蓝色和黄色编码分布之间的区域,应当被解码为圆角正方形,而在橙色和黄色编码分布之间的区域,应当被解码为梯形。这使得隐空间中各维度特征具有某些“意义”。

图 14 正则化倾向于在隐空间的编码信息上形成“梯度”。

注意:顺带一提,上面提到的隐空间中“斑点分布”和“距离过大”问题,在网络规模变大时几乎等效,因为两种情况下不同编码分布的方差都远小于均值差。

4. VAE 的数学细节

上节给出了以下直观的概述:VAE 是将输入数据编码为分布而不是一个点的一种自编码器,其隐空间的结构可以通过将分布约束为接近正态分布而得以正则化。本节将对 VAE 进行更数学的阐述,从而严格证明正则化项的合理性。为此,将建立一个明确的概率框架,并将使用到变分推断技术。

4.1 概率框架和假设

首先定义一个图 15所示的概率图模型来描述数据生成过程。 x\mathbf{x} 表示可观测变量(即输入的原始数据),并假定 x\mathbf{x} 是由无法直接观测到的隐变量 z\mathbf{z}(即编码器输出的隐空间变量)生成的。每个数据点可以假定以下生成过程:

  • 首先,从先验分布 p(z)p(\mathbf{z}) 中采样一个隐空间表示 zz
  • 其次,从条件概率分布 p(xz)p(\mathbf{x|}z) 中采样得到数据 xx

图 15 VAE 的概率图模型。

在该概率模型下,需重新定义编码器解码器的概念。与普通自编码器不同,现在需要考虑两者的概率版本。“概率解码器” 由 p(xz)p(x|z) 定义,描述给定隐变量 zz 时解码变量 xx 的条件分布,而“概率编码器”由 p(zx)p(z|x) 定义,描述给定原始变量 xx 时隐变量 zz 的条件分布。

此时,在普通自编码器中欠缺的隐空间正则化问题,在数据生成过程中得到自然地定义,即假设隐空间中的编码变量 zz 遵循先验分布 p(z)p(\mathbf{z}) 。回顾一下著名的贝叶斯定理,该定理在先验 p(z)p(\mathbf{z}) 、似然性 p(xz)p(x|z) 和后验 p(zx)p(z|x) 之间建立联系:

p(zx)=p(xz)p(z)p(x)=p(xz)p(z)p(xu)p(u)dup(z \mid x)=\frac{p(x \mid z) p(\mathbf{z})}{p(\mathbf{x})}=\frac{p(x \mid z) p(\mathbf{z})}{\int p(x \mid u) p(u) d u}

现在假设先验 p(z)p(\mathbf{z}) 为标准高斯分布(正态分布)。似然 p(xz)p(\mathbf{x|z}) 为高斯分布,随机变量 x\mathbf{x} 的均值由 z\mathbf{z} 的某个确定性函数 ff 定义,协方差矩阵为对角矩阵形式,由正常数 cc 乘以单位矩阵 II 得到。假定函数 ff 属于记为 FF 的函数族(后面讨论,暂不指定)。则有:

p(z)N(0,I)p(xz)N(f(z),cI)fFc>0\begin{aligned} &p(\mathbf{z}) \equiv \mathcal{N}(0, I) \\ &p(x \mid z) \equiv \mathcal{N}(f(\mathbf{z}), c I) \quad f \in F \quad c>0 \end{aligned}

假设 ff 已经定义并且固定,则理论上,便可以使用贝叶斯定理,用 p(z)p(\mathbf{z})p(xz)p(\mathbf{x|z}) 来计算 p(zx)p(\mathbf{z|x}),这也是经典贝叶斯推断问题 [4]。但贝叶斯推断的计算通常较为棘手,需要使用诸如变分推断、MCMC 之类的近似计算技术。

注:此处提到 p(z)p(\mathbf{z})p(xz)p(x|z) 均为高斯分布。根据贝叶斯统计中的共轭先验假设,如果有 E(xz)=f(z)=zE(\mathbf{x|z}) = f(\mathbf{z}) = \mathbf{z},则意味着 p(zx)p(\mathbf{z|x}) 也应服从高斯分布。理论上可以只尝试表达 p(zx)p(\mathbf{z|x}) 的均值以及协方差矩阵,即通过 $ p(\mathbf{z})$ 和 p(xz)p(\mathbf{x|z}) 的均值和协方差矩阵得到解析解。但实践中该条件几乎无法满足,需要使用一种近似技术(比如变分推断),来使得方法更为通用,并且对模型假设的某些变化更加稳健。

4.2 变分推断

在统计中,变分推断(VIVI)是一种近似复杂分布的技术。其基本思路是:设置一个参数化的分布族(例如高斯族,其参数是均值和协方差),并在其中寻找符合目标分布的最佳近似。该分布族中的最佳近似对象应当使得给定近似误差测量值最小化,大多数情况下采用近似分布与目标分布之间的 KL 散度 作为近似误差测量值,并通过梯度下降法来逼近该分布族的参数。更多详细信息请参阅 变分推断的文章 [4]及其参考文献。

此处用高斯分布来近似 p(zx)p(\mathbf{z|x}),假设其均值和协方差由参数为 x\mathbf{x} 的两个函数 gghh 定义,而这两个函数分别属于可参数化的函数族 GGHH。因此可写出如下表示:

qx(z)N(g(x),h(x))gGhHq_{x}(\mathbf{z}) \equiv \mathcal{N}(g(\mathbf{x}), h(\mathbf{x})) \quad g \in G \quad h \in H

现在已经定义了一个变分推断的候选分布族,现在需要通过优化函数 gghh(即调整这些函数的参数)以最小化近似分布 qx(z)q_x(\mathbf{z}) 和真实分布 p(zx)p(\mathbf{z|x}) 间的 KL 散度,进而找到该分布族中的最佳近似。换言之,我们正在寻找最优的 gghh,使得:

(g,h)=argmin(g,h)G×HKL(qx(z),p(zx))=argmin(g,h)G×H(Ezqx(logqx(z))Ezqx(logp(xz)p(z)p(x)))=argmin(g,h)G×H(Ezqx(logqx(z))Ezqx(logp(z))Ezqx(logp(xz))+Ezqx(logp(x)))=argmax(g,h)G×H(Ezqx(logp(xz))KL(qx(z),p(z)))=argmax(g,h)G×H(Ezqx(xf(z)22c)KL(qx(z),p(z)))\begin{aligned} \left(g^{\star}, h^{\star}\right) &=\underset{(g, h) \in G \times H}{\arg \min } K L\left(q_{x}(\mathbf{z}), p(\mathbf{z \mid x})\right) \\ &=\underset{(g, h) \in G \times H}{\arg \min }\left(\mathbb{E}_{z \sim q_{x}}\left(\log q_{x}(\mathbf{z})\right)-\mathbb{E}_{z \sim q_{x}}\left(\log \frac{p(\mathbf{x \mid z}) p(\mathbf{z})}{p(\mathbf{x})}\right)\right) \\ &=\underset{(g, h) \in G \times H}{\arg \min }\left(\mathbb{E}_{z \sim q_{x}}\left(\log q_{x}(\mathbf{z})\right)-\mathbb{E}_{z \sim q_{x}}(\log p(\mathbf{z}))-\mathbb{E}_{z \sim q_{x}}(\log p(\mathbf{x \mid z}))+\mathbb{E}_{z \sim q_{x}}(\log p(\mathbf{x}))\right) \\ &=\underset{(g, h) \in G \times H}{\arg \max }\left(\mathbb{E}_{z \sim q_{x}}(\log p(\mathbf{x \mid z}))-K L\left(q_{x}(\mathbf{z}), p(\mathbf{z})\right)\right) \\ &=\underset{(g, h) \in G \times H}{\arg \max }\left(\mathbb{E}_{z \sim q_{x}}\left(-\frac{\|\mathbf{x}-f(\mathbf{z})\|^{2}}{2 c}\right)-K L\left(q_{x}(\mathbf{z}), p(\mathbf{z})\right)\right) \end{aligned}

注:
第一行是问题定义;
第二行是 稍作变换后的KL 散度 公式,注意 zzqxq_x 分布中采样;
第三行是对第二行的第二项用对数公式做了一下变换;其中最后一项为常数;
第三行的前两项合起来是 KL(qx(z),p(z))KL(q_x(\mathbf{z}),p(\mathbf{z})),从而得到第四行;
第五行利用正态分布的定义得到。


在第四行公式中,可以观察到一个对后验 p(zx)p(\mathbf{z|x}) 进行 qx(z)q_x(\mathbf{z}) 近似的平衡点,即在保持 qx(z)q_x(\mathbf{z}) 与先验 p(z)p(\mathbf{z}) 尽量接近的情况下,最大化“观测”的似然 p(xz)p(\mathbf{x|z}),或者说在最小化 qx(z)q_x(\mathbf{z})p(z)p(\mathbf{z}) 间的 KL 散度(第 2 项)同时,最大化第一项对数似然的期望值(第 1 项)。这种折衷对于贝叶斯推断问题很自然,体现了对数据信念与先验分布信念之间的平衡。

到目前为止,如果解码器函数 f(z)f(\mathbf{z}) 是已知且固定的,就可以使用变分推断来近似后验分布 p(zx)p(\mathbf{z|x}) 了。但实际上,解码器函数 f(z)f(\mathbf{z}) 也未知需要求解。回归到最初的目的,我们是希望找到一种性能良好的编码/解码方案,以使隐空间足够正则,进而可用于生成目的。如果其中正则性主要由在隐空间上的先验分布 p(z)p(\mathbf{z}) 所决定,那么整个编码/解码方案的性能则高度取决于函数 ff 的选择。

事实上,由于 p(zx)p(\mathbf{z|x}) 可以通过变分推断从 p(z)p(\mathbf{z})p(xz)p(\mathbf{x|z}) 近似,而 p(z)p(\mathbf{z}) 是简单的标准高斯模型,仅存的两个需要优化的对象是参数 cc(决定了似然的协方差)和函数 ff(决定了似然的均值)。

因此,正如之前讨论的那样,对于 FF 中的任何函数 ff,(每个函数都定义一个不同的概率解码器 p(xz)p(\mathbf{x|z}) ),我们都可以得到 p(zx)p(\mathbf{z|x}) 的最佳近似 qx(z)q_x^\star (\mathbf{z}) 。无论其概率特性如何,我们都在寻找一种尽可能高效的编码/解码方案,使得对于给定 qx(z)q_x^\star(\mathbf{z}) 中的采样点 zz ,函数 ff 能够使 xx 的对数似然期望最大化。换句话说,对于给定的输入 xx,当从近似分布 qx(z)q_x^\star(\mathbf{z}) 中采样得到 zz,并从似然分布 p(xz)p(\mathbf{x|z}) 中采样得到 x^\hat x 后,我们希望 x^=x\hat x=x 的概率最大化。即我们正在寻找最优的 ff^\star

f=argmaxfFEzqx(logp(xz))=argmaxfFEzqx(xf(z)22c)\begin{aligned} f^{\star} &=\underset{f \in F}{\arg \max } \mathbb{E}_{z \sim q_{x}^{\star}}(\log p(x \mid z)) \\ &=\underset{f \in F}{\arg \max } \mathbb{E}_{z \sim q_{x}^{\star}}\left(-\frac{\|x-f(\mathbf{z})\|^{2}}{2 c}\right) \end{aligned}

其中 qx(z)q_x(\mathbf{z}) 取决于函数 ff,获得方法如前所述。将上述所有部分聚集在一起,我们正在寻找最优的 ff^\stargg^\starhh^\star,使得:

(f,g,h)=argmax(f,g,h)F×G×H(Ezqx(xf(z)22c)KL(qx(z),p(z)))\left(f^{\star}, g^{\star}, h^{\star}\right)=\underset{(f, g, h) \in F \times G \times H}{\arg \max }\left(\mathbb{E}_{z \sim q_{x}}\left(-\frac{\|x-f(\mathbf{z})\|^{2}}{2 c}\right)-K L\left(q_{x}(\mathbf{z}), p(\mathbf{z})\right)\right)

我们可以在该目标函数中找到对应于前面章节中的 VAE 直观描述中引入的元素:xxf(z)f(\mathbf{z}) 之间的重构误差, qx(z)q_x(\mathbf{z})p(z)p(\mathbf{z}) 之间的正则项。还可以注意到常数 cc,它决定了两项之间的平衡。如果 cc 值高,模型中的概率解码器 f(z)f(\mathbf{z}) 周围的方差就越大,我们也就越关注正则化项,如果 cc 值低,则相反。

4.3 将神经网络引入模型

目前为止,已经建立了一个依赖于三个函数 ffgghh 的概率模型,并用变分推断表示了要解决的优化问题。该模型中能够给出最优解的 ff^\stargg^\starhh^\star ,就是其最佳编码/解码方案。由于无法轻松地在整个函数空间上进行优化,因此我们限制了优化域,采用神经网络来定义 ffgghh 。也就是说,FFGGHH 分别对应于由神经网络体系结构定义的函数族,通过调整神经网络参数来得到优化的 ff^\stargg^\starhh^\star

实践中, gghh 并非由两个完全独立的网络定义的,它们其实共享了一部分网络结构和权重:

g(x)=g2(g1(x))h(x)=h2(h1(x))g1(x)=h1(x)g(\mathbf{x})=g_{2}\left(g_{1}(\mathbf{x})\right) \quad h(\mathbf{x})=h_{2}\left(h_{1}(\mathbf{x})\right) \quad g_{1}(\mathbf{x})=h_{1}(\mathbf{x})

因为 h(x)h(\mathbf{x}) 定义了 qx(z)q_x(\mathbf{z}) 的协方差矩阵,所以为方阵。但为简化计算并减少参数的数量,通常做出变量独立性假设,即假设 p(zx)p(\mathbf{z|x}) 的近似值 qx(z)q_x(\mathbf{z}) 是具有对角协方差矩阵的多维高斯分布。在此假设下,h(x)h(\mathbf{x}) 为协方差矩阵对角元素组成的向量,其大小与 g(x)g(\mathbf{x}) 相同。但该强假设缩小了可用于变分推断的分布族范围,因此,对 p(zx)p(z|x) 的近似可能不太准确。

图 16 VAE 的编码器部分

图 16 中编码器中将 p(zx)p(z|x) 建模为高斯分布,且均值和协方差为 xx 的函数 gghh 有些不同,解码器假设 p(zx)p(z|x) 具有不变的协方差,且解码器输出的高斯分布,其均值由神经网络 f(z)f(\mathbf{z}) 建模(图 17)。

图 17 VAE 的解码器部分

重点:

  • 编码器中,均值和协方差均由神经网络建模,且共享部分网络结构和权重。
  • 编码器中的协方差矩阵被简化为对角阵,减少了参数数量,并可简化成一维向量,进而均值和方差就可以 concatenate 为一个向量表示。

通过将图 16中的编码器和图 17 中的解码器串联在一起,可以获得 VAE 的总体神经网络架构。但该网络架构在训练时,需要对编码器返回的分布进行采样,而该采样过程可能造成神经网络的误差返向传播受阻(采样操作不可导),从而无法做到端到端的训练。为解决该问题,有人提出了 重参数化技巧(reparametrisation trick),使 VAE 的端到端梯度下降成为可能。该技巧利用以下事实:如果随机变量 zz 服从均值为 g(x)g(\mathbf{x}) 、协方差为 h(x)h(\mathbf{x}) 的高斯分布,则 zz 可以表示:

z=h(x)ζ+g(x)ζN(0,I)z=h(\mathbf{x}) \zeta+g(\mathbf{x}) \quad \zeta \sim \mathcal{N}(0, I)

注:该技巧很巧妙,通过采样一个对模型参数无意义的实系数来获得对高维向量的采样,从而使整个神经网络可导。

图 18 重参数化示意图。
左图:没有重采样技巧时,需要从一个真实分布中采样高维向量,而采样过程不可导;右图:加入重采样技巧后,将原采样过程转变为对一个与模型无关的实系数采样,从而可以直接对均值和协方差向量进行反向传播。

该变分式自编码器架构的目标函数由上小节的最后一个方程式给出,其中理论期望由蒙特卡洛近似代替,该近似值在大多数情况下仅需单次采样。考虑这种近似并定义 C=1/(2c)C=1/(2c) 后,我们可以获得前述章节中直观得出的损失函数(图 19),该函数由一个重构项 xf(z)2\|x-f(\mathbf{z})\|^{2} 、一个正则项 KL[N(g(x),h(x)),N(0,I)]KL[N(g(\mathbf{x}), h(\mathbf{x})), N(0, I)] 和一个权重常数 CC 来定义。

图 21 变分自编码器的完整表示形式。

5. 总结

本文设计的主要知识点:

  • 降维是减少表示数据的某些特征量的过程,因此可以看作是编码过程。通常通过选择初始特征的子集(特征选择)或通过将其组合成数量更少的新特征(特征变换)来实现。
  • 自编码器是由编码器和解码器组成的神经网络体系结构,它们会创建一个瓶颈来处理数据,以达到降维的目的。自编码器的训练以在编码/解码过程中损失最少的信息为目标(即最小化重构误差),可通过梯度下降法迭代实现。
  • 由于过度拟合,自编码器的隐空间可能是非正则的,即隐空间中的邻近点可能产生截然不同的解码数据,甚至产生无意义的数据。过拟合使我们无法定义一个生成过程,使得仅从隐空间中采样一个点,仅能经过解码器获取新数据。
  • 变分自编码器 (VAE) 是一种自编码器,它的编码器返回隐空间中的一个分布而不是单个点,并在损失函数中添加一个对返回分布的正则项来解决隐空间非正则性的问题,以确保更好地组织隐空间。
  • 假设有一个简单的基本概率模型来描述数据,则可以详细推导由重构项和正则项组成的非常直观的 VAE 损失函数,尤其是使用变分推断技术(因此称为变分自编码器)

在过去的几年中,GAN 获得的关注远超 VAE。其中一个重要原因是:与 GAN 对抗训练的简洁概念相比,VAE 的理论基础(概率图模型和变分推断)复杂程度较高。希望通过本文分享宝贵的理论基础,使 VAE 更易于新人使用。

参考资料

[1] KL 散度的维基百科

[2] 变分自编码器原来是这么一回事

[3] 变分自编码器介绍、推导及实现

[4] 贝叶斯推断问题:变分推断与 MCMC