VAE (variational autoencoder)

Understanding Variational Autoencoders (VAEs)
 
为何不能用AE的decoder来直接生成数据?
因为这里的latent space的regularity无法保证
右边给出的例子,AE只是保证training过程中的cases的这些离散点,会导致严重的overfitting,你选中其他点的时候,不知道会发生什么,因为对于latent space之前是没有任何约束的 

 

所以变分自编码的目的是,

a variational autoencoder can be defined as being an autoencoder whose training is regularised to avoid overfitting and ensure that the latent space has good properties that enable generative process.

 

 

 

前面讲的regularity指的是什么?

 

 

 

 

 

 
 

https://www.zhihu.com/question/41490383/answer/103006793 

自编码是一种表示学习的技术,是deep learning的核心问题

让输入等于输出,取中间的一层作为embedding, 即编码

对中间的隐层进行约束,就可以得到不同类型的编码

h<x,这就是普通的降维编码

h>x, 并且约束其稀疏性,就得到稀疏编码

自编码网络,可以理解为,

完成训练后,Decoder部分就没有用了

 

堆叠自编码器(Stacked Auto-Encoder, SAE)

我们可以把AE进行堆叠,这样就有些像deep learning

只是这里的训练是逐层逐个训练

 

各种自编码的变形

 

VAE (variational autoencoder)

https://www.cnblogs.com/wangxiaocvpr/p/6231019.html

https://www.bilibili.com/video/av10590361/?p=29

李宏毅机器学习

 

VAE的差别

和普通autoecoding比,

VAE的Encoder会输出两个向量,你可以把其中一个看成mean,另一个看成variance

同时还要加入一个误差error,这个error是从一个高斯分布sample出来的

最终把这3个向量合成成code,variance要乘上一个noise,然后加在mean上

 

VAE为什么会有作用?

先看一种intuituive的解释,

左边的图,对于普通的AE,如果在满月和弦月的code的中间调一个点,去做decode会得到什么?

答案是不确定,因为你对code的分布并没有任何的约束

而VAE引入了noise,所以对于相同的input经过encoder后虽然得到的mean和variance是相同的,但是noise是不同的,所以会有一些较小的误差

如右边的图,所以对于VAE在这样的一个误差范围内的点,而不是仅仅一个点都应该能decode到满月或弦月

那么对于noise区间重合的地方,就会产生渐进的图,要同时和满月或弦月都比较相似,如最右图所示

 

下图显示如何将original code转化为noise code

可以看到这里的variance是学习到的,这里之所以要exp是保证variance为正

好,那单纯的这样去训练是不是会产生我们希望的效果?

答案是不会的,因为惰性是存在万事万物中的,能简单解决,网络也不会把自己搞的很复杂

这里如果没有任何约束,那么训练出来只要variance全为0就ok了,这样就等同于普通的AE

所以还需要加一个约束

这个约束的红,蓝部分,如果要minimize,相减为0,这样就保证variance接近于1 (variance = exp(a))

可以看到这个约束本身就会保证有一定的noise存在

然后后面的m平方的项是,L2 regularization,正则项

 

变分自编码器(Arxiv Insights)

https://www.bilibili.com/video/av20165127/

这个视频解释为何要加上noise误差?

对于VAE,Encoder网络是生成mean vector,deviation,这就确定了一个分布,然后在这个分布上sample出一个latent vector作为code

这里的问题,怎么表达sample这个过程,因为后面需要做backpropagation

 

所以用reparameterization trick

这里就是用noise来模拟sample的过程

 

现在有了Intuitive的解释,VAE formal的解释是什么?

VAE作为生产模型,目的就是要能生成对象,比如图片,x

那么我们怎么判断x生成的好坏了?直观上来讲,就是看看这个图片和我们的样本是否一样,和我们常见的case是否一样,即P(x)是否大

比如下面的例子,生成pokemon,x越像一个pokemon,p(x)就越大

所以对于生成模型而言,最关键的是要求出P(x),有了P(x),只需要sampleP较大的x,就能得到比较合理的结果图片

P(x)又取决于选用什么模型,比如用混合高斯模型,

高斯混合,是有若干个高斯分布叠加成的,比如m个,

所以首先选中某个高斯的weight为p(m),p(x|m)就符合该选中的高斯分布

 

而VAE相当于一个,连续的高斯混合,即这里有无限个高斯分布

选择到某个高斯分布的weight为P(z), 符合标准高斯分布

z代表选中第z个高斯分布,然后P(x|z)的高斯分布的参数,mean,variance是通过nn求得

虽然z是个标准高斯,但只要nn足够复杂,得到的分布也可以是任意的

那么这里的Maximizing Likelihood,

对于P(x)的公式,P(z)是固定的,P(x|z)是需要求的

怎么求,用Maximizing Likelihood,就让所有x的P(x)达到最大,这里的log是为了把连乘变成连加

这里说的是VAE的decode部分,P(x|z)

但是光decode没法训练啊,所以还需要encode,所以再引入一个q(z|x)

这里怎么将decode和encode连起来了?后面会说

把q(z|x)加到公式中,最后得到一个low bound 

这里看到P(x),有Lb和一个KL决定

假设我们先固定其他部分,先调整q(z|x),由于q(z|x)和P(x)无关,所以调整q(z|x)不会改变P(x)整体的大小,只会改变Lb和KL的比例

如果调整q(z|x),让它尽量接近于p(z|x),那么KL项就接近于0,这时Lb就接近于P(x)

这样,我们再去调整P(x|z),来增加Lb,就等同于增加P(x)

 

那么现在的目标就是要max这个Lb,

最终Lb可以分解成两部分,

一部分是q(z|x)和P(z)的KL散度,这部分是要最小化的,因为前面有个负号,就是让q(z|x)和P(z)尽量接近,这样就把encode的输出和decode的输入连接上了

因为这里P(z)是个标准的高斯分布,这里就是让encode的输出,q(z|x)也变成一个标准的高斯分布

最小化这个KL就等同于最小化黄框中的约束,为什么要看paper

第二项,最大化底下的式子,

描述就是,给定一个x,通过q(z|x)sample一个z,然后使得P(x|z)最大,这个就是一个完整的auto-encoder的过程

这就从理论上formal的解释了,为何VAE这样做有效

 

posted on 2018-05-28 14:18  fxjwind  阅读(35008)  评论(5编辑  收藏  举报