当我们需要根据已有数据,去生成和已有数据相似的样本时,最直观的办法就是去学习一个已有数据的分布P(X),然后我们从这个分布取样即可。
但是问题是,我们并不知道这个分布的表达式,这个分布需要什么参数。一个直接的办法是,我们通过一个神经网络去拟合这个分布。
那么这个神经网络的输入又是什么呢?一个直观的输入是我们需要输出的样本本身,而神经网络的输出则是这个样本出现的概率。
事实上,这个思路就是GAN中的Discriminator的思路。
P(X)不好得到(Why?)
因此,我们使用全概率公式$P(X) = \sum P(X|Z)P(Z)$。
它本质上就是在我们常规的自编码器的基础上,对 encoder 的结果(在VAE中对应着计算均值的网络)加上了“高斯噪声”,使得结果 decoder 能够对噪声有鲁棒性;而那个额外的 KL loss(目的是让均值为 0,方差为 1),事实上就是相当于对 encoder 的一个正则项,希望 encoder 出来的东西均有零均值。
由贝叶斯公式,我们有
$$ p(z|x) = \frac{p(x|z)p(z)}{p(x)} $$
考虑上述等式的分母$p(x)$,我们可以使用边缘分布的公式进行计算$p(x)=\int p(x|z)p(z)dz$,不过不幸的是