这是用户在 2024-7-6 17:58 为 https://zhuanlan.zhihu.com/p/698502893 保存的双语快照页面,由 沉浸式翻译 提供双语支持。了解如何保存?
重新发现VAE(Variational Autoencoders)

重新发现VAE(Variational Autoencoders)

ycz 等 215 人赞同了该文章
发布于 2024-05-19 00:38・IP 属地福建

ICLR2024评选的首个时间检验奖本月初公布了。冠军颁给Diederik Kingma, Max Welling于2014年发表的变分自动编码器VAE。这篇跨越十年的论文,是今天以diffusion扩散模型在内的生成模型的重要起点,才有了今天的DALL-E3、Stable Diffusion,包括今年openAI发布的Sora都是建立在VAE的基础之上。此外,在音频、文本、生成模型领域都有广泛应用,是深度学习中的最为重要的技术之一。论文一作Kingma曾经担任openAI的创始成员也是著名的Adam优化器的作者。

ICLR2024给出的获奖理由是概率建模是对世界进行推理的最基本方式之一。这篇论文率先将深度学习与可扩展概率推理(通过所谓的重新参数化技巧摊销均值场变分推理)相结合,从而催生了变分自动编码器 (VAE)。这项工作的持久价值源于其优雅性。用于开发 VAE 的原理加深了我们对深度学习和概率建模之间相互作用的理解,并引发了许多后续有趣的概率模型和编码方法的开发。这篇论文对于深度学习和生成模型领域产生了重大影响。站在2024年的今天,我们似乎已经习惯了生成式AI给我们带来的种种惊喜,但是我个人认为我们非常有必要回顾一下十年前这篇论文的横空出世具体意味着什么,因此就有了这篇文章的内容,我想通过这篇文章给各位读者详细介绍一下VAE诞生的背景,VAE实现的具体原理,以及VAE被用来解决那些问题。接下来就让我们跟随时间的脚步,重温这篇经得起时间检验的经典模型,重新发现VAE的巨大价值!本文主要是在Understanding Variational Autoencoders (VAEs) | by Joseph Rocca | Towards Data Science基础之上结合本人的一点浅显理解而成,感谢Joseph Rocca大神的无私分享。

VAE的核心思想是把隐向量看作是一个概率分布。具体而言,编码器(encoder)不直接输出一个隐向量,而是输出一个均值向量和一个方差向量,它们刻画了隐变量的高斯分布。这样一来,我们就可以从这个分布中随机采样隐向量,再用解码器(decoder)生成新图片了。

简而言之,VAE是一个自动编码器,其编码分布在训练期间被规范化,以确保其潜在空间具有良好的属性,使我们能够生成一些新数据。可以提出很多问题。什么是自动编码器?什么是潜空间,为什么要规范它?如何从VAE生成新数据?VAE和变分推理之间有什么联系?为了尽可能地描述清楚VAE,本文将带着各位读者抽丝剥茧通过回答这一系列问题,来帮助大家逐步构建起这些概念的具体含义。


背景知识

在开始介绍VAE的一系列概念之前,我们需要先学习和了解一些基础背景知识,主要包括Dimensionality Reduction降维, PCA主成分分析以及autoencoders自动编码器。

Dimensionality Reduction 降维

在机器学习(machine learning)中,降维特指减少描述某些数据的特征数量的过程。这种减少过程可以通过选择保留一些现有特征或提取基于旧特征创建较少数量的新特征来完成,这也是传统机器学习的特征工程中常见的处理方式。并且在许多需要低维数据(包括数据可视化、数据存储、多重计算等)的情况下非常有用。尽管存在许多不同的降维方法(例如LDA),但我们可以设置一个与大多数方法相匹配的全局框架。

如果我们将编码器(encoder)称为从“旧特征”表示(通过选择或提取)生成“新特征”表示的过程,那么其反向过程称为解码器(decoder)。降维就可以解释为数据压缩的过程,其中编码器压缩数据从初始空间到编码空间也称为潜空间(latent space),而解码器的工作就是把被压缩大片潜空间的数据进行解压缩的过程。当然,根据初始数据分布、潜空间维度和编码器定义,这种压缩可能是有损的,这意味着部分信息在编码过程中回丢失,在解码时无法完全恢复。

降维方法的主要目的是在给定系列中找到最佳编码器/解码器对(encoder/decoder pair)。换句话说,对于一组给定的可能的编码器和解码器,我们正在寻找在编码时保持最大信息的对,因此在解码时具有最小的重建误差。如果我们分别用 E 和 D 表示我们正在考虑的编码器和解码器系列,那么降维问题就可以写成:

\left(e^{*}, d^{*}\right)=\underset{(e, d) \in E \times D}{\arg \min } \epsilon(x, d(e(x)))

其中: \epsilon(x, d(e(x))) 定义了给定输入数据 x 和编码解码数据 d(e(x)) 之间的重建误差度量。在下文中,我们将N 用来表示数据的数量,n_d表示初始(解码)空间的维度,n_e表示缩减(编码)空间的维度。

Principal Components Analysis 主成分分析(PCA)

在谈到降维时,机器学习研究者(machine learner)首先想到的方法之一是主成分分析(PCA)。这里我们对 PCA 的工作原理先做一个简要的概述,以方便后续更好的理解与自动编码器的联系。

PCA 的思想是构建n_e新的独立特征,这些特征是n_d旧特征的线性组合,因此这些新特征定义的子空间(注意这里的空间并非指的是物理空间概念,而是数学的向量空间概念)上的数据投影尽可能接近初始数据(用欧几里得距离表示)。换句话说,PCA正在寻找初始空间的最佳线性子空间(由新特征的正交基础描述),以便通过它们在该子空间上的投影来近似数据的误差尽可能的小。

如图所示,PCA的工作就是从原始的空间中顺序地找一组相互正交的坐标轴,新的坐标轴的选择与数据本身是密切相关的。其中,第一个新坐标轴选择是原始数据中方差最大的方向,第二个新坐标轴选取是与第一个坐标轴正交的平面中使得方差最大的,第三个轴是与第1,2个轴正交的平面中方差最大的。依次类推,可以得到n个这样的坐标轴。通过这种方式获得的新的坐标轴,我们发现,大部分方差都包含在前面k个坐标轴中,后面的坐标轴所含的方差几乎为0。于是,我们可以忽略余下的坐标轴,只保留前面k个含有绝大部分方差的坐标轴。事实上,这相当于只保留包含绝大部分方差的维度特征,而忽略包含方差几乎为0的特征维度,实现对数据特征的降维处理。

在我们的体系中,我们所寻找的正是n_e中的E编码器,通过n_d矩阵(线性变换),其行是正交矩阵(特征独立性),以及n_e矩阵在n_d中的相关D解码器。可以证明,对应于协方差特征矩阵的n_e最大特征值(以范数为单位)的单位特征向量是正交的(或者可以选择正交),并定义了维数n_e的最佳子空间,以最小的近似误差投射数据。因此,这些n_e特征向量可以被选为我们的新特征,降维问题可以表示为特征值/特征向量问题。此外,还可以证明,在这种情况下,解码器矩阵是编码器矩阵的转置。

Autoencoders 自动编码器

理解了降维和PCA的概念之后,我们再来理解自动编码器就非常简单了,自动编码器简单来说就是使用神经网络进行降维。自动编码器的一般思想非常简单,包括将编码器和解码器设置为神经网络,并使用以梯度下降为代表的迭代优化方式来学习最佳编码-解码方案。因此,在每次迭代中,我们都会向自动编码器架构(编码器后跟解码器)提供一些数据,我们将编码解码后的输出与初始数据进行比较,并通过神经网络架构的误差反向传播算法来更新网络的权重。

简单来说,整个自动编码器架构(编码器+解码器)为数据创造了一个瓶颈,确保只有信息的主要结构化部分才能通过和重建。从我们的通用框架来看,编码器E由编码器网络架构定义,解码器D由解码器网络架构定义,编码器和解码器的搜索通过对这些网络参数的梯度下降来完成,以最小化重建误差。

首先假设我们的编码器和解码器架构都只有一个没有非线性的层(线性自编码器)。然后,这种编码器和解码器是可以表示为矩阵的简单线性变换。在这种情况下,我们可以看到与PCA的明确联系,就像PCA一样,我们正在寻找最佳的线性子空间来投射数据,同时尽可能减少信息丢失。用 PCA 获得的编码和解码矩阵自然定义了我们可以通过梯度下降达到的解决方案之一,但我们应该清晰的意识到这并非是唯一解。事实上,我们完全可以选择多个基来描述相同的最优子空间,因此,同时存在多个编码器/解码器对(encoder/decoder pair)可以给出最佳的重建误差。此外,对于线性自编码器,与PCA相反,我们最终获得的新特征不必是独立的(神经网络中没有正交性约束)。

现在,让我们假设编码器和解码器都是深度和非线性的。在这种情况下,神经网络的结构越复杂,自动编码器就越能实现高维降维,同时保持低重建损耗。直观地说,如果我们的编码器和解码器具有足够的高自由度,我们可以将任何初始维度降低到 1维。事实上,具有“无限功率”的编码器理论上可以获取我们的 N 个初始数据点并将它们编码为 1、2、3、......最多N和相关的解码器可以进行反向变换,在此过程中没有损失。当然这种情况仅存在与理想当中。

但是我们的目标并非是为了降维而降维。

  • 首先,没有重建损失的重要降维往往伴随着代价:潜空间中缺乏可解释和可利用的结构(缺乏规律性)。
  • 其次,大多数情况下,降维的最终目的不仅仅只是减少数据的维数,而是减少这些维数,同时将数据结构信息的主要部分保留在简化的表示中。

由于这两个原因,必须根据降维的最终目的仔细控制和调整潜空间的尺寸和自动编码器的“深度”(定义压缩的程度和质量)。

Variational Auto Encoders 变分自动编码器(VAE)

我们在上文已经介绍了自动编码器,这些自动编码器是可以通过梯度下降来进行训练的编码器-解码器架构。现在让我们与内容生成之间的关系,看看当前形式的自动编码器对这个问题的局限性,并介绍变分自动编码器。

自动编码器在内容生成方面的局限性

一旦自动编码器被训练,我们就同时拥有了编码器和解码器,但仍然没有真正的方法来生成任何新内容。乍一看,你可能会认为,如果潜在空间足够有规律(在训练过程中由编码器很好地“组织”),我们可以从该潜空间中随机获取一个点并对其进行解码以生成新的内容。

然而,正如我们在前面所讨论的,自动编码器潜在空间的规律性是一个难点,它取决于初始空间中数据的分布、潜空间的维度和编码器的架构。因此,要先验地确保编码器将以与我们刚才描述的生成过程兼容的智能方式组织潜空间是相当困难的。

假设我们拥有了一个理想的编码器和解码器,可以将任何 N 个初始训练数据放到实轴上(每个数据点被编码为一个实值)并解码它们而不会造成任何重建损失即可实现无损压缩与解压。在这种情况下,自动编码器的高度自由度使得编码和解码而不会丢失信息(尽管潜空间的维数较低),导致严重的过拟合,这意味着潜空间的某些点一旦解码就会产生无意义的内容。如果这个一维的例子被自愿选择为相当极端的例子,我们可以注意到,自编码器潜空间规律性的问题比这要普遍得多,需要特别注意。

我们只需仔细想一下,不难察觉其实在潜空间中编码的数据之间缺乏结构与规律是很正常的现象。事实上,在自动编码器的任务中,没有任何东西被训练来强制执行这样的组织:自动编码器只被训练为编码和解码,无论潜空间如何组织,都尽可能少地损失。因此,如果我们不小心架构的定义,那么在训练过程中,神经网络自然会利用任何过拟合的可能性来尽可能地完成其任务......除非我们明确地规范它!

Variational Auto Encoders变分自动编码器的定义

为了能够将自动编码器的解码器用于生成目的,我们必须确保潜空间保持足够规律性。而要解决规律性这个问题,首先可能解决方案是在训练过程中引入显式正则化。因此,变分自编码器可以定义为一个自编码器,其训练是正则化的,以避免过度拟合,并确保在潜空间具有支持生成过程的良好性能。

与标准自动编码器一样,变分自动编码器是一种由编码器和解码器组成的体系结构,经过训练可以最大程度地减少编码解码数据与初始数据之间的重建误差。然而,为了引入潜空间的一些正则化,我们需要对编码-解码过程进行轻微的修改:我们不是将输入编码为单个点,而是将其编码为潜在空间上的分布。然后,按如下方式训练模型:

  • 首先,输入被编码为在潜空间上的分布。
  • 其次,从该分布中抽取潜空间中的一个点。
  • 第三,对采样点进行解码,计算重构误差。
  • 最后,通过神经网络的误差反向传播算法重建误差。

在实践中,编码分布通常优先选择为正态分布,以便可以训练编码器返回描述这些高斯的均值和协方差矩阵。之所以将输入编码为具有一定方差的分布而不是单个点,是因为它可以非常自然地表达潜空间正则化:编码器返回的分布被强制接近标准正态分布。我们将在本文后面看到,我们以这种方式确保潜空间的局部和全局正则化(局部是因为方差控制,全局是因为均值控制)。

因此,在训练VAE时最小化的损失函数由一个“重建项”(在最后一层)和一个“正则化项”(在潜在层上)组成,前者倾向于使编码-解码方案尽可能高性能,后者倾向于通过使编码器返回的分布接近标准正态分布来正则化潜在空间的组织。该正则化项表示为返回分布和标准高斯分布之间的 Kulback-Leibler 散度简称KL散度,其公式为:

D_{K L}(p(x) \| q(x))=\int p(x) \log \left(\frac{p(x)}{q(x)}\right) d x

KL散度是用于比较两个分布之间的距离的衡量指标。可以看到两个高斯分布之间的KL散度具有闭合形式,可以直接用两个分布的均值和协方差矩阵表示。

关于正则化

为了使生成过程成为可能,从潜空间中期望的规律性可以通过两个主要属性来表示:连续性(潜空间中的两个紧密点在解码后不应给出两个完全不同的内容)和完整性(对于选定的分布,从潜空间采样的点一旦解码就应该给出“有意义的”内容)

VAE(变分自编码器)只是将输入编码为分布而不是简单的点,仅仅这一点是不足以确保连续性和完备性。如果没有明确定义的正则化项,模型为了最小化重构误差,可能会“忽略”返回的分布事实,并且表现得几乎像经典的自编码器一样会导致过拟合。为此,编码器可以返回方差极小的分布(这将趋向于是点分布),或者返回均值非常不同的分布(这将在潜空间中彼此相距甚远)。在这两种情况下,分布的使用方式都是错误的(取消了预期的收益),从而无法满足连续性和完整性。

因此,为了避免这些影响,我们必须正则化协方差矩阵和编码器返回的分布均值。在实践中,这种正则化是通过强制分布接近标准正态分布(居中和约简)来完成的。这样,我们要求协方差矩阵接近恒等式,防止准时分布,并且均值接近 0,防止编码分布彼此相距太远。

使用这个正则化项,我们防止模型在潜空间中对相距很远的数据进行编码,并鼓励返回的分布尽可能多地“重叠”,从而满足预期的连续性和完整性的条件。当然,对于任何正则化项,这是以训练数据更高的重建误差为代价的。然而,重建误差和KL散度之间的权衡是可以调整的,接下来在下一节中我们通过数学推导过程可以看到平衡是如何自然地出现的。

我们可以观察到,通过正则化获得的连续性和完整性倾向于在潜空间中编码的信息上产生“梯度”。例如,潜空间的一个点位于来自不同训练数据的两个编码分布的均值之间,应该在给出第一个分布的数据和给出第二个分布的数据之间的某个地方进行解码,因为在这两种情况下,自动编码器都可以对其进行采样。

The variational bound 变分边界的数学推导

VAE是自动编码器,它将输入编码为分布而不是点,其潜空间“组织”通过约束编码器返回的分布来规范化,使其接近标准高斯分布。在这一小节中,我们将给出 VAE 的更多数学推导过程,这样能够更严格地证明正则化项的合理性。

首先需要构建具有连续隐变量的概率图模型的lower bound来描述我们的数据。我们用 x 表示表示我们数据的变量,并假设 x 是由未直接观察到的潜在变量 z(编码表示)生成的。因此,对于每个数据点,假设生成过程为以下两个步骤:

1> 从先验分布p_{\theta} (\mathbb{z})随机采样生成\mathbb{z}^{(i)}

2> 从条件概率分布p_{\theta} (\mathbb{x}|\mathbb{z})中采样生成\mathbb{x}^{(i)}。但这个过程大部分都是隐藏的,难以求取。

这里的\theta指的是分布的参数,比如对于高斯分布就是均值和标准差。我们希望找到一个参数\theta^*来最大化生成真实数据的概率。这里p_\theta(\mathbf{x}^{(i)})可以通过对\mathbf{z}积分得到:

p_\theta(\mathbf{x}^{(i)}) = \int p_\theta(\mathbf{x}^{(i)}\vert\mathbf{z}) p_\theta(\mathbf{z}) d\mathbf{z} \\

而实际上要根据上述积分是不现实的,一方面先验分布p_{\theta}(\mathbf{z})是未知的,而且如果分布比较复杂,对\mathbf{z}穷举计算也是极其耗时的。为了解决这个难题,变分推断引入后验分布p_\theta(\mathbf{z}\vert\mathbf{x})来联合建模,即由每一个样本点\mathbb{x},可以学出一个对应的隐层分布\mathbb{z }(注意,此处为每一个样本均可学出其对应的隐层z分布);并使用p_{\theta} (\mathbb{x}|\mathbb{z})作为decoder过程进行解码,实现模型生成。

有了这样的概率模型,我们可以重新定义编码器和解码器的概念。事实上,与考虑确定性编码器和解码器的简单自动编码器相反,我们现在将考虑这两个对象的概率版本。“概率解码器”自然由 p_{\theta} (\mathbb{x}|\mathbb{z}) 定义,它描述了给定编码变量的解码变量的分布,而“概率编码器”由 p_{\theta} (\mathbb{z}|\mathbb{x}) 定义,它描述了给定解码变量的编码变量的分布。

根据贝叶斯公式,后验等于:

p_\theta(\mathbf{z}\vert\mathbf{x}) = \frac{p_\theta(\mathbf{x}\vert\mathbf{z})p_{\theta}(\mathbf{z})}{p_{\theta}(\mathbf{x})} =\frac{p_\theta(\mathbf{x}\vert\mathbf{z})p_{\theta}(\mathbf{z})}{\int p_\theta(\mathbf{x}^{(i)}\vert\mathbf{z}) p_\theta(\mathbf{z}) d\mathbf{z}}

现在让我们假设