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

Posted

技术标签:

【中文标题】如何根据 PyTorch 中的概率计算交叉熵?【英文标题】:How do I calculate cross-entropy from probabilities in PyTorch? 【发布时间】:2020-05-26 17:13:06 【问题描述】:

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

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

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

如果我手动计算,结果是:

>>> -(math.log(0.9) + math.log(0.9) + math.log(0.8))
0.4338

使用 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)

我做错了什么?为什么答案不一样?

【问题讨论】:

【参考方案1】:

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

F.nll_loss(torch.log(probs), labels,reduction='sum')

【讨论】:

以上是关于如何根据 PyTorch 中的概率计算交叉熵?的主要内容,如果未能解决你的问题,请参考以下文章

详解pytorch中的交叉熵损失函数nn.BCELoss()nn.BCELossWithLogits(),二分类任务如何定义损失函数,如何计算准确率如何预测

如何在 PyTorch 中计算自举交叉熵损失?

pytorch 中的交叉熵损失如何工作?

语义分割损失函数

pytorch nn.CrossEntropyLoss() 中的交叉熵损失

踩坑笔记(pytorch-bert,dataframe,交叉熵)