softmax与CrossEntropyLoss(),log_softmax与 NLLLoss()

我们在处理单标签多分类问题时,若考虑用softmax来对模型最后输出作计算以得到各标签的概率分布,那之后可以通过crossentropy做一个似然估计,求得误差
但softmax求出来的概率分布中,每个标签的概率p∈(0,1),当有些标签的概率过小时就会导致下溢出(实数在计算机内用二进制表示,所以不是一个精确值,当数值过小的时候,被四舍五入为0,这就是下溢出。此时如果对这个数再做某些运算(例如除以它)就会出问题。)。
考虑softmax和crossentropy这个组合方案,crossentropy的计算是在概率分布外面套一个log 来似然,也就是做Log(Softmax(x))这个一个工作。那么直接在计算概率分布的时候加上log,把概率从(0,1)变为(-∞,0),这样就可以防止中间的计算中出现下溢出。 所以log_softmax说白了就是将本来应该由crossentropy做的套log的工作提前到预测概率分布这里来,跳过了中间的存储步骤,防止中间数值会有下溢出,使得数据更加稳定。
正是由于把log这一步从计算误差提到前面,所以用log_softmax之后就可以直接用NLLLoss来计算误差(它没有套log这一步,直接将输入取反,然后计算和label的乘积求和平均)。

在实践过程中出现了这段报错

nn.CrossentropyLoss(predictions, labels)

RuntimeError: Boolean value of Tensor with more than one value is ambiguous
虽然不知道什么原因,但只要改成这样就好了

riterion = nn.CrossEntropyLoss()
criterion(predictions, labels)

你可能感兴趣的:(pytorch笔记,pytorch)