理解出错之处望不吝指正。
今天听师兄给我们讲了VAE,觉得颇有收获,分享一下,希望大家批评指正。
生成模型
生成模型的目的是从一系列样本x={x1,x2,...,xm}中学习x的分布p(x),我们可以仿照EM算法,通过隐变量z和生成函数g()来得到x^=g(z),并尽可能的让x^接近x。
上述方法有一个弊端,我们首先依据全概率公式将p(x)写成如下形式:
p(x)=∑p(x∣z)p(z)
我们易获取到p(z),但是在z确定的情况下,无法得知p(x∣z),这意味着我们无法将 “利用g()函数生成的x^i” 与 “真实的xi” 进行对应,如下图所示:

那么怎么解决这个问题呢,接着往下看~
VAE模型
在VAE模型中,我们解决了上述问题。我们可以从两个角度理解VAE模型,首先是角度1。
理解角度1
为了解决上述问题,将学习p(x)改为学习p(z∣x)即可!
我们令p(z∣x)∼N(μ,σ2)(ps:为什么这个先验分布是正态分布呢?因为若是其他分布,后面计算KL散度的时候会导致分母为0)。则VAE的编码解码过程如下图所示:

更具体的,我们假设p(z∣x)∼N(0,1),即:我们在编码过程中期望学到μi=0,σi=1,则VAE的训练过程中会产生以下两种情况(类似于对抗):
1.若σi2→1,此时加在xi上的噪声大,会导致已有的解码能力效果变差,通过反向传播会使得σi2→0;
2.若σi2→0,此时加在xi上的噪声小,会导致已有的解码能力效果变好,通过反向传播会使得σi2→1;
VAE模型的损失函数如下:
Lvaep(z∣x)=loss(x,x^)+KL[N(μ,σ2)∣∣N(0,1)]
损失函数中第一部分loss(x,x^)代表真实数据x与生成数据x^之间的误差,可以使用简单的logistics损失或者MSE损失。
损失函数中第二部分是一个KL散度,用于衡量编码过程中得到的分布是否接近我们设置的先验分布N(0,1),下面对这部分进行详细的剖析。
KL[N(μ,σ2)∣∣N(0,1)]
=∫2πσ1exp{2σ2−(x−μ)2}⋅log2π1exp{2−x2}2πσ1exp{2σ2−(x−μ)2}dx
=21∫2πσ1exp{2σ2−(x−μ)2}⋅[−logσ2+x2−σ2(x−μ)2]dx
=21(−logσ2+μ2+σ2−1)
=21μ2+21(σ2−logσ2−1)
理解角度2
在理解角度1中,我们由于不能计算p(x∣z),所以将学习p(x)改为了学习p(z∣x),但是我们忽略了p(x)不仅可以使用全概率公式分解为p(x)=∑p(x∣z)p(z),还可将p(x)写为p(x)=∫p(x,z)dz,在这种情况下,我们假设先验分布为q(x,z),则我们的学习目标变为:令p(x,z)无限趋近q(x,z),如下所示:
KL[p(x,z)∣∣q(x,z)]
=∫∫p(x,z)logq(x,z)p(x,z)dzdx
将p(x,z)=p^(x)p(z∣x)带入上式,其中p^(x)代表利用已有的x值通过估计得到的分布,可得:
=∫p^(x)[∫p(z∣x)logq(x,z)p^(x)p(z∣x)dz]dx
=Ex∼p^(x)[∫p(z∣x)logq(x,z)p^(x)p(z∣x)dz]
将q(x,z)=q(z)q(x∣z)和p(z∣x)logq(z)p(z∣x)=KL[p(z∣x)∣∣q(z)]带入上式,可得:
=Ex∼p^(x){Ez∼p(z∣x)[−logq(x∣z)]+KL[p(z∣x)∣∣q(z)]}
我们可以发现,这样计算得到的公式中每一项可以和Lvaep(z∣x)中的每一项对应:
−logq(x∣z)⟷loss(x,x^)
KL[p(z∣x)∣∣q(z)]⟷KL[N(μ,σ2)∣∣N(0,1)]