如何解释二元交叉熵损失函数?

数据挖掘 机器学习 深度学习 损失函数 自动编码器 乙状结肠
2022-03-06 11:49:42

我看到了一些sigmoid用作输出层和BinaryCrossentropy损失函数的自动编码器(在图像上)的例子。

自动编码器的输入被归一化 [0..1]sigmoid输出值(图像的每个像素的值)[0..1]

我试图评估的输出,BinaryCrossentropy我很困惑。

为简单起见,假设我们有图像 [2x2],我们运行自动编码器并得到 2 个结果。一个结果接近真值,第二个结果与真值相同:

import numpy as np
import tensorflow as tf

bce = tf.keras.losses.BinaryCrossentropy()

y_true = [0.5, 0.3, 0.5, 0.9]
y_pred = [0.1, 0.3, 0.5, 0.8]
print(bce(y_true, y_pred).numpy())

y_pred = [0.5, 0.3, 0.5, 0.9]
print(bce(y_true, y_pred).numpy())

结果:

0.71743906
0.5805602

如您所见,第二个示例(与真实值相同)得分较低(损失值较低,但仍然不是 0 或接近 0)。

看起来

似乎使用BinaryCrossentropy损失函数不会给我们最好的结果。(我们永远不会得到接近零的值)?

最佳值会接近 0.5 吗?

我错过了什么?

2个回答

二元交叉熵损失假设您尝试预测的值是 0 和 1,而不是像您的示例中那样在 0 和 1 之间连续。因此,即使预测值等于实际值,您的损失也不等于 0。在预测值等于真实值的情况下,使用 0 或 1 的值确实会返回零损失:

import torch
from torch.nn import BCELoss

loss = BCELoss()

true = torch.Tensor([0.5, 0.3, 0.5, 0.9])
pred = torch.Tensor([0.5, 0.3, 0.5, 0.9])

loss(true, pred)
# tensor(0.5806)

true = torch.Tensor([1, 0, 1, 1])
pred = torch.Tensor([1, 0, 1, 1])

loss(true, pred)
# tensor(0.)

二进制交叉熵旨在与取值的数据一起使用{0,1}(因此是二进制的)。损失函数由下式给出,

Ln=[ynlogσ(xn)+(1yn)log(1σ(xn))]
对于单个样本n(取自Pytorch文档)σ(xn)是预测的输出。

为了yn=0或者yn=1,作为函数的损失函数σ(xn)只有 0 如果σ(xn)=0或者σ(xn)=1,如下图所示。虽然这不是二元交叉熵损失的目的,但原则上你可以有一个目标值yn=0.5,并且损失将在σ(xn)=0.5,尽管损失不等于 0。

在下图中,我显示了损失函数L(σ(xn))对于目标的各种值yn在此处输入图像描述