变分自动编码器(Variational Autoencoder)
描述神经网络的一种常见方式是用一些函数的近似来。这些可以保存信息的数据结构。
假设我们有一个由几个卷积层组成的网络。我们将输入设为一个向量。然后训练网络,以减少其自身和一个目标图像之间的均方误差。该图像的“数据”现在包含在网络的参数中。
现在,让我们用多个图像上试试。使用一个hot矢量来代替输入向量,[1, 0, 0,0 ]可能意味着猫形象,而(0, 1, 0,0)可能意味着狗。这里我们只能存储多达4个图像。使用较长的矢量意味着增加越来越多的参数,从而网络可以存储不同的图像。
为了解决这个问题,我们使用实数向量,而不是一个hot向量。我们可以认为这是一个图像编码,这是编码/解码的术语。例如,[3.3,4.5,2.1,9.8 ]可以表示CAT图像,而[3.4,2.1,6.7,4.2 ]可以表示狗。这个初始向量被称为我们的潜变量。
像我上面那样随机选择潜变量显然是个坏主意。在自动编码器中,我们添加另一个组件,将原始图像中的元素编码成向量。然后,解体层将这些矢量“解码”回原始图像。如下图所示:
现在我们到达了一个阶段,模型有一些实际使用的提示。我们可以根据我们想要的图像来训练网络。如果我们保存图像的向量编码,可以通过将其传递到解码器部分来重建它。这就是标准的自动编码器。
然而,我们试图在这里建立一个生成模型,而不仅仅是一个可以“记忆”图像的模糊数据结构。我们不能产生任何东西,因为我们不知道如何创建潜在的向量,而不是从图像编码它们。
这里有一个简单的解决方案。我们在编码网络上添加一个约束,强制它产生基本遵循高斯分布的潜在向量。正是这种约束将变分自编码器与标准自动编码器分离开来。
生成新的图像是容易的:我们所需要做的是从单位高斯上采样隐含矢量并将其传递到解码器。
在实践中,我们的网络是如何精确的,以及它的潜变量如何接近单位高斯分布之间存在一种权衡。
我们让网络自己来决定。对于我们的损失项,我们总结了两个单独的损失:生成损失,这是一个均方误差,测量网络重建图像的准确度,以及潜在损失,这是衡量潜在变量匹配单位高斯的KL散度。
generation_loss = mean(square(generated_image - real_image)) latent_loss = KL-Divergence(latent_variable, unit_gaussian) loss = generation_loss + latent_loss
为了优化KL divergence,我们需要应用一个简单的重新参数化技巧:代替生成真实值向量的编码器,它将产生均值向量和标准差向量.
计算KL divergence如下:
# z_mean and z_stddev are two vectors generated by encoder networklatent_loss = 0.5 * tf.reduce_sum(tf.square(z_mean) + tf.square(z_stddev) -tf.log(tf.square(z_stddev)) - 1,1)
当我们计算解码器网络的损失时,我们可以从标准偏差中取样并添加平均值,并将其作为我们的潜在向量:
samples = tf.random_normal([batchsize,n_z],0,1,dtype=tf.float32) sampled_z = z_mean + (z_stddev * samples)
除了允许我们产生随机潜变量,这个约束也提高了网络的泛化。
为了可视化这一点,我们可以把潜在变量看作数据的传递。
假设你在0, 10之间给出了一对实数,同时还有一个名字。例如,5.43意味着苹果,5.44意味着香蕉。当有人给你数字5.43时,你肯定知道他们在谈论一个苹果。我们可以用这种方式基本上编码无限信息,因为在我们之间可以有多少不同的实数没有限制(0, 10)。
然而,如果每个人试图告诉你一个数字时,加上一个高斯噪声会怎么样呢?现在,当你收到数字5.43时,原来的数字可能在任何地方(4.4~6.4),所以另一个人也可以说是香蕉(5.44)。
加上噪声的标准差越大,我们可以通过使用一个变量的信息越少。
现在我们可以将相同的逻辑应用到编码器和解码器之间传递的潜变量。我们可以更有效地编码原始图像,我们可以优化高斯上的标准差,直到它达到1。
这种约束迫使编码器是非常有效的,产生信息丰富的潜在变量。这可以提高了泛化,所以我们随机生成的潜在变量,或者从非训练图像编码z中获得,将在解码时产生更好的结果。
【描述来源:KVFRANS,URL:http://kvfrans.com/variational-autoencoders-explained/]
发展历史
描述
自从神经网络诞生以来,监督式的神经网络一直是研究人员的重点,同样的也取得很大的进步,监督式的神经网络越来越深,精确度也越来越高。但是非监督式的神经网络的进度大不如监督式的神经网络。但是近年来,非监督式的神经网络也飞速发展,这也得益于GAN,Auto-encoder等Generative model的发展和引入。
变分自编码器(Variational auto-encoder,VAE)是一类重要的生成模型(generative model),它于2013年由Diederik P.Kingma和Max Welling提出的。2016年Carl Doersch写了一篇VAE的教程中,对VAE做了更详细的介绍,比2013年文献更易懂。
Burda et al., 2015年提出importance- weighted autoencoder,重要加权自编码器目标也是log pmodel(x)的下界,并且随着k增加而变得更紧。2016年,Sønderby, C. K., Raiko, T.,等人提出Ladder variational autoencoders,它在ladder network中,通过数据之间依赖的可能性来改进生成的分布,实验表明,与分层变分自动编码器和其他生成模型的纯自底向上的推理相比,该模型能够获得更有效的预测似然函数和更严格的对数似下界。
在仅仅几年年的时间里,变分自动编码器(VAEs)已经成为最流行的一种非监督学习复杂分布的方法。VAEs具有吸引力,因为它们是建立在标准函数逼近器(神经网络)之上的,并且可以通过随机梯度下降来训练。VAEs已经展示了生成多种复杂数据的有效性,包括手写数字,faces,house numbers,CIFAR图像,场景的物理模型,分割,并通过静态图像预测未来。
主要事件
年份 | 事件 | 相关论文 |
2013 | Diederik P.Kingma和Max Welling首次提出变分自编码器 | Kingma, D. P., & Welling, M. (2013). Auto-encoding variational bayes. arXiv preprint arXiv:1312.6114. |
2016 | Doersch, C.对变分自编码器更加简化的介绍给读者 | Doersch, C. (2016). Tutorial on variational autoencoders. arXiv preprint arXiv:1606.05908. |
2016 | Sønderby, C. K., Raiko, T.,提出Ladder variational autoencoders | Sønderby, C. K., Raiko, T., Maaløe, L., Sønderby, S. K., & Winther, O. (2016). Ladder variational autoencoders. In Advances in neural information processing systems (pp. 3738-3746). |
发展分析
瓶颈
- VAE是直接计算生成图片和原始图片的均方误差而不是像GAN那样去对抗来学习,这就使得生成的图片会有点模糊。
- 它仅针对一个问题学习推断网络,给定x推断z。较老的方法能够在给定任何其他变量子集的情况下对任何变量子集执行近似推断,因为均匀场不动点方程指定如何在所有这些不同问题的计算图之间共享参数。
未来发展方向
VAE可以通过一些具有共性的规则:如旋转,光照等对图片的影响学习到他们共享的参数,使得应用于更多的模型中。初次之外,GAN和VAE都是很重要的生成学习,如何高效的结合两个算法的特性并且减小各自的短处也是目前很多研究人员的重点课题。
Contributor: Ruiying Cai