自编码器(AutoEncoder)和变分自编码器(VAE)–(1)
在过去的几年中,由于一些惊人的进步,基于深度学习的生成模型越来越受到关注。依靠大量数据,精心设计的网络结构和训练技术,深度生成模型已经显示出了令人难以置信的能力,可以生成高度逼真的各种内容,例如图像,文本和声音。在这些深度生成模型中,有两个类别脱颖而出,值得特别关注:生成对抗网络(GAN)和变分自编码器(VAE)。当然这两类网络也不仅用于生成任务,还能用于约束隐空间变量等等。
相比于GAN,个人感觉变分自编码器的思想更具有深度(当然,GAN也是特别优秀的网络)。这篇文章就着重讲讲变分自编码器(Variational Autoencoder),分享我的学习收获和一些个人见解。
VAE是一种自编码器,在训练过程中其编码分布是规范化的,以确保其在隐空间具有良好的特性,从而允许我们生成一些新数据。术语“变分”源自统计中的正则化和变分推理方法。在学习VAE之前,有必要深入了解一下自编码器(AE),以及为什么AE不能用于生成任务。
1. 自编码器
在这部分中,我们讨论有关自编码器的相关知识。个人感觉,学习AE的核心,就是理解它encodering生成的隐空间。
1.2 自编码器
自编码器的网络结构和损失函数都比较简单,下图为AE的网络结构简要示意图:
AE网络主要分为两部分:
- Encoding部分:将input通过一个隐层全连接层运算得到低维度的特征表示,即图中的lower dimensional embedding。
- Decoder部分:将encoder生成的低维度特征表示重构成与input相同维度的数据(output)。decoder的网络结构其实是和encoder完全对称的。
损失函数:
AE的目的是重构输入数据,即输出与输入尽可能的相同,即:
l
o
s
s
=
∣
∣
x
i
n
p
u
t
−
x
o
u
t
p
u
t
∣
∣
2
=
∣
∣
x
i
n
p
u
t
−
D
(
E
(
x
i
n
p
u
t
)
)
∣
∣
2
loss = ||x _{input}- x_{output}||^2 = ||x _{input}- D(E(x _{input}))||^2
loss=∣∣xinput−xoutput∣∣2=∣∣xinput−D(E(xinput))∣∣2
其中
D
(
x
)
D(x)
D(x)代表decoder,
E
(
x
)
E(x)
E(x)代表encoder。这个loss又叫重构误差。
有了网络结构和对应的损失函数,就能通过梯度下降训练模型了,这里就不过多介绍。下面才是AE值得思考的地方。
1.2 自编码器的隐空间
自编码器当中的encoder的工作无非就是将input通过一定的运算(或叫投影)降维成维度更低的lower dimensional embedding。假设encoder网络结构都只有一层且没有非线性(即线性自编码器,做线性运算),那AE的工作不就等同于主成分分析(PCA)吗?
两者都在寻找最佳的线性子空间来投影数据,并且使信息损失尽可能少。用PCA(基向量正交)获得的编码和解码矩阵自然地也是梯度下降所能得到的一种解决方案,但是应该指出,这不是唯一的解决方案。实际上,可以选择几组不同的基向量来描述相同的最佳子空间,因此,几个不同的编码器/解码器对都可以提供最小的重构误差。此外,与PCA不同,对于线性自编码器,我们最终获得的新特征不必是独立的(网络结构以及损失函数中都没有加入正交性约束)。
现在,让我们进一步假设编码器和解码器都是深度非线性网络的。在这种情况下,网络结构越复杂,自编码器就可以进行更多的降维,同时保持较低的重构损失。直观地讲,如果我们的编码器和解码器具有足够的*度,则可以将任何初始维度减小为1。实际上,具有“无限大能力”的编码器理论上可以将我们的N个初始数据编码为1、2、3,…,最多N个(或更一般地说,为实轴上的N个整数),相关的解码器再进行逆变换,在这种过程中不会造成任何损失。
但是我们应该牢记两点。首先,在没有重建损失的情况下进行重要的降维通常会带来一个代价:隐空间中缺乏可解释和可利用的结构(缺乏规则性,lack of regularity)。其次,大多数时候,降维的最终目的不仅是减少数据的维数,而是要在减少维数的同时将数据主要的结构信息保留在简化的表示中。出于这两个原因,必须根据降维的最终目的来仔细控制和调整隐空间的大小和自编码器的“深度”(深度定义压缩的程度和质量)。
如上图所示,降维时我们希望保留主要信息。图中对中间的原始9维数据进行了两种降维,左边为降到了隐空间为1维(该维度表示生物性),这样丢失了很多信息;右边降到了隐空间为2维(分别表示生物性和飞行能力),丢失的信息大大减少。
1.3 自编码器用于内容生成的局限性
OK,讲到这里,似乎AE也能用于生成任务,根本不需要什么VAE呀。我在AE隐空间当中随机选取一个点,放入训练好的decoder不就能生成出对应的output了么?例如上文图中的例子,我在二维隐空间的第四象限当中随机选取一个点,放入decoder当中,模型不就能给我生成一个跟飞机类似的东西,可能是气球,火箭,宇宙飞船。但,别忘了上文加粗的那几个字当中的:AE隐空间缺乏规则性。
为了说明这一点,我们重用上文提及到的一种强大的编码器和解码器,可以将任何N个初始训练数据放到实轴上(每个数据点都被编码为实值)并可以没有任何损失地解码。在这种情况下,自编码器的高*度使得可以在没有信息损失的情况下进行编码和解码(尽管隐空间的维数较低)但会导致严重的过拟合,这意味着隐空间的某些点将在解码时给出无意义的内容,如下图所示。尽管这种精挑细选的一维例子太过极端,但可以注意到自编码器的隐空间规则性问题是普遍的,值得特别注意。
进入隐空间的编码数据之间缺乏结构是很正常的。我们训练的时候输入的数据是离散的(16*16的一张图片就是16*16维空间中的一个点),一个数据集也就是一个个的点,在训练过程中,网络很自然地会利用任何过拟合的可能性来尽可能地完成其任务(也就是只对这些点负责),模型通过训练只能确保隐空间中与输入空间对应的点重构是无误差的。在这些点之外的地方,我们都是任由模型*发挥,*拟合的(因为没有在损失函数加入规范化),点与点之间可能并没有做到平滑连接就会出现缺乏结构的情况。
正是因为如此,就有了VAE的诞生,写到这里发现内容有点多,那么VAE我们就到时再开一篇文章吧。
参考
https://zhuanlan.zhihu.com/p/144649293