理解可变自动编码器背后的原理
生成模型是机器学习中一个有趣的领域,在这个领域中,网络学习数据分布,然后生成新的内容,而不是对数据进行分类。生成建模最常用的两种方法是生成对抗网络(GAN)和可变自编码器(VAE)。在这篇文章中,我将尝试解释可变自动编码器(VAE)背后的原理,以及它是如何生成上述面的数据的。
自编码器(AE)
我们将首先讨论自动编码器。Auto Encoder是一种自监督的神经网络,它学习如何将输入编码为更低的维数,然后再次解码和重构数据以尽可能有效地接近输入。
Autoencoder Autoencoder由3个部分组成:
- 编码器,将输入数据编码为较低维表示的层。
- 压缩层,包含编码/压缩表示的最低维数的层。也被称为瓶颈。
- 译码器,学会解码或重新构造编码表示到数据的层接近输入数据。
为了学习最好的编码和解码,自编码器的目标是使重构误差最小化,重构误差基本上是重构数据和输入数据之间的差值。
L2(平方)重构损失 注意,我们使用L2(平方)重建损失而不是L1。如果你想知道选择L2而不是L1背后的原理。
什么是自动编码器?
您可能认为自动编码器将用于压缩图像,但令人惊讶的是,它在压缩领域不是很流行,因为压缩算法的性能仍然更好。相反,这些是一些通用应用的自动编码器功能:
- 去噪:为了使自动编码器学会去噪图像,我们使用一个损坏或有噪声的图像作为输入,然后修改重建损失,使重建输出与原始干净的图像之间的差异最小,而不是损坏的输入。编码器的目标是只编码有用的特征,因此,随机噪声应在重建过程中丢失。
- 降维:通过使用输出层比输入层有更少维数的“不完全”自动编码器,自动编码器能够在更低维数的情况下非线性地表示数据,这与有限的线性变换的PCA(主成分分析)方法形成对比。
但是,如果我们想让我们的自动编码器生成新的数据,而不是仅仅给出一个类似的输出作为输入呢?我们将在下一节讨论这个问题。
自动编码器生成新的数据
使用Autoencoder生成新数据背后的想法是通过修改编码的数据(潜在向量),我们应该能够得到不同于输入的数据。为了简化这一点,让我们想象一下这样的场景:您试图将一些图像编码为2d编码,如下所示。
2D潜在空间 现在,为了生成一个新的图像,我们可以简单地从上面的潜在空间中采样一个点。例如,如果我们对狗和鸟之间的一个点进行采样,我们可能能够得到一张鸟和狗杂交的图像,或者一种新的动物。
然而,编码器生成的向量(编码)往往是不规则的、无组织的或不可解释的,因为它的目的只是重构尽可能相似的输入,而本身没有任何约束。因此,它不关心如何编码数据,只要它能完美地重构输入。
不规则潜在空间的随机点可能会产生无意义的结果[source:Joseph Rocca] 由于自动编码器模型可以自由地编码潜在向量,潜在空间可能会有很多区域,其中的空白区域会产生随机/不可解释的输出,如图中的空白区域所示。相反,我们希望具有有意义输出的潜在空间区域是连续的,而不是像下图那样是分开的,这样可以方便地在不同属性之间进行插值。
要获得具有良好性质的潜在空间,必须正则化返回的分布。 因此,可变自动编码器试图通过添加调节器来解决这一问题,避免过拟合,并确保潜在空间具有良好的连续性特征,使生成过程成为可能。
可变自动编码器(VAE)
可变自动编码器能够通过正则化潜在空间,使其像下面这样连续地生成新的数据,因此,允许在不同属性之间实现平滑的插值,并消除可能返回不理想输出的间隙。
CelebA数据集的潜在空间插值 但是VAE是如何将模型优化成这样的呢?
潜在空间 可变自动编码器以概率方式(分布)编码输入的潜在属性,而不是像普通的自动编码器那样以确定性方式(单值)编码。
想象一下上面的例子,自动编码器将图像编码为表示照片中的微笑的潜在属性(注意,在真实的训练中,我们不知道每个属性实际表示什么)。普通的自动编码器将为潜属性提供一个值,但变分自动编码器将潜属性存储为属性的概率分布,如上面的右图所示。
变量自动编码器(注意:在真实的训练中,我们不知道每个属性实际上代表什么,属性被标记为更容易理解) 现在,由于我们有了每个属性的概率分布,我们可以简单地从分布中抽取任何值来生成一个新的输出。
如何存储分布?
当我知道VAE将潜在变量存储为概率分布时我首先想到的问题是如何存储一个分布。
我们做了一个重要的假设来简化这个过程。我们假设潜在分布总是高斯分布。高斯分布可以很容易地用两个值来描述,即均值和方差或标准差(您可以从方差计算出标准差)。
高斯或正态分布[source] 现在,我们的编码器将输出我们想要的每个潜在维度的均值和方差,并从分布中抽取z来生成新的数据。
数学细节
现在我们将深入研究VAE的实施。我们将把x表示为输入数据,把z表示为潜在变量(编码表示)。在普通的自编码器中,编码器将输入x转换为潜在变量z,而解码器将z转换为重构的输出。而在可变自编码器中,编码器将x转换为潜在变量p(z|x)的概率分布,然后对潜在变量z随机采样,再由解码器解码成重构输出。
自编码器(确定性)和可变自编码器(概率性)的区别。 为了计算潜在分布p(z|x),可以利用贝叶斯公式得到
其中
不幸的是,计算p(x)是困难的,它通常是一个棘手的分布,这意味着它不能以封闭形式表示,这个问题不能用多项式算法来解决。
因此,我们将用可变推理方法来近似分布。基本上,我们将选择一些其他易于处理的分布q
来近似分布p
。为了做到这一点,我们希望q(z|x)
的参数与p(z|x)
非常相似。
Kullback Leibler散度(kl -散度)
为了使q(z|x)与p(z|x)相似,我们使用Kullback Leibler散度(kl -散度)最小化并计算两个分布之间的差值。kl散度是两个分布之间差异的度量。理解kl散度最简单的方法是通过可视化下图。
注:KL(p, q)为右侧红色曲线的积分。 从图中可以看出,在相同分布的交点处,kl -散度为0。因此,通过最小化kl散度,我们使这两个分布尽可能地相似。
最后,我们可以定义我们的损失函数如下。
第一项是重构损失,即重构输出与输入之间的差值,通常使用均方误差(MSE)。第二项是真实分布p(z)
与我们选择的分布q(z|x)
之间的kl散度,其中q
通常是一个均值和单位方差为零的正态分布N(0,1)。鼓励分布q(z|x)
在训练中接近真实分布p(z)
。
为什么同时使用重构损失和kl散度?
在讨论了kl散度之后,为什么我们仍然在整体损失函数中使用重构损失呢?为了理解损失函数背后的原理,以及重构损失和KL散度对潜在空间的影响。让我们看看下面的图表。
图像信用 只使用重构损失时潜在空间内部将有空隙,不真正代表任何有意义的数据。因此,可变自动编码器使用分布而不是最小的差异与kl -散度。但是,如果我们只专注于用我们的kl -散度损失项模拟先验分布,我们将会将每个单位描述为单位正态分布,而不能描述原始数据。
因此,通过使用两者的组合,我们将获得一个平衡,即拥有一个接近先验分布但仍然描述输入的某些特征的潜在表示。
重新参数化
在实现变分自动编码器时,您可能面临的一个问题是实现采样过程。在训练模型时,由于随机采样,不能进行反向传播。但是,我们可以使用一种称为“重新参数化”的技巧,通过分离随机进程来允许反向传播发生。
“再参数化技巧”是一种从单位正态分布中随机抽取单位的方法,将其与方差相乘,然后将其移至平均值,如下图所示。
重新参数化技巧最近与VAE相关的工作
虽然可变自编码器网络能够产生新的内容,但输出往往是模糊的。生成对抗网络(GAN)是构建生成模型的另一种方法,由于它能够生成更清晰的图像,尽管它在训练过程中可能相当不稳定,但它已经更受欢迎。
然而,最近从 NVIDIA发表的论文,NVAE:一个深度分级变分自动编码器,介绍了一种使用CelebA HQ的新的架构设计的VAE和管理生产高质量的面。
NVAE生成的256×256像素样本,在CelebA HQ上进行训练 此外,还有一种将自动编码器与GAN(如VAE-GAN和AAE)结合起来的想法。对抗式自动编码器(AAE)是一种类似于VAE的方法,但将kl -散度损失替换为对抗式损失,并已用于某些方面,如异常检测。总之,VAE仍然值得研究,并且在某些用例中非常适用。
鸣谢
我非常感谢Joseph Rocca和Jeremy Jodan,他们的文章解释了可变自动编码器的原理。他们的可视化辅助在帮助我理解和形象化概念方面非常有用。这些是我希望在未来能够制作的视觉辅助和清晰度。
引用
[1] Joseph Rocca. (2019). Understanding Variational Autoencoders (VAEs). Towards Data Science.
[2] Jeremy Jodan. (2018). Variational autoencoders. Jeremy Jodan.
[3] Jonothan Hui. (2018). GAN — Why it is so hard to train Generative Adversarial Networks!. Medium.
[4] Vahdat, A., & Kautz, J. (2020). NVAE: A Deep Hierarchical Variational Autoencoder. arXiv preprint arXiv:2007.03898.
本文演示地址:https://houxianxu.github.io/assets/project/dfcvae
VAE代码:https://github.com/udacity/deep-learning/blob/master/autoencoder/Simple_Autoencoder_Solution.ipynb
作者:Fathy Rashad
deephub翻译组:孟翔杰