创建 VAE 的逻辑链
引言
在过去几年里,基于深度学习的生成模型在该领域取得了令人惊叹的进步,因而受到越来越多的关注。依靠海量数据、精心设计的网络架构和智能训练技术,深度生成模型在生成高度逼真的各类内容(如图像、文本和声音)方面展现出了惊人的能力。在这些深度生成模型中,有两个主要框架脱颖而出,值得特别关注: 生成对抗网络(GAN)和变异自动编码器(VAE)。
我们曾深入讨论过GAN,并特别展示了对抗训练如何将生成器和判别器这两个网络对立起来,推动它们不断迭代改进。现在,我们将在这篇文章中介绍另一种主要的深度生成模型: 变异自动编码器(VAE)。简而言之,VAE 是一种自动编码器,其编码分布在训练过程中被正则化,以确保其潜在空间具有良好的属性,从而让我们能够生成一些新数据。此外,’变分’一词源于统计学,与正则化和变分推理方法之间有密切关系。
如果说最后两句话很好地概括了自编码器(VAE)的概念,那么这两句话也会引发很多问题。什么是自动编码器?什么是潜空间,为什么要正则化它?如何从 VAE 生成新数据?VAE 与变分推理之间有什么联系?为了尽可能好地描述 VAE,我们将尝试回答所有这些问题(以及许多其他问题!),并为读者提供尽可能多的见解(从基本直觉到更高级的数学细节)。因此,这篇文章的目的不仅在于讨论变分自动编码器所依赖的基本概念,而且还在于从一开始就逐步建立导致这些概念的推理。
话不多说,让我们一起(重新)发现变分自动编码器吧!
概要
在第一节中,我们将回顾一些关于降维和自编码器的重要概念,这些概念将有助于理解变异自编码器。然后,在第二部分中,我们将说明为什么自编码器不能用于生成新数据,并介绍变异自编码器,它是自编码器的正则化版本,使生成过程成为可能。最后,在最后一节中,我们将基于变异推理对 VAE 进行更数学化的阐述。
注:在上一节中,我们尽量使数学推导完整、清晰,以弥合直觉与方程之间的差距。不过,不想深入了解 VAE 数学细节的读者可以跳过这一部分,而不会影响对主要概念的理解。还要注意的是,在这篇文章中,我们将用以下符号:对于随机变量 ,我们将用 表示该随机变量的分布(或密度,取决于上下文)。
降维、PCA 和自动编码器
在第一节中,我们将首先讨论一些与降维相关的概念。特别是,我们将简要回顾主成分分析(PCA)和自动编码器,说明这两个概念之间的关系。
什么是降维?
在机器学习中,降维 是减少描述某些数据的特征数量的过程。降维可以通过选择(只保留部分现有特征)或提取(根据旧特征创建数量减少的新特征)来完成,在许多需要低维数据的情况下,数据可视化、数据存储、减少计算量都非常有用。尽管存在许多不同的降维方法,但我们可以设定一个与多数降维方法相匹配的全局框架。
首先,我们把从’旧特征’表征中(通过选择或提取)生成 “新特征 ”表征的过程称为编码器,把反向过程称为解码器。降维可以解释为数据压缩,即编码器压缩数据(从初始空间压缩到编码空间,也称为静态空间),而解码器解压缩数据。当然,根据初始数据分布、潜在空间维度和编码器定义,这种压缩可能是有损的,即在编码过程中丢失了部分信息,在解码时无法恢复。
用编码器和解码器说明降维原理。
降维方法的主要目的是在给定的系列中找到最佳的编码器/解码器对。换句话说,对于一组可能的编码器和解码器,我们要寻找的是在编码时保持最大信息量,因此在解码时重构误差最小的一对。如果我们分别用 和 表示我们正在考虑的编码器和解码器族,那么降维问题可以写为:
其中:
定义了输入数据 和编码解码数据 之间的重构误差度量。最后请注意,在下文中,我们将用 表示数据的数量, 表示解码空间的维度, 表示编码空间的维度。
主成分分析(PCA)
说到降维,人们首先想到的方法之一就是主成分分析(PCA)。为了说明它如何与我们刚才描述的框架相匹配,并与自动编码器建立联系,我们先对 PCA 的工作原理做一个高度概括,将大部分细节放在一边(我们计划撰写一篇完整的文章来介绍这一主题)_。
PCA的原理是建立 个独立的新特征,这些新特征是 个旧特征的线性组合,这样数据在这些新特征定义的子空间上的投影就会尽可能地接近初始数据(就欧氏距离而言)。换句话说,PCA 寻找的是初始空间(由新特征的正交基描述)的最佳线性子空间,从而使数据在该子空间上的投影近似误差尽可能小。
主成分分析(PCA)是利用线性代数寻找最佳线性子空间。
换算到我们的全局框架中,我们要在 矩阵(线性变换)的族 中寻找一个编码器,其行是正交的(特征独立性),并在 矩阵的族 中寻找相关的解码器。可以证明,与协方差特征矩阵的 最大特征值(常模)相对应的单元特征向量是正交的(或可以选择为正交),并且定义了最佳的 维子空间,以最小的近似误差投射数据。因此,可以选择这些 特征向量作为我们的新特征,这样,降维问题就可以表示为特征值/特征向量问题。此外,还可以证明,在这种情况下,解码器矩阵是编码器矩阵的转置矩阵。
PCA 与我们描述的编码器-解码器框架相匹配。
自编码器
现在让我们来讨论自动编码器,看看如何利用神经网络来降低维度。自动编码器的总体思路非常简单,包括将编码器和解码器设置为神经网络,并使用迭代优化过程学习最佳的编码-解码方案。因此,在每一次迭代中,我们都会向自动编码器架构(编码器之后是解码器)输入一些数据,将编码-解码输出与初始数据进行比较,并通过架构反向传播误差,以更新网络的权重。
因此,直观地说,整个自动编码器架构(编码器+解码器)为数据创建了一个瓶颈,确保只有信息的主要结构部分可以通过并被重建。从我们的总体框架来看,所考虑的编码器系列 是由编码器网络结构定义的,所考虑的解码器系列 是由解码器网络结构定义的,通过对这些网络参数的梯度下降来搜索使重建误差最小的编码器和解码器。
自编码器及其损耗函数的示意图
首先假设我们的编码器和解码器结构都只有一层,没有非线性(线性自动编码器)。这样的编码器和解码器就是简单的线性变换,可以用矩阵来表示。在这种情况下,我们可以看到与 PCA 的明显联系:就像 PCA 所做的那样,我们正在寻找最佳的线性子空间来投射数据,同时尽可能减少信息损失。用 PCA 得到的编码和解码矩阵自然是我们通过梯度下降法得到的解决方案之一,但我们应该指出,这并不是唯一的解决方案。事实上,可以选择多个基础特征来描述相同的最佳子空间,因此,多个编码器/解码器对可以给出最佳重构误差。此外,对于线性自编码器来说,与 PCA 不同的是,我们最终得到的新特征并不一定是独立的(神经网络中没有正交性约束)。线性自动编码器与 PCA 之间的联系
现在,让我们假设编码器和解码器都是深度非线性的。在这种情况下,结构越复杂,自动编码器就越能在保持较低重构损失的同时进行高维度缩减。直观地说,如果我们的编码器和解码器有足够多的自由度,我们就可以将任何初始维度降为 1。事实上,理论上,一个 ‘能力无限’的编码器可以将我们的 个初始数据点编码为 1、2、3……直到 (或更广泛地说,实轴上的 个整数),而相关的解码器可以进行反向转换,并且在此过程中不会造成任何损失。
在此,我们需要注意两点。首先,重建无损失的重要降维往往是有代价的,潜空间中缺乏可解释和可利用的结构(缺乏规则性)。其次,在大多数情况下,降维的最终目的不仅仅是减少数据的维数,而是在减少维数的同时,保留降维表征中的大部分数据结构信息。基于这两个原因,必须根据降维的最终目的,仔细控制和调整潜在空间的维度和自动编码器的 “深度”(定义压缩的程度和质量)。在降维时,我们希望保留数据中存在的主要结构。
变异自动编码器
目前为止,我们已经讨论了降维问题,并介绍了可通过梯度下降训练的编码器-解码器架构–自动编码器。现在,让我们将其与内容生成问题联系起来,看看当前形式的自动编码器在该问题上的局限性,并介绍变异自动编码器。
自动编码器在内容生成方面的局限性
说到这里,我们自然会想到一个问题:’自动编码器与内容生成之间有什么联系?事实上,一旦自动编码器经过训练,我们就有了编码器和解码器,但仍然无法真正生成任何新内容。乍一看,我们可能会认为,如果潜在空间足够规则(在训练过程中被编码器很好地 “组织 ”起来),我们就可以从潜在空间中随机抽取一个点,然后对其进行解码,从而获得新的内容。解码器的作用或多或少就像生成对抗网络的生成器。
我们可以通过解码从潜在空间随机采样的点来生成新数据。生成数据的质量和相关性取决于潜在空间的规则性。
然而,正如我们在上一节中所讨论的,自动编码器潜空间的规则性是一个难点,它取决于初始空间中数据的分布、潜空间的维度和编码器的架构。因此,要先验地确保编码器将以一种与我们刚才描述的生成过程相匹配的智能方式组织潜空间是相当困难的。
为了说明这一点,让我们考虑一下我们之前举过的例子,在这个例子中,我们描述了一个编码器和一个解码器,它们足以将任意 个初始训练数据放到实轴上(每个数据点都被编码为一个实值),并在没有任何重构损失的情况下对它们进行解码。在这种情况下,自动编码器的高自由度使得编码和解码没有信息损失(尽管潜空间的维数很低),导致严重的过拟合,这意味着潜空间的某些点一旦解码就会给出无意义的内容。如果说这个一维的例子是自愿选择的极端例子,那么我们可以注意到,自动编码器潜空间正则性的问题要比这个例子普遍得多,值得特别关注。
不规则的潜空间阻碍了我们使用自动编码器生成新内容。
仔细想想,潜空间编码数据缺乏结构是很正常的。事实上,在训练自动编码器的任务中,没有任何一项任务会强制要求获得这样的组织结构: 不管潜空间是如何组织的,自动编码器的唯一训练目的就是在编码和解码时尽可能减少损失。因此,如果我们对架构的定义不谨慎,那么在训练过程中,网络自然会利用任何过拟合的可能性来尽可能好地完成任务……除非我们明确地对其进行正则化!
变分自动编码器的定义
因此,为了将自编码器的解码器用于生成目的,我们必须确保潜在空间足够正则。在训练过程中引入显式正则化是获得这种规则性的一个可行方案。因此,正如我们在本篇文章的引言中简要提到的,**变分自动编码器可以定义为一种自动编码器,其训练过程经过正则化处理,以避免过拟合,并确保潜在空间具有良好的特性,从而实现生成过程。
与标准自动编码器一样,变异自动编码器也是一种由编码器和解码器组成的结构,其训练目的是最小化编码解码数据与初始数据之间的重构误差。然而,为了对潜在空间进行正则化处理,我们对编码-解码过程稍作修改: 我们不再将输入编码为单点,而是将其编码为潜空间的分布。模型的训练过程如下:
-
首先,将输入编码为潜在空间上的分布 -
第二,从潜在空间的分布中抽取一个点 -
第三,对采样点进行解码,计算重构误差 -
最后,通过网络反向传播重构误差
自动编码器(确定性)与变异自动编码器(概率性)的区别。
在实践中,编码的分布被选择为正态分布,这样编码器就可以通过训练返回描述这些高斯分布的均值和协方差矩阵。之所以将输入编码为具有一定方差的分布而不是单点,是因为这样可以非常自然地表达潜空间正则化:编码器返回的分布必须接近标准正态分布。我们将在下一小节中看到,我们通过这种方法确保了潜空间的局部和全局正则化(局部正则化是因为方差控制,全局正则化是因为均值控制)。
因此,在训练 VAE 时最小化的损失函数是由一个 “重建项”(在最终层)和一个 “正则化项”(在潜层)组成的,前者的目的是使编码解码方案尽可能高效,后者的目的是通过使编码器返回的分布接近标准正态分布来规范潜空间的组织。正则化项用返回分布与标准高斯分布之间的Kullback–Leibler divergence表示,下一节将进一步说明。我们可以注意到,两个高斯分布之间的KL散度有一个封闭的形式,可以直接用两个分布的均值和协方差矩阵来表示。
在变分自动编码器中,损失函数由一个重建项(使编码-解码方案高效)和一个正则化项(使潜在空间正则化)组成。
关于正则化的直觉
为了使生成过程成为可能,潜空间的正则性可以通过两个主要属性来表达: 连续性(潜空间中两个接近的点在解码后不应该给出两个完全不同的内容)和完整性(对于选定的分布,从潜空间中采样的点在解码后应该给出 “有意义 ”的内容)。
“规则 “和 ”不规则 ‘潜空间之间的区别。
VAE 将输入编码为分布而非简单的点这一事实并不足以确保连续性和完整性。如果没有定义明确的正则化项,模型就会为了最小化重构误差而“忽略”返回的分布这一事实,表现得几乎与经典的自动编码器一样(导致过度拟合)。要做到这一点,编码器可以返回方差极小的分布(这将倾向于准时分布),或者返回均值相差极大的分布(这将在潜在空间中彼此相距甚远)。在这两种情况下,分布的使用方法都是错误的(抵消了预期收益),而且连续性和/或完整性也得不到满足。
因此,为了避免这些影响**,我们必须对编码器返回的分布的协方差矩阵和均值进行正则化**。在实践中,这种正则化是通过强制分布接近标准正态分布(居中和缩小)来实现的。这样,我们就要求协方差矩阵接近于同一性,以防止出现点状分布,同时要求均值接近于 0,以防止编码后的分布之间相差太大。
为了获得具有良好特性的潜空间,必须对 VAE 的返回分布进行正则化处理。
通过正则化项,我们可以防止模型在潜在空间中对相距甚远的数据进行编码,并鼓励返回分布尽可能地 “重叠”,从而满足预期的连续性和完整性条件。当然,对于任何正则化项来说,这都是以训练数据上更高的重构误差为代价的。不过,重建误差和 KL 散度之间的权衡是可以调整的,我们将在下一节看到如何从我们的正式推导中自然得出平衡的表达式。
在本小节的最后,我们可以看到,通过正则化获得的连续性和完整性倾向于在潜空间编码的信息上形成 “梯度”。例如,潜空间中的一个点位于来自不同训练数据的两个编码分布的均值之间,该点的解码应介于产生第一个分布的数据和产生第二个分布的数据之间,因为在这两种情况下,自动编码器都可能对其进行采样。
正则化倾向于在潜空间编码的信息上形成 “梯度”。
注: 顺便提一下,我们提到的第二个潜在问题(网络使分布相互远离)实际上与第一个问题(网络倾向于返回准时分布)几乎是等价的,只是尺度发生了变化:在这两种情况下,分布的方差相对于其均值之间的距离都变得很小。
VAE 的数学细节
在上一节中,我们给出了以下直观的概述: VAE 是将输入编码为分布而非点的自动编码器,其潜在空间的 “组织 ”是通过约束编码器返回的分布接近标准高斯分布来规范化的。在本节中,我们将从更数学的角度来看待 VAE,从而更严格地证明正则化项的合理性。为此,我们将建立一个清晰的概率框架,并特别使用变异推理技术。
概率框架和假设
首先,让我们定义一个概率图形模型来描述我们的数据。我们用 表示代表数据的变量,并假设 是由非直接观察到的潜在变量 (编码表示)生成的。因此,对于每个数据点,我们假设有以下两个步骤的生成过程:
-
首先,从先验分布 )中抽取一个潜在表示 -
第二,从条件似然分布 中采样数据 数据生成过程的图形模型。
考虑到这种概率模型,我们可以重新定义编码器和解码器的概念。事实上,与考虑确定性编码器和解码器的简单自动编码器不同,我们现在要考虑这两个对象的概率分布。概率解码器 “自然由定义,它描述了给定编码变量的解码变量的分布,而 ”概率编码器 ‘则由定义,它描述了给定解码变量的编码变量的分布。
在这一点上,我们已经可以注意到,我们在简单的自动编码器中缺乏的潜空间正则化在这里很自然地出现在数据生成过程的定义中:潜空间中的编码表示 z 确实被假定为遵循先验分布 。否则,我们也可以回顾一下著名的贝叶斯定理,它将先验 、似然 和后验 联系在一起:
现在我们假设 是标准高斯分布, 是高斯分布,其均值由 变量的确定性函数 定义,其协方差矩阵的形式为正常数 乘以同一矩阵 。函数 被假定属于一个函数族,用 表示,这个函数族暂不指定,稍后再选择。因此,我们有:
我们暂且认为 是定义明确且固定不变的。理论上,由于我们知道 和,我们可以使用贝叶斯定理计算 :这是一个经典的贝叶斯推断问题。然而,正如我们在上一篇文章中所讨论的,这种计算通常难以实现(因为分母处的积分),需要使用近似技术,如变分推理。
注 这里我们可以提到, 和 都是高斯分布。因此,如果我们有 ,这意味着 也应遵循高斯分布,理论上,我们可以 “只”尝试用 和 的均值和协方差矩阵来表示 的均值和协方差矩阵。然而,在实践中,这一条件并不满足,我们需要使用近似技术,如变分推理,使方法变得相当通用,并对模型假设的一些变化更加稳健。
变量推理公式
在统计学中,变分推理(VI)是一种近似复杂分布的技术。其原理是设定一个参数化的分布族(例如高斯分布族,其参数为均值和协方差),并在这个分布族中寻找目标分布的最佳近似值。族中的最佳元素是能使给定的近似误差测量值(多数情况下是近似值与目标值之间的库尔贝-莱布勒散度)最小化的元素,它是通过描述族的参数梯度下降找到的。
在这里,我们将用高斯分布 )来近似 ,其均值和协方差由参数 x 的两个函数 和 定义。因此,我们可以表示:
因此,我们用这种方法定义了变分推理的候选族,现在需要通过优化函数 和 (实际上是它们的参数)来找到这个族中的最佳近似值,从而使近似值与目标 之间的库尔贝-莱布勒散度最小化。换句话说,我们正在寻找最优的 和 ,使得:
在倒数第二个等式中,我们可以观察到在逼近后验 时,在最大化 “观测值 ”的可能性(第一项为最大化期望对数似然)和保持接近先验分布(第二项为最小化 ) 与 之间的 KL 散度)之间存在的权衡。这种权衡对于贝叶斯推理问题来说是很自然的,它表达了我们需要在对数据的信心和对先验的信心之间找到平衡。
到目前为止,我们一直假定函数 是已知和固定的,而且我们已经证明,在这种假定下,我们可以使用变分推理技术近似得到后验 。然而,在实际应用中,定义解码器的函数 并非已知,也需要进行选择。为此,让我们回顾一下,我们最初的目标是找到一种性能优越的编码-解码方案,其潜在空间足够规则,可以用于生成目的。如果规则性主要由潜在空间的先验分布决定,那么整个编码-解码方案的性能在很大程度上取决于函数 f 的选择。事实上,由于 和 可以(通过变分推理)近似得出 ,而且 是一个简单的标准高斯分布,因此在我们的模型中,只有参数 (定义似然方差)和函数 (定义似然均值)这两个杠杆可供我们优化使用。
因此,让我们考虑一下,正如我们之前所讨论的,我们可以为 F 中的任意函数 (每个函数定义了不同的概率解码器 )得到 )的最佳近似值,表示为 。尽管它具有概率性质,我们仍在寻找一种尽可能高效的编码-解码方案,因此,我们希望选择一个函数 ,当 从 中采样时,它能使给定 的 的期望对数似然最大化。换句话说,对于给定的输入 ,当我们从分布 ) 中对 进行采样,然后从分布 中对 进行采样时,我们希望最大化 的概率。
其中, 取决于函数 ,并如前所述得到。把所有的部分集合在一起,我们正在寻找最优的 , 和 ,使得:
我们可以在这个目标函数中找到上一节对 VAE 直观描述中引入的元素:x 和 f(z) 之间的重构误差,以及 和 (标准高斯)之间 KL 散度给出的正则化项。我们还可以注意到常数 ,它决定了前两个项之间的平衡。 越大,我们在模型中的概率解码器 周围假设的方差就越大,因此,我们就越倾向于正则化项而不是重构项(如果 越小,情况则相反)。
将神经网络引入模型
到目前为止,我们已经建立了一个依赖于三个函数 、 和 的概率模型,并使用变分推理表达了一个优化问题,以求得 、和 ,从而给出该模型的最优编码-解码方案。由于我们不能轻易地在整个函数空间内进行优化,因此我们对优化域进行了限制,并决定将 、 和 表述为神经网络。因此,、 和 分别对应于由网络结构定义的函数族,优化工作则在这些网络的参数上进行。
实际上, 和 并不是由两个完全独立的网络定义的,而是共享部分结构和权重,因此我们有:
由于定义了 的协方差矩阵, 应该是一个正方形矩阵。然而,为了简化计算并减少参数数量,我们做了一个额外的假设,即我们的 近似值 是一个具有对角协方差矩阵的多维高斯分布(变量独立性假设)。根据这一假设, 只是协方差矩阵对角元素的向量,大小与 相同。不过,这样我们就减少了变分推理所考虑的分布系列,因此得到的 近似值可能不那么精确。VAE 的编码器部分。
编码器部分对 p(z|x)进行建模,我们考虑的是均值和协方差都是 函数( 和 )的高斯,与此不同,我们的模型假定 是协方差固定的高斯。定义该高斯均值的变量 的函数 由神经网络建模,可表示如下:
VAE 的解码器部分
将编码器和解码器部分连接起来,就得到了整体结构。不过,在训练过程中,我们仍然需要非常小心地对编码器返回的分布进行采样。采样过程的表达方式必须允许误差在网络中反向传播。有一个简单的技巧,称为 “分离技巧”(reparametrisation trick),可用于使梯度下降成为可能,尽管随机采样发生在架构的半路上,它包括使用以下事实:如果 z 是一个遵循高斯分布的随机变量,其均值为 ,协方差为 ,那么它可以表示为:
重参数化技巧图解
最后,以这种方式获得的变分自动编码器结构的目标函数由上一小节的最后一个等式给出,其中理论期望值被一个或多或少准确的蒙特卡洛近似值所取代,该近似值在大多数情况下只包含一次抽取。因此,考虑到这一近似值,并表示 C = 1/(2c),我们可以恢复上一节直观得出的损失函数,它由一个重建项、一个正则化项和一个常数组成,常数用于定义这两个项的相对权重。
变异自动编码器表示法
收获
本文的主要启示如下:
-
降维是减少描述某些数据的特征数量的过程(要么只选择初始特征的一个子集,要么将它们组合成一个数量减少的新特征),因此可以看作是一个编码过程 -
自动编码器是一种由编码器和解码器组成的神经网络架构,它为数据创建了一个瓶颈,并在编码-解码过程中被训练为丢失最少的信息(通过梯度下降迭代训练,目的是减少重构误差)。 -
由于过度拟合,自动编码器的潜在空间可能极不规则(潜在空间中相近的点可能给出截然不同的解码数据,潜在空间中的某些点在解码后可能给出无意义的内容……),因此,我们无法真正定义一种生成过程,即简单地从潜在空间中采样一个点,并使其通过解码器得到新的数据 -
变异自动编码器(VAE)是一种自动编码器,它可以解决潜空间不规则的问题,方法是让编码器返回潜空间的分布而不是单个点,并在损失函数中加入一个正则化项,以确保更好地组织潜空间。 -
假设有一个简单的基本概率模型来描述我们的数据,那么就可以利用变异推理的统计技术(“变异 ”自动编码器由此得名),仔细推导出由重建项和正则化项组成的非常直观的 VAE 损失函数。
最后,我们可以概括地说,在过去几年中,GANs 比 VAEs 获得了更多的科学贡献。除其他原因外,社区对 GANs 表现出更大兴趣的部分原因是,VAE 的理论基础(概率模型和变分推理)的复杂程度高于作为 GANs 主导的对抗训练概念的简单程度。我们希望通过这篇文章,我们能够分享有价值的直觉和坚实的理论基础,使 VAE 更容易为新手所接受,就像我们今年早些时候对 GANs 所做的那样。不过,既然我们已经深入讨论了这两种方法,那么还有一个问题……您更喜欢 GANs 还是 VAE?
感谢您的阅读!