PyTorch中CrossEntropyLoss两种均值计算结果不一致问题
损失计算差异的原因
核心差异来自**nn.CrossEntropyLoss对ignore_index(默认值为-100)的处理逻辑不同**:
reduction='mean'的内置计算逻辑
当使用reduction='mean'时,损失函数会自动识别标签为-100的样本并忽略它们:
- 仅计算标签不为
-100的样本的损失总和 - 最终均值 = 有效样本损失总和 ÷ 有效样本数量(即标签不为
-100的样本数)
reduction='none'后手动调用mean()的逻辑
当设置reduction='none'时,标签为-100的样本对应的损失值会被设为0,但这些样本并未被排除:
- 调用
losses.mean()时,是对**所有样本(包括损失为0的无效样本)**计算均值 - 最终均值 = 有效样本损失总和 ÷ 总样本数量
你的例子中,约25%的样本被设为-100,所以手动计算的均值相当于内置均值乘以(总样本数-无效样本数)/总样本数 ≈ 0.75,和输出的4.9978 * 0.75 ≈ 3.7484完全吻合。
修正方法
如果想让两种方式结果一致,需要先过滤掉无效样本再计算均值:
weighted_loss = losses[labels != -100].mean()
内容的提问来源于stack exchange,提问作者Essam
相关产品推荐
相关产品推荐

