对于变分自动编码器,重建损失应该计算为图像上的总和还是平均值



我正在学习这个变分自动编码器教程:https://keras.io/examples/generative/vae/.

我知道VAE的损失函数包括比较原始图像和重建的重建损失,以及KL损失。然而,我有点困惑重建损失,以及它是在整个图像上(平方差之和(还是在每个像素上(平方差值的平均和(。我的理解是重建损失应该是每像素(MSE(,但我下面的示例代码将MSE乘以MNIST图像维度28 x 28。这是正确的吗?此外,我的假设是,这将使重建损失项明显大于KL损失,我不确定我们是否想要这样。

我试着去掉(28x28(的乘积,但这导致重建非常糟糕。从本质上讲,无论输入如何,所有重建看起来都是一样的。我可以使用lambda参数来捕捉kl发散和重建之间的折衷吗?或者这是不正确的,因为损失有一个精确的推导(而不是仅仅添加正则化惩罚(。

reconstruction_loss = tf.reduce_mean(
keras.losses.binary_crossentropy(data, reconstruction)
)
reconstruction_loss *= 28 * 28
kl_loss = 1 + z_log_var - tf.square(z_mean) - tf.exp(z_log_var)
kl_loss = tf.reduce_mean(kl_loss)
kl_loss *= -0.5
total_loss = reconstruction_loss + kl_loss

示例

我熟悉这个例子,我认为28x28乘法器是合理的,因为运算tf.reduce_mean(kl_loss)取图像中所有像素的平均损失,这将导致0和1之间的数字,然后将其乘以像素数量。以下是创建VAE的另一个外部训练循环。

问题是后部塌陷

以上不会是一个问题,因为它只是一个常数的乘积,如果不是因为你指出的KL散度项。KL损失起到正则化子的作用,该正则化子惩罚潜在的可变概率分布,当使用高斯组合进行采样时,这些潜在的可变可能性分布与编码器创建的样本不同。当然,问题来了,重建损失应该是多少,惩罚应该是多少。这是一个研究领域。考虑β-VAE,据称它通过增加KL损失的重要性来解开表示,另一方面,增加β过多,就会出现一种被称为后验塌陷的现象,即分子序列生成的重平衡变分自动编码器损失将限制为0.1以避免问题。但它甚至可能不像《惯犯》中解释的那么简单?重新评估VAE后部塌陷的责任。在诊断和增强VAE模型中提出了一个彻底的解决方案。在变分自动编码器中平衡重构误差和Kullback-Leibler发散建议有一种更简单的确定性(更好(的方法。

实验和扩展

对于像Minst这样简单的东西,尤其是那个例子,试着进行实验。保持28x28项,并将kl_loss任意乘以常数B,其中0<=B<28*28.在训练过程中遵循kl损失项和重建损失项,并将其与第一个参考图进行比较。

实际上没有必要乘以像素数。然而,是否这样做将影响拟合算法相对于其他超参数的行为方式:lambda参数和学习率。本质上,如果你想去掉28 x 28的乘积,但保持相同的拟合行为,你应该把lambda除以28 x 28,然后把你的学习率乘以28 x 28。我想你在问题中已经接近了这个想法,而你缺少的是对学习率的调整。

相关内容

  • 没有找到相关文章

最新更新