如何根据 PyTorch 中的概率计算交叉熵?

kHa*_*hit 5 deep-learning cross-entropy pytorch loss-function

默认情况下,PyTorchcross_entropy采用 logits(模型的原始输出)作为输入。我知道将(log(softmax(x))) 和(负对数似然损失)CrossEntropyLoss结合在一个类中。所以,我想我可以用如下方法从概率中获得交叉熵损失:LogSoftmaxNLLLossNLLLoss

真实标签:[1, 0, 1]
概率:[0.1, 0.9], [0.9, 0.1], [0.2, 0.8]

在此输入图像描述

其中,y_i,j表示真实值,即如果样本i属于类别,则为1 j,否则为 0。并表示属于 类 的p_i,j样本模型预测的概率。ij

如果我手工计算的话,结果是:

>>> -(math.log(0.9) + math.log(0.9) + math.log(0.8))
0.4338
Run Code Online (Sandbox Code Playgroud)

使用 PyTorch:

>>> labels = torch.tensor([1, 0, 1], dtype=torch.long)
>>> probs = torch.tensor([[0.1, 0.9], [0.9, 0.1], [0.2, 0.8]], dtype=torch.float)
>>> F.nll_loss(torch.log(probs), labels)
tensor(0.1446)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?为什么答案不同?

Alp*_*rcı 7

PyTorch 中的所有损失函数都有一个归约参数。正如您从文档中看到的,默认缩减参数是“mean”,它将总和除以批次中的元素数量。要获得所需的求和行为 (0.4338),您应该给出如下的缩减参数:

F.nll_loss(torch.log(probs), labels,reduction='sum')
Run Code Online (Sandbox Code Playgroud)