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这样做有效