VAE (variational autoencoder)

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

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

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

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

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

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

VAE (variational autoencoder)

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

VAE (variational autoencoder)

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

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

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

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

VAE (variational autoencoder)

各种自编码的变形

VAE (variational autoencoder)

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 (variational autoencoder)

VAE为什么会有作用?

先看一种intuituive的解释,

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

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

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

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

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

VAE (variational autoencoder)VAE (variational autoencoder)

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

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

VAE (variational autoencoder)

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

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

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

所以还需要加一个约束

VAE (variational autoencoder)

这个约束的红,蓝部分,如果要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

VAE (variational autoencoder)

所以用reparameterization trick

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

VAE (variational autoencoder)

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

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

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

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

VAE (variational autoencoder)

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

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

VAE (variational autoencoder)

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

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

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

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

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

VAE (variational autoencoder)

虽然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连起来了?后面会说

VAE (variational autoencoder)

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

VAE (variational autoencoder)

这里看到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)

VAE (variational autoencoder)

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

VAE (variational autoencoder)

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

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

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

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

VAE (variational autoencoder)

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

VAE (variational autoencoder)

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

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

上一篇:MariaDB:SSL配置


下一篇:Luogu 1641[SCOI2010]生成字符串 - 卡特兰数