AE、VAE、VQ-VAE、GAN、Diffusion-生成模型系列

深度生成模型应用于图像、音频、视频合成和自然语言处理等不同领域。随着深度学习技术的快速发展,近年来出现了不同的深度生成模型。这导致了越来越多的兴趣,比较和评估这些模型的性能和适用性,以不同的领域。在本文中,我们旨在提供深度生成模型的全面比较,包括扩散模型,生成对抗网络(GAN)和变分自动编码器(VAE)。我将回顾它们的基本原则、优点和缺点。我的目标是提供对这些模型之间的差异和相似性的清晰理解,以指导研究人员和实践者为他们的特定应用选择最合适的深度生成模型。

GAN学习生成类似于训练数据集的新数据。它由两个神经网络,一个生成器和一个判别器组成。生成器接受从正态分布中采样的随机值并生成合成样本,而判别器尝试区分真实的和生成的样本。生成器被训练为产生可以欺骗判别器的真实输出,而 判别器 被训练为正确区分真实的和生成的数据。图1的最上面一行显示了它的工作方案。

AE包含一个编码器和一个解码器。在训练时,输入图像x会被编码成一个较短的向量z,再被解码回另一幅长得差不多的图像。网络的学习目标是让重建出来的图像和原图像尽可能相似。注意该模型只能做图像压缩,无法完成图像的生成任务。AE的编码器编码出来的向量空间是不规整的。也就是说,解码器只认识经编码器编出来的向量,而不认识其他的向量。如果你把自己随机生成出来的向量输入给解码器,解码器是生成不出有意义的图片的。AE不能够随机生成图片,所以它不能很好地完成图像生成任务,只能起到把图像压缩的作用。

VAE由编码器和解码器组成。编码器将高维输入数据映射成低维表示,而解码器试图通过将该表示映射回其原始形式来重构原始高维输入数据。编码器通过预测平均值和标准偏差向量来输出潜码的正态分布作为低维表示。图1的中间行演示了它的工作。

扩散模型包括正向扩散和反向扩散过程。前向扩散是一种马尔可夫链,它逐渐向输入数据中添加噪声,直到获得白噪声。这不是一个可以学习的过程,通常需要1000个步骤。逆扩散过程的目的是将正向过程逐步反向,去除噪声以恢复原始数据。使用可训练的神经网络来实现反向扩散过程。图1的最下面一行显示了这一点。

AE 自编码器

自编码器是一种无监督学习技术,它使用神经网络来寻找给定数据分布的非线性潜在表示。神经网络由两部分组成:编码网络(encoder) z=f(x) 和解码网络(decoder) ^x=g(z) 。

从模型图中可以很明显的看出,对于AutoEncoder模型,采取的是无监督训练的方式,对于输入的x经过一个Encoder层后得到一个特征向量z,再将该向量z通过一个Decoder层得到最终输出x%20%E2%80%99,通过最小化重构模型的输入x和模型的输出x%E2%80%99的误差作为损失函数训练模型得到一个较好的关于输入x的特征向量z,模型设计的初衷的获得一个对应于源数据x的一个低维特征向量z,在获得此向量的基础上可以应用在很多分类任务上,但是AE模型并不适用于生成任务。

尽管AE已经可以获得较好的向量表示,在还原任务上可以做出较好的效果,但其并不是一个生成式模型,这是因为对于一个生成模型而言,他一般需要满足两个条件限制:

1.生成模型的编码器和解码器是可以分离开的;

2.对于固定维度下任意采样出的编码,解码器都能产生一张真实且清晰的图片。

AE模型并不满足第二点的条件,举个例子来说,对于输入的全月图和半月图,通过对AE模型的训练可以很好的完成还原任务,但是我们对于二者特征向量中取一个点,对于一个正常的生成模型而言,应该生成一个介于全月和半月之间的图片。然而,对于真实的AE而言,它生成的结果要么是乱码要么就是异常模糊的图片。为什么会发生这种情况呢?因为模型在训练的时候并没有显性对中间变量z的分布p(z)进行建模,在模型训练时所采用的f(z)是有限的,而对于z所处的空间存在大量f(z)外的点而言模型是并不理解的,如果像该例子随机在全月和半月中采样一个点,大概率得到不能够生成有效图片的点。

变分自编码器 (VAE)

https://zhuanlan.zhihu.com/p/34998569

在 VAE 中,encoder不再直接输出 隐向量z,而是输出 隐向量z的分布 的 均值μ 与 标准差σ,再从这个分布中采样得到 隐向量z。

AE 将输入encode成隐空间里的单个点,而 VAE 则是将输入encode成隐空间里的分布(distribution)。

从encode单个点变成encode一个分布,这样就不太容易有空隙(gap)了。但是,训练过程中,为了尽可能减小 reconstruction loss,模型会学成:均值μ 相差很远,标准差σ 很小。这样一来,VAE 就跟 普通的AE 差不多了,仍然容易有空隙。而我们希望学到的 隐空间Z 是连续、稠密、聚在一团而又能很好分开(distinct)不同标签的。

为了避免这个问题,就在损失函数中加入了KL loss。这样,loss = reconstruction loss + KL loss。 KL loss 是 方差为μ,标准差为σ的分布N(μ, σ²) 与 标准正态分布N(0, 1) 的 KL散度(KL散度可以衡量两个概率分布之间的距离)。加入了 KL loss 后,隐空间Z 就会呈正态分布聚在一团。

VQ-VAE:向量量化

量化自编码器

VQ-VAE 与 VAE 的主要区别是:VAE 想学到 连续(continuous)的隐空间,而 VQ-VAE 想学到 离散(discrete)的隐空间。

VQ-VAE 通过向网络添加离散的 codebook 组件来扩展标准自编码器。codebook 是与相应索引关联的向量列表。它用于量化自编码器的瓶颈;将编码器网络的输出与 codebook 的所有向量进行比较,并将欧氏距离最接近的 codebook 向量喂给解码器。

这个 argminargmin 操作有点令人担忧,因为它相对于编码器是不可微分的。但在实践中,可以通过这样的方式将 decoder 的梯度直接传递给 encoder (encoder 和 codebook 向量的梯度设置为1,其他 codebook 向量梯度设置为0)。

然后,解码器的任务是重构来自该量化矢量的输入,就像在标准自编码器公式中那样。

生成多个codes

当解码器只能接受一组 codebook 向量作为输入时,人们怎么能指望它产生大量多样化的图像呢?

我们需要为每个训练点提供一个唯一的离散值,以便能够重建所有数据。如果情况确实如此,那么模型难道不会通过将每个训练点映射到不同的离散 code 来记住数据吗?

如果编码器只输出一个矢量,这的确会成为问题,但在实际的 VQ-VAE 中,编码器通常会产生一系列矢量。例如,对于图像,编码器可能会输出一个32×32 的矢量网格,每个网格都被量化,然后将整个网格送到解码器。所有向量都被量化为相同的 codebook,因此离散值的数量不会改变,但是通过输出多个codes,我们能够成倍地增加解码器可以构造的数据点的数量。

例如,假设我们正在处理图像,我们有一个尺寸为512的密码本,我们的编码器输出一个 32×32 的矢量网格。在这种情况下,我们的解码器可以输出 51232×32=29216 个不同图像!

当然,模型仍然可以记住训练数据,但是通过编码器中嵌入正确的归纳偏差(即对图像使用conv-net)和使用正确的隐变量结构(即用于图像的 32×32 网格),模型应该能够学习到一个很好地表示数据的离散空间。

VQ-VAE使用了如下方式关联编码器的输出与解码器的输入:假设嵌入空间已经训练完毕,对于编码器的每个输出向量ze(x),找出它在嵌入空间里的最近邻zq(x),把ze(x)替换成zq(x)作为解码器的输入。

学习 Codebook

就像编码器和解码器网络一样,codebook 通过梯度下降来学习的。理想情况下,我们的编码器将输出一个接近学习到的 codebook 向量。这里本质上存在一个双向问题:学习与编码器输出对齐的 codebook 向量和学习与codebook 向量对齐的编码器输出。

这两个问题可以通过向损失函数添加项来解决。整个VQ-VAE 损失函数是:

在这里,我们使用与上一节中相同的符号,sg[x]sg[x] 代表“停止梯度”。

第一项是标准的重构损失;第二项是 codebook 对齐损失,其目标是使所选的 codebook 矢量尽可能接近编码器输出。编码器输出有一个停止梯度运算符,因为这项仅用于更新 codebook。第三项与第二项类似,但它将停止梯度放在 codebook 向量上,因为它旨在更新编码器输出,让其尽可能接近 codebook 向量。这项称为codebook 损失,其对总体损失的重要性由超参数 ββ 调整。当然,如果有多个,则最后两项在模型的每个量化向量输出上取平均值。

这个损失函数基本上完成了我们对 VQ-VAE 的描述。

这样,我们可以完整地训练一个 VQ-VAE,能够重构一组不同的图像,这些图像与下图中的原始图像不同。我们还可以训练 VQ-VAE 来重构其他模态,如音频或视频。

优化编码器和解码器

为了优化编码器和解码器,我们先来制订一下VQ-VAE的整体优化目标。由于VQ-VAE其实是一个AE,误差函数里应该只有原图像和目标图像的重建误差。

VQ-VAE使用了一种叫做”straight-through estimator”的技术来完成梯度复制。这种技术是说,前向传播和反向传播的计算可以不对应。你可以为一个运算随意设计求梯度的方法。基于这一技术,VQ-VAE使用了一种叫做sg(stop gradient,停止梯度)的运算:

也就是说,前向传播时,sg里的值不变;反向传播时,sg按值为0求导,即此次计算无梯度。(反向传播其实不会用到式子的值,只会用到式子的梯度。反向传播用到的loss值是在前向传播中算的)。

GAN

GAN(Generative Adversarial Network)是一种由生成器和判别器组成的对抗性模型。生成器试图生成与真实数据相似的数据,而判别器则试图区分真实数据和生成器生成的数据。两个模型通过对抗训练来提高自己的性能,最终生成器可以生成高质量的数据。

Diffusion

Diffusion Models是一种基于概率的生成模型,它通过模拟数据的扩散过程来生成新的数据。这种模型的核心思想是将已有的数据视为初始状态,然后通过不断迭代的扩散过程,逐步生成新的数据。Diffusion Models的优势在于其理论基础较为严密,其背后的数学推导和概率理论较为深入。这使得Diffusion Models在一些特定的数据生成任务上具有较好的表现。

相比GAN来说,扩散模型训练更稳定,而且能够生成更多样的样本,OpenAI的论文Diffusion Models Beat GANs on Image Synthesis也证明了扩散模型能够超越GAN。简单来说,扩散模型包含两个过程:前向扩散过程反向生成过程,前向扩散过程是对一张图像逐渐添加高斯噪音直至变成随机噪音,而反向生成过程是去噪音过程,我们将从一个随机噪音开始逐渐去噪音直至生成一张图像,这也是我们要求解或者训练的部分。

扩散模型包括两个过程:前向过程(forward process)反向过程(reverse process),其中前向过程又称为扩散过程(diffusion process),如下图所示。无论是前向过程还是反向过程都是一个参数化的马尔可夫链(Markov chain),其中反向过程可以用来生成数据,这里我们将通过变分推断来进行建模和求解。

模型设计:

可以选择采用AutoEncoder架构来作为噪音预测模型。DDPM所采用的模型是一个基于residual block和attention block的U-Net模型。如下所示:

U-Net属于encoder-decoder架构,其中encoder分成不同的stages,每个stage都包含下采样模块来降低特征的空间大小(H和W),然后decoder和encoder相反,是将encoder压缩的特征逐渐恢复。U-Net在decoder模块中还引入了skip connection,即concat了encoder中间得到的同维度特征,这有利于网络优化。DDPM所采用的U-Net每个stage包含2个residual block,而且部分stage还加入了self-attention模块增加网络的全局建模能力。 另外,扩散模型其实需要的是T个噪音预测模型,实际处理时,我们可以增加一个time embedding(类似transformer中的position embedding)来将timestep编码到网络中,从而只需要训练一个共享的U-Net模型。具体地,DDPM在各个residual block都引入了time embedding,如上图所示。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注