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

为何使用PyTorch的cross_entropy得到错误计算结果?

问题原因解析

你犯了一个关键误解:PyTorch的F.cross_entropy输入的是未经过softmax的logit张量,而非softmax后的概率值,它会自动完成「softmax → 取对数 → 负对数似然损失」的完整计算流程。

具体计算过程验证

你的输入logit是torch.tensor([[0.25, 0.5, 0.25]]),目标是torch.tensor([0]),PyTorch的计算步骤如下:

  1. 对logit做softmax计算概率:
    import torch
    logits = torch.tensor([[0.25, 0.5, 0.25]])
    probs = torch.softmax(logits, dim=1)
    # probs结果为tensor([[0.3045, 0.3910, 0.3045]])
    
  2. 对概率取自然对数:
    log_probs = torch.log(probs)
    # log_probs结果为tensor([[-1.1891, -0.9416, -1.1891]])
    
  3. 计算负对数似然损失(取目标类别对应的log概率的负值):
    loss = -log_probs[0][0]
    # loss结果为tensor(1.1891)
    

你的手动计算错误点

你直接把输入的logit值[0.25,0.5,0.25]当成了softmax后的概率代入公式,但实际上这只是模型输出的原始logit,并没有经过softmax归一化。如果要手动匹配PyTorch的结果,必须先对logit做softmax再计算交叉熵。

如果确实想直接用概率值计算损失,你需要使用F.nll_loss,但要先对概率取对数,并且确保输入是log概率张量:

import torch.nn.functional as F
probs = torch.tensor([[0.25, 0.5, 0.25]])
log_probs = torch.log(probs)
target = torch.tensor([0])
loss = F.nll_loss(log_probs, target)
# loss结果为tensor(1.3863),和你手动计算的结果一致

内容的提问来源于stack exchange,提问作者reject-cookies

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:34:58