交叉熵对具有相同分布的向量产生不同的结果

Cross entropy yields different results for vectors with identical distributions

我正在训练一个神经网络来区分三个类。当然,我选择了 PyTorch 的 CrossEntropyLoss。在实验过程中,我意识到当 Softmax 层放在模型末尾时,损失明显更高。所以我决定进一步试验:

import torch
from torch import nn

pred_1 = torch.Tensor([[0.1, 0.2, 0.7]])
pred_2 = torch.Tensor([[1, 2, 7]])
pred_3 = torch.Tensor([[2, 4, 14]])
true = torch.Tensor([2]).long()

loss = nn.CrossEntropyLoss()

print(loss(pred_1, true))
print(loss(pred_2, true))
print(loss(pred_3, true))

这段代码的结果如下:

0.7679
0.0092
5.1497e-05

我还尝试了将输入与某个常数相乘时会发生什么。

几个消息来源 (1, 2) 表示损失有一个内置的 softmax,但如果是这样的话,我会期望上面的所有例子都会 return 相同的损失,显然不是这样。

这提出了以下问题:如果更大的输出导致更低的损失,网络是否会优化以输出更大的值,从而使损失曲线倾斜?如果是这样,似乎 Softmax 层可以解决这个问题。但是,由于这会导致总体损失更高,因此所产生的损失实际上有多大用处?

来自docs, the input to CrossEntropyLoss "is expected to contain raw, unnormalized scores for each class". Those are typically called logits.

有两个问题:

  • 缩放 logits 应该不会产生相同的交叉熵。您可能正在考虑线性归一化,但交叉熵中的(隐式)softmax 归一化 the exponential of the logits.
  • 这会导致学习朝着更大的 logits 值优化。这正是您想要的,因为这意味着网络对分类预测更加“自信”。 (后验p(c|x)更接近ground truth。)