为何PyTorch的softmax计算单个权重分数与手动方式不同?
PyTorch Softmax计算结果疑问解答
问题内容
我创建了一个简单张量:
test_tensor = torch.tensor([[.1, .2, .3], [.4, .5, .6]])
当我使用softmax函数并设置dim=-1时:
weights = torch.softmax(test_tensor, dim=-1)
得到结果:
tensor([[0.3006, 0.3322, 0.3672], [0.3006, 0.3322, 0.3672]])
我原本以为手动计算第一个权重时,应该是0.1/(0.1+0.2+0.3)=0.166666,但PyTorch给出的是0.3006,请问我哪里操作错了?
原因说明
你搞混了Softmax和普通归一化的计算逻辑:
- 你手动用的是普通归一化公式:
x_i / sum(x),这并不是Softmax的计算方式。 - PyTorch的
torch.softmax采用标准Softmax公式:Softmax(x_i) = e^x_i / sum(e^x_j),其中j遍历指定维度的所有元素。
以第一行第一个元素0.1为例,正确计算步骤:
- 计算每个元素的指数值:
e^0.1≈1.1052,e^0.2≈1.2214,e^0.3≈1.3499 - 对指数值求和:
1.1052 + 1.2214 + 1.3499 ≈ 3.6765 - 计算Softmax结果:
1.1052 / 3.6765 ≈ 0.3006,和PyTorch的输出完全匹配。
另外你会发现两行结果完全相同,这是因为Softmax具有平移不变性:给同一维度的所有元素加上相同数值,最终结果不变。第二行每个元素比第一行多0.3,计算时e^(x+0.3) = e^x * e^0.3,分子分母的e^0.3会相互抵消,所以两行的Softmax结果一致。
内容的提问来源于stack exchange,提问作者sunny
相关产品推荐
相关产品推荐

