交叉熵对具有相同分布的向量产生不同的结果
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。)
我正在训练一个神经网络来区分三个类。当然,我选择了 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。)