PyTorch中的交叉熵

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PyTorch中的交叉熵相关的知识,希望对你有一定的参考价值。

我对PyTorch中的交叉熵损失感到有些困惑。

考虑这个例子:

import torch
import torch.nn as nn
from torch.autograd import Variable

output = Variable(torch.FloatTensor([0,0,0,1])).view(1, -1)
target = Variable(torch.LongTensor([3]))

criterion = nn.CrossEntropyLoss()
loss = criterion(output, target)
print(loss)

我希望损失为0.但我得到:

Variable containing:
 0.7437
[torch.FloatTensor of size 1]

据我所知,交叉熵可以像这样计算:

enter image description here

但不应该是1 * log(1)= 0的结果?

我尝试了不同的输入,如单热编码,但这根本不起作用,所以看起来损失函数的输入形状是可以的。

如果有人可以帮助我并告诉我我的错误在哪里,我将非常感激。

提前致谢!

答案

在您的示例中,您将输出[0,0,0,1]视为交叉熵的数学定义所要求的概率。但PyTorch将它们视为输出,不需要求和为1,并且需要首先将其转换为使用softmax函数的概率。

所以H(p,q)变成: H(p,softmax(输出))

将输出[0,0,0,1]转换为概率: softmax([0,0,0,1])= [0.1749,0.1749,0.1749,0.4754]

何处: -log(0.4754)= 0.7437

另一答案

你的理解是正确的,但是pytorch不会以这种方式计算cross entropy。 Pytorch使用以下公式。

loss(x, class) = -log(exp(x[class]) / (sum_j exp(x[j])))
               = -x[class] + log(sum_j exp(x[j]))

因为,在你的场景中,x = [0, 0, 0, 1]class = 3,如果你评估上面的表达式,你会得到:

loss(x, class) = -1 + log(exp(0) + exp(0) + exp(0) + exp(1))
               = 0.7437

Pytorch考虑自然对数。

另一答案

我想补充一个重要的注意事项,因为这往往会导致混乱。

Softmax不是一种损失函数,也不是真正的激活函数。它有一个非常具体的任务:它用于多类分类,以规范给定类的分数。通过这样做,我们得到总和为1的每个类的概率。

Softmax与Cross-Entropy-Loss结合使用来计算模型的损失。

不幸的是,因为这种组合很常见,所以通常会缩写。有些人使用术语Softmax-Loss,而PyTorch称之为Cross-Entropy-Loss。

以上是关于PyTorch中的交叉熵的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

Pytorch - 使用一种热编码和 softmax 的(分类)交叉熵损失

PyTorch 交叉熵损失函数内部原理简单实现

在pytorch中使用交叉熵损失时我应该使用softmax作为输出吗?