Pytorch损失函数CrossEntropyLoss和NLLLoss
RSIC Lv2

什么是logits

作者:王峰

链接:https://www.zhihu.com/question/60751553/answer/1986650670
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

logit原本是一个函数,它是sigmoid函数(也叫标准logistic函数) 的反函数: 。logit这个名字的来源即为logistic unit。

但在深度学习中,logits就是最终的全连接层的输出,而非其本意。通常神经网络中都是先有logits,而后通过sigmoid函数或者softmax函数得到概率的,所以大部分情况下都无需用到logit函数的表达式。

什么时候我们会真的需要用到logit函数呢?考虑这样一个问题:如果我们拿到了一个黑盒模型的概率输出,想要用这个模型生成一批数据来distill(知识蒸馏)我们自己的模型,但distill过程往往又需要调节温度项来重新计算概率(大概是这么个形式: ),此时我们就需要从概率值反推logits了,而反推的过程就如上边的公式所述: 。所以对于logistic regression来说,logit恰好是输出概率经过logit函数的结果,因此即使我们并没有真正地用到logit函数,也不妨将其称作logit。

但是,目前大家用得更多的是多分类的softmax函数,而它的反函数其实并不是logit函数,而是log函数 ,这样再次经过softmax函数: ,就得到了原来的概率。这里需要注意的是:所有logits共同减去一个数字,其得到的softmax结果是不变的,所以得到的logits并不一定与原始logits一模一样,而是会相差一个常数。

由此可见,使用logit一词来表示网络最后一层的输出,实际上只适用于logistic regression。而对于现在更多使用的多分类器softmax来说,其反函数应该是log函数,而非logit,继续用logit一词实际上是不恰当的。我个人倾向于使用“分数”或者直接说是最后一个全连接层的输出,这样比较形象,也不至于让初学者摸不到头脑。

Softmax和Log_softmax

Softmax是标准的归一化函数,可以简单的理解为将神经网络的输出归一化到,并且各项的和是1,就好像输出的是属于不同类别的概率

但是在计算的过程中,若是极大,会出现上溢出,当为负数时,又容易出现下溢出问题(被四舍五入为0)。

经过适当变换

这样,的指数最大为0,不会发生上溢出。对结果取

交叉熵损失函数CrossEntropyLoss

之前提到过什么是交叉熵损失函数 | RSIC's Blog (ranshuo-icer.github.io)

其公式为

即使用实际的分布去计算预测的分布的平均编码长度。

在深度学习的分类任务中,通常为全连接的输出经过得到,因此从全连接的输出与真实标签的交叉熵为

上面提到,为了避免计算softmax时出现溢出问题,都是计算的,再计算指数。当使用交叉熵作为损失函数时,即可省略后者,结合起来就是Pytorch中的 nn.CrossEntropyLoss,详见pytorch官方手册CrossEntropyLoss — PyTorch 2.0 documentation

那NLLLoss是什么呢?

NLLLoss — PyTorch 2.0 documentation

The negative log likelihood loss. It is useful to train a classification problem with C classes. The input given through a forward call is expected to contain log-probabilities of each class. Obtaining log-probabilities in a neural network is easily achieved by adding a LogSoftmax layer in the last layer of your network. You may use CrossEntropyLoss instead, if you prefer not to add an extra layer.

softmax + log + nllloss = crossentropyloss

 评论