个人总结
实际上Vae有两个损失,一个是编码器映射的z要和标准正太分布一致,另一个就是生成的图片x’和对应原始图片的差值。
那么这样子就解释了为什么训练出来的解码器也就是生成器,无法生成脱离数据集的数据。原因在于我们之后用标准正太分布里面采样得来的点去输入到生成器时,由于之前已经被映射过了,所以只会生成到与之有映射关系的图片上面。如果说是输入一个不在标准正态分布上的点时,此时就可能只是产生一大堆噪声。
疑惑
如何理解生成模型的目标是最大化 p(x)
疑惑在于x表示观测数据,那p(x)就是表示观测数据的边缘分布,既然观测数据是个定值,那从何而来的最大化?
在 Variational Autoencoder(VAE)中,我们并不直接最大化一个已知的定值分布 p(x),因为 p(x) 是观测数据的真实分布,它是一个固定值。实际上,在 VAE 中,我们最大化的是一个下界(ELBO),而不是 p(x)。这个下界是用于训练生成模型的一种方法,通过最大化这个下界,我们间接地提高了生成数据的质量以使其更接近 p(x)。
为什么说最大化ELBO,就是提高了生成数据的质量使其分布接近p(x)呢?
p(x) * p(z) = p(x, z),然后p(x, z) = p(x|z) * p(z),那岂不是p(x)和p(x|z)相等了吗?但是显然不合理呀?
这两个公式都是正确的,区别就在于x和z之间是不是存在依赖关系。如果存在依赖关系,那么就用第二个公式(条件概率公式),如果没有关系,那就是说明x和z这两个事件是独立的,就用第一个公式。举个例子,比如说掷色子,当事件x是掷出1,z是掷出6,那此时两个事件没有联系,就可以用第一个公式。如果说事件z是掷出n,但此时我把事件x改成在z掷出n的条件下x掷出大于n的概率,那此时p(x)就没有意义了,因为事件x和z绑定在一起了,根本就不会有p(x)的说法了。
Vae为什么要让先验分布p(z)和后验分布p(z|x)尽可能相等呢?
后验分布其实就是我们要训练的编码器,相当于我是把x这个观测数据映射到标准正态分布上的一个点,也就是说想找一个分布把观测数据的分布映射过去,这样就可以在训练好整个vae后,反过来采样标准正态分布来映射到生成数据上,不出意外的话,生成数据的分布和原有数据的分布应该是近似一样的。KL 散度项 KL(q(z | x) || p(z)) 在 VAE 的损失函数中的作用就是促使后验分布接近先验分布。这意味着我们试图调整编码器网络,使其生成的后验分布 q(z | x) 在给定观测数据 x 的情况下与先验分布 p(z) 更为接近。
ELBO
这里具体还有些疑惑,不过结论就是VAE的损失有两个,一个是重构损失,就是输入一个图片x,经过decoder以后比较生成的图片和原始图片之间的一个差值,另一个损失就是编码器生成的z的分布和标准正态分布的KL散度。具体实现代码还没看,有机会看下;
参考资料
https://zhuanlan.zhihu.com/p/620113235?utm_id=0