了解交叉熵损失

Understanding Cross Entropy Loss

我看到很多关于 CEL 或二元交叉熵损失的解释,其中基本事实是 0 或 1,然后你得到如下函数:

def CrossEntropy(yHat, y):
    if yHat == 1:
      return -log(y)
    else:
      return -log(1 - y)

但是,当您的 yHat 不是离散的 0 或 1 时,我对 BCE 的工作方式感到困惑。例如,如果我想查看 MNIST 数字的重建损失,其中我的基本事实是 0 < yHat < 1 , 和我的预测也在同一个范围内,这对我的函数有什么影响?

编辑:

抱歉让我为我的困惑提供更多背景信息。在关于 VAE 的 PyTorch 教程中,他们使用 BCE 来计算重建损失,其中 yhat(据我所知,不是离散的)。参见:

https://github.com/pytorch/examples/blob/master/vae/main.py

实现有效...但我不明白在这种情况下 BCE 损失是如何计算的。

cross-entropy 损失仅用于分类问题:即,您的目标 (yHat) 是离散的。相反,如果您有回归问题,则像均方误差 (MSE) 损失这样的东西会更合适。您可以找到 PyTorch 库及其实现的各种损失 here

在 MNIST 数据集的情况下,您实际上有一个多类分类问题(您试图从 10 个可能的数字中预测正确的数字),因此二进制 cross-entropy 损失不适合,你应该改为一般 cross-entropy 损失。

无论如何,调查的第一步应该是确定您的问题是 "classification" 还是 "regression"。适用于一个问题的损失函数通常不适用于另一个问题。

编辑:您可以在 TensorFlow 网站上的 "MNIST for ML Beginners" tutorial 找到 MNIST 问题上下文中 cross-entropy 损失的更详细解释。

您通常不应将非二进制的 classes 集编码为介于 0 和 1 之间的值。在 MNIST 的情况下,如果您要将每个数字标记为 0、0.1、0.2,等等,这意味着 2 的图像与 0 的图像比 5 的图像更相似,这不一定是正确的。

一件好事是 "one hot encode" 您的标签,作为 0 的 10 元素数组。然后,将数字图像对应的索引设置为1。

如上所述,您将使用常规 cross-entropy 损失函数。然后,您的模型应该为每个样本输出一个条件概率向量,对应于每个可能的 class。可能使用了 softmax 函数。

交叉熵测量任意两个概率分布之间的距离。在您描述的内容(VAE)中,MNIST 图像像素被解释为像素为 "on/off" 的概率。在那种情况下,您的目标概率分布根本不是狄拉克分布(0 或 1),但可以具有不同的值。参见 the cross entropy definition on Wikipedia

以上述为参考,假设您的模型输出某个像素 0.7 的重建。这实质上是说您的模型估计 p(pixel=1) = 0.7,因此 p(pixel=0) = 0.3.
如果目标像素仅为 0 或 1,如果真实像素为 0 或 -log(0.7)(更小,则该像素的交叉熵将为 -log(0.3)值)如果真实像素为 1.
如果真实像素为 1,则完整公式为 -(0*log(0.3) + 1*log(0.7)) 否则为 -(1*log(0.3) + 1*log(0.7))。

假设您的目标像素实际上是 0.6!这实质上是说像素有 0.6 的概率打开和 0.4 关闭。
这只是将交叉熵计算更改为 -(0.4*log(0.3) + 0.6*log(0.7)).

最后,您可以简单地 average/sum 这些 per-pixel cross-entropies 在图像上。