3

我正在关注这个变分自动编码器教程:https ://keras.io/examples/generation/vae/ 。

我知道VAE的损失函数包括比较原始图像和重建的重建损失,以及KL损失。但是,我对重建损失以及它是在整个图像(平方差之和)还是每个像素(平方差的平均和)上有点困惑。我的理解是重建损失应该是每像素(MSE),但我遵循的示例代码将 MSE 乘以28 x 28MNIST 图像尺寸。那是对的吗?此外,我的假设是这会使重建损失项显着大于 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
4

2 回答 2

2

这个例子

我熟悉那个例子,我认为28x28乘数是合理的,因为该操作tf.reduce_mean(kl_loss)采用图像中所有像素的平均损失,这将导致 0 到 1 之间的数字,然后将其乘以像素。这是另一个用于创建 VAE 的外部训练循环。

问题是后部塌陷

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

实验和扩展

对于像 Minst 这样简单的东西,特别是那个例子,尝试试验。保留 28x28 项,并任意将 kl_loss 乘以B0 <= B < 28*28 的常数。在训练期间遵循 kl 损失项和重建损失项,并将其与第一个参考图进行比较。

于 2020-12-30T20:55:28.913 回答
0

实际上并不需要乘以像素数。但是,无论您是否这样做都会影响您的拟合算法相对于其他超参数的行为方式:您的 lambda 参数和学习率。本质上,如果您想删除乘以 28 x 28 但保留相同的拟合行为,您应该将 lambda 除以 28 x 28,然后将您的学习率乘以 28 x 28。我认为您已经在您的问题,而您缺少的部分是对学习率的调整。

于 2020-09-01T01:43:24.373 回答