VAE学习笔记
VAE作为比GAN早的生成模型,虽然效果不如GAN,但是也是非常值得学习的,毕竟融合了VAE和GAN的模型也不少。
Autoencoding
在讲VAE之前,一定要先简单讲一下Autoencoding,因为VAE就是变分的Autoencoding。
在autoencoder模型中,我们加入一个编码器,它能帮我们把图片编码成向量。然后解码器能够把这些向量恢复成图片。
但是,我们想建一个产生式模型,而不是一个只是储存图片的网络。现在我们还不能产生任何未知的东西,因为我们不能随意产生合理的潜在变量。因为合理的潜在变量都是编码器从原始图片中产生的。所以就有了VAE模型。
VAE和AE的区别
和普通autoecoding比,VAE可以对编码器添加约束,就是强迫它产生服从单位高斯分布的潜在变量。因此,VAE的Encoder会输出两个向量,你可以把其中一个看成mean,另一个看成variance。同时还要加入一个误差error,这个error是从一个高斯分布sample出来的。最终把这3个向量合成成code,variance要乘上一个noise,然后加在mean上。
现在,产生新的图片也变得容易:我们只要从单位高斯分布中进行采样,然后把它传给解码器就可以了。
VAE为什么有作用
左边的图,对于普通的AE,如果在满月和弦月的code的中间调一个点,去做decode会得到什么?
答案是不确定,因为你对code的分布并没有任何的约束。
而VAE引入了noise,所以对于相同的input经过encoder后虽然得到的mean和variance是相同的,但是noise是不同的,所以会有一些较小的误差。
如右边的图,所以对于VAE在这样的一个误差范围内的点,而不是仅仅一个点都应该能decode到满月或弦月。
那么对于noise区间重合的地方,就会产生渐进的图,要同时和满月或弦月都比较相似,如最右图所示。
VAE损失函数
VAE的损失函数分为两部分,一部分。一方面,是图片的重构误差,我们可以用平均平方误差来度量,另一方面。我们可以用KL散度(KL散度介绍)来度量我们潜在变量的分布和单位高斯分布的差异。
首先,假定所有的数据都是独立同分布的(i.i.d),两个观测不会相互影响。我们要对生成模型做参数估计,
利用对数最大似然法,就是要最大化下面的对数似然函数:
VAEs用识别模型去逼近真实的后验概率,衡量两个分布的相似程度。具体推导如下:
log p θ ( x ( i ) ) = E z ∼ q ϕ ( z ∣ x ( i ) ) [ log p θ ( x ( i ) ) ] = E z ∼ q ϕ [ log p θ ( x ( i ) ∣ z ) p θ ( z ) p θ ( z ∣ x ( i ) ) ] = E z ∼ q ϕ [ log p θ ( x ( i ) ∣ z ) p θ ( z ) p θ ( z ∣ x ( i ) ) q ϕ ( z ∣ x ( i ) ) q ϕ ( z ∣ x ( i ) ) ] = E z ∼ q ϕ [ log p θ ( x ( i ) ∣ z ) ] – E z ∼ q ϕ [ q ϕ ( z ∣ x ( i ) ) p θ ( z ) ] + E z ∼ q