链接:https://kexue.fm/archives/5253

分布变换

通常我们会拿VAEGAN比较,的确,它们两个的目标基本是一致的——希望构建一个从隐变量它们的目的都是进行分布之间的变换。

变分自编码器:原来是这么一回事

生成模型的难题就是判断生成分布与真实分布的相似度,因为我们只知道两者的采样结果,不知道它们的分布表达式

 

那现在假设我们只有样本本身,没有分布表达式,当然也就没有方法算KL散度

虽然遇到困难,但还是要想办法解决的。GAN的思路很直接粗犷:既然没有合适的度量,那我干脆把这个度量也用神经网络训练出来吧就这样,WGAN就诞生了,详细过程请参考《互怼的艺术:从零直达WGAN-GP》。而VAE则使用了一个精致迂回的技巧。

 

VAE慢谈 

这一部分我们先回顾一般教程是怎么介绍VAE的,然后再探究有什么问题,接着就自然地发现了VAE真正的面目。

经典回顾 

首先我们有一批数据样本,

外的),这是一个终极理想的生成模型了。当然,这个理想很难实现,于是我们将分布改一改

变分自编码器:原来是这么一回事

 这里我们就不区分求和还是求积分了,意思对了就行。此时接下来就是结合自编码器来实现重构,保证有效信息没有丢失,再加上一系列的推导,最后把模型实现。框架的示意图如下:

变分自编码器:原来是这么一回事

 vae的传统理解

看出了什么问题了吗?如果像这个图的话,我们其实完全不清楚:究竟经过重新采样出来的距离函数)是很不科学的,而事实上你看代码也会发现根本不是这样实现的。也就是说,很多教程说了一大通头头是道的话,然后写代码时却不是按照所写的文字来写,可是他们也不觉得这样会有矛盾~

 

VAE初现

其实,在整个VAE模型中,我们并没有去使用后验分布)是正态分布!!

具体来说,给定一个真实样本中去。

这时候每一个的均值和方差呢?好像并没有什么直接的思路。那好吧,那我就用神经网络来拟合出来吧!这就是神经网络时代的哲学:难算的我们都用神经网络来拟合,在WGAN那里我们已经体验过一次了,现在再次体验到了。

于是我们构建两个神经网络还原回来。于是可以画出VAE的示意图:

变分自编码器:原来是这么一回事

事实上,vae是为每个样本构造专属的正态分布,然后采样来重构

 

分布标准化

让我们来思考一下,根据上图的训练过程,最终会得到什么结果。

首先,我们希望重构不过好在这个噪声强度(也就是方差)通过一个神经网络算出来的,所以最终模型为了重构得更好,肯定会想尽办法让方差为0。而方差为0的话,也就没有随机性了,所以不管怎么采样其实都只是得到确定的结果(也就是均值),只拟合一个当然比拟合多个要容易,而均值是通过另外一个神经网络算出来的。

说白了,模型会慢慢退化成普通的AutoEncoder,噪声不再起作用

别急别急,其实VAE还让所有的,那么根据定义

 变分自编码器:原来是这么一回事

这样我们就能达到我们的先验假设中采样来生成图像了。

 变分自编码器:原来是这么一回事

为了使模型具有生成能力,vae要求每个p(Z|X)都向正态分布看齐

那怎么让所有的额外的loss

变分自编码器:原来是这么一回事

因为它们分别代表了均值作为这个额外的loss,计算结果为

变分自编码器:原来是这么一回事

 

 

这里的补充loss,就不用考虑均值损失和方差损失的相对比例问题了。显然,这个loss也可以分两部分理解:

变分自编码器:原来是这么一回事

变分自编码器:原来是这么一回事

 

重参数技巧

变分自编码器:原来是这么一回事

重参数技巧

最后是实现模型的一个技巧,英文名是reparameterization trick,我这里叫它做重参数吧。其实很简单,就是我们要从反过来优化均值方差的模型,但是“采样”这个操作是不可导的,而采样的结果是可导的。我们利用

变分自编码器:原来是这么一回事

这说明是概率密度而不是概率。这时候我们得到:


于是,我们将从中采样的结果。这样一来,“采样”这个操作就不用参与梯度下降了,改为采样的结果参与,使得整个模型可训练了。

具体怎么实现,大家把上述文字对照着代码看一下,一下子就明白了~

 

后续分析

即便把上面的所有内容都搞清楚了,面对VAE,我们可能还存有很多疑问。

 

本质是什么 

VAE的本质是什么?VAE虽然也称是AE(AutoEncoder)的一种,但它的做法(或者说它对网络的诠释)是别具一格的。在VAE中,它的Encoder有两个,一个用来计算均值,一个用来计算方差,这已经让人意外了:Encoder不是用来Encode的,是用来算均值和方差的,这真是大新闻了,还有均值和方差不都是统计量吗,怎么是用神经网络来算的?

事实上,我觉得VAE从让普通人望而生畏的变分和贝叶斯理论出发,最后落地到一个具体的模型中,虽然走了比较长的一段路,但最终的模型其实是很接地气的它本质上就是在我们常规的自编码器的基础上,对encoder的结果(在VAE中对应着计算均值的网络)加上了“高斯噪声”,使得结果decoder能够对噪声有鲁棒性;而那个额外的KL loss(目的是让均值为0,方差为1),事实上就是相当于对encoder的一个正则项,希望encoder出来的东西均有零均值

 那另外一个encoder(对应着计算方差的网络)的作用呢?它是用来动态调节噪声的强度的。直觉上来想,当decoder还没有训练好时(重构误差远大于KL loss),就会适当降低噪声(KL loss增加),使得拟合起来容易一些(重构误差开始下降);反之,如果decoder训练得还不错时(重构误差小于KL loss),这时候噪声就会增加(KL loss减少),使得拟合更加困难了(重构误差又开始增加),这时候decoder就要想办法提高它的生成能力了。

 变分自编码器:原来是这么一回事

vae的本质结构

说白了,重构的过程是希望没噪声的,而KL loss则希望有高斯噪声的,两者是对立的。所以,VAE跟GAN一样,内部其实是包含了一个对抗的过程,只不过它们两者是混合起来,共同进化的。从这个角度看,VAE的思想似乎还高明一些,因为在GAN中,造假者在进化时,鉴别者是安然不动的,反之亦然。当然,这只是一个侧面,不能说明VAE就比GAN好。GAN真正高明的地方是:它连度量都直接训练出来了,而且这个度量往往比我们人工想的要好(然而GAN本身也有各种问题,这就不展开了)。

相关文章: