使用torch.nn.functional.log_softmax处理概率向量出现数值异常
问题分析与解决
核心错误原因
你用错了函数的适用场景:
F.log_softmax的输入应该是模型输出的原始logits(未经过softmax的得分),它会先执行softmax把得分转成概率,再取对数。- 但你的
pred已经是经过softmax后的概率向量了,再套log_softmax等于重复做了一次softmax+log,结果自然完全错误。
对应你的输出验证
看你给出的数值:
- pred里第8个维度是0.99996,正常取对数应该是
ln(0.99996)≈-4e-5,但你的log_probs里是-1.4612,明显不符。 - 这是因为
log_softmax会先把你的pred向量重新做softmax:由于0.99996远大于其他值,重新归一化后几乎所有概率都集中在这个维度,其他维度趋近于0,取对数后就出现了大部分维度数值相同、只有该维度是稍大负数的异常结果。
正确做法
直接对已有的概率向量取对数:
log_probs = torch.log(pred)
如果担心概率为0时torch.log会报错(数值不稳定),可以先给概率加个极小的下限:
log_probs = torch.log(torch.clamp(pred, min=1e-10))
内容的提问来源于stack exchange,提问作者Pengxin Wang
相关产品推荐
相关产品推荐

