损失函数自动编码器与变分自动编码器或 MSE 损失与二进制交叉熵损失

机器算法验证 神经网络 损失函数 张量流 自动编码器 变分贝叶斯
2022-02-08 01:46:36

当我们的标签向量中有实值条目(例如,在 0 和 1 之间浮动作为灰度值从 0 到 256 的标准化表示)时,我一直认为如果我们想测量之间的距离/误差,我们会使用 MSE(R2-loss)输入和输出或网络的一般输入和标签。另一方面,我也一直认为,只有在我们尝试预测概率并且地面实况标签条目是实际概率时才使用二元交叉熵。

现在,当使用通过 tensorflow 加载的 mnist 数据集时,如下所示:

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

每个条目都是一个 float32,范围在 0 和 1 之间。

自动编码器的 tensorflow教程使用 R2-loss/MSE-loss 来测量重建损失。

其中变分自动编码器的 tensorflow教程使用二元交叉熵来测量重建损失。

有人可以告诉我为什么,基于具有相同值的相同数据集(它们都是实际上代表像素值的数值),它们对自动编码器使用 R2-loss/MSE-loss,对变分使用 Binary-Cross-Entropy 损失自动编码器。

我认为不用说,这两个损失函数都应用于 sigmoid 输出。

3个回答

我不相信这里有某种深刻的、有意义的理由——这是一个在 MNIST 上运行的展示示例,它非常容错。


针对 MSE 进行优化意味着您生成的输出强度对称地接近输入强度。高于训练强度的惩罚与同等价值的低强度惩罚相同。


交叉熵损失是不对称的。

如果您的真实强度很高,例如 0.8,则生成强度为 0.9 的像素比生成强度为 0.7 的像素受到更多惩罚。

相反,如果它很低,例如 0.3,预测强度为 0.4 的惩罚低于预测强度 0.2。

你现在可能已经猜到了——只要基本事实不是二元的,交叉熵损失就会偏向于 0.5 。对于 0.5 的基本事实,每像素零归一化损失等于 2*MSE。

这显然是错误的!最终结果是您正在训练网络以始终生成比输入更模糊的图像。您正在积极惩罚任何可以提高输出清晰度的结果,而不是那些使输出清晰度更差的结果!


MSE 也不能幸免于这种行为,但至少它只是不偏不倚,没有偏向完全错误的方向

但是,在您开始编写具有相反偏差的损失函数之前 - 请记住,将输出推离 0.5 反过来意味着解码图像将具有非常硬的像素化边缘。

那就是 - 或者至少我非常强烈怀疑 - 为什么对抗性方法会产生更好的结果 - 对抗性组件本质上是(可能是变分的)自动编码器的可训练的“智能”损失函数。

讨论表明,在 VAE 案例中使用二元交叉熵主要是为了更好的优化行为。它运行良好的另一个原因是 MNIST 数据集大致遵循多元伯努利分布 - 像素值接近于零或一,并且二值化不会对其产生太大影响。有关这方面的更深入解释,请参阅在实值观察上使用伯努利 VAE

这取决于您如何假设可能性模型。换句话说,在变分自动编码器中,您寻求最小化ELBO(经验下限),其中包含 KL(q||p)它由编码器和称为重建误差的第二项管理Eq[logp(x|z)]由解码器管理并需要采样,这里是模型的选择p(x|z)发挥作用。如果您假设它遵循正态分布,那么您最终会得到MSE最小化,因为p(x|z)可以重新表述为p(x|x^)N(x^,σ),如果你假设一个多重分布,你将使用交叉熵。

只是从 Goodfellow 的书中摘录的一个旁注: 许多作者使用术语“交叉熵”来专门识别 Bernoulli 或 softmax 分布的负对数似然,但这是用词不当。任何由负对数似然组成的损失都是训练集定义的经验分布和模型定义的概率分布之间的交叉熵。例如,均方误差是经验分布和高斯模型之间的交叉熵。