PyTorch中的交叉熵
deep-learning
machine-learning
pytorch
7
0

我对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]

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

在此处输入图片说明

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

我尝试了诸如热编码的不同输入,但这根本不起作用,因此损失函数的输入形状似乎还可以。

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

提前致谢!

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

在您的示例中,您将输出[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

收藏
评论

我想添加一个重要说明,因为这通常会导致混乱。

Softmax不是损失函数 ,也不是激活函数。它有一个非常具体的任务:用于多类别分类,以标准化给定类别的分数。这样,我们得出每个类的概率总计为1

将Softmax与交叉熵损失结合起来以计算模型的损失。

不幸的是,由于这种组合非常普遍,因此通常被缩写。有些人使用术语Softmax-Loss ,而PyTorch仅称其为Cross-Entropy-Loss

收藏
评论

您的理解是正确的,但是pytorch不会以这种方式计算交叉熵 。 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考虑自然对数。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号