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

使用PyTorch计算交叉熵损失时结果不符预期,求原因解析

PyTorch交叉熵损失计算异常原因解析

你的问题核心是没搞懂PyTorch中CrossEntropyLoss的计算逻辑:

  • CrossEntropyLoss默认把输入当作未经过softmax的logits,它会自动先对输入做softmax运算,再计算交叉熵损失。
  • 你的输入是torch.tensor([[1.,0.0,0.0],[1.,0.0,0.0]]),先对每个样本做softmax:
    以第一个样本为例,softmax计算为:
    softmax(1) = e^1 / (e^1 + e^0 + e^0) ≈ 2.718 / (2.718 + 1 + 1) ≈ 0.5761
    
    对应的交叉熵损失是 -ln(0.5761) ≈ 0.5514,两个样本结果相同,默认取平均后最终损失就是0.5514。

如果你的输入已经是经过softmax的概率值,想要得到预期的0损失,有两种解决方式:

  • 方式一:使用NLLLoss,但需要先对输入取自然对数(注意避免log(0)的情况):
    import torch
    import torch.nn as nn
    
    input_probs = torch.tensor([[1.,0.0,0.0],[1.,0.0,0.0]])
    labels = torch.tensor([0, 0])
    log_probs = torch.log(input_probs)
    loss_fn = nn.NLLLoss()
    loss = loss_fn(log_probs, labels)
    
  • 方式二:如果输入是logits,想要让损失为0,需要让正确类别的logits远大于其他类别,比如把输入改成torch.tensor([[100.,0.0,0.0],[100.,0.0,0.0]]),此时softmax后正确类别的概率趋近于1,交叉熵损失趋近于0。

内容的提问来源于stack exchange,提问作者Sukesh Ram

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:25:40