You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch中CrossEntropyLoss两种均值计算结果不一致问题

损失计算差异的原因

核心差异来自**nn.CrossEntropyLoss对ignore_index(默认值为-100)的处理逻辑不同**:

  1. reduction='mean'的内置计算逻辑
    当使用reduction='mean'时,损失函数会自动识别标签为-100的样本并忽略它们:
  • 仅计算标签不为-100的样本的损失总和
  • 最终均值 = 有效样本损失总和 ÷ 有效样本数量(即标签不为-100的样本数)
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 01:12:04