pytorch中softmax和log_softmax、CrossEntropyLoss() 和NLLLoss()

  • Post author:
  • Post category:其他


1. softmax和log_softmax

方法 公式 解释 pytorch
softmax softmax=\frac{e^{xi}}{\sum_{j}^{}e^{xj}} 又称归一化指数函数,先通过
e^{x}
化为正数,再通过除以和,转换到0-1之间,并且和为1。可以理解为将输出结果转化为属于不同类别的概率。

import torch.nn.functional as F

softmax=F.softmax(data,dim=0)

import torch.nn as nn

nn.softmax(dim=-1)(data)

log_softmax

log(softmax(x))

由于此公式计算较慢,因此采用等价公式计算,如下说明。

softmax中进行指数操作时,当上一层的输出值较大时,计算结果较大,可能造成数值的溢出,因此对其取对数。

import torch.nn.functional as F

log_softmax=F.log_softmax(data,dim=0)

import torch.nn as nn

nn.softmax(dim=-1)(data)

log(softmax(x)))=\log \frac{e^{xi}/e^{M}}{\sum_{j}^{}e^{xj}/e^{M}}=\log \frac{e^{(xi-M)}}{\sum_{j}^{}e^{(xj-M)}}=\log e^{(xi-M)}-\log \sum_{j}^{}e^{(xj-M)}=(xi-M)-\log \sum_{j}^{}e^{(xj-M)}

(M=max(xi),M为所有x中的最大值,pytorch中的log是以e为底)

2 CrossEntropyLoss()和NLLLoss()

(1)原始的交叉熵计算公式如下所示:

CrossEntropyLoss=-\sum_{i=1}^{}y^{i}log(\hat{y}^{i})

其中
y^{i}
表示样本的真实分布,
\hat{y}^{i}
表示模型的预测分布。在pytorch的CrossEntropyLoss中,样本的标签值y为ont-hot形式,也就是说
y^{i}
只有一个维度是1其他都是0,形如[0,1,0]。
\hat{y}^{i}
是模型的输出,多分类的最后一层通常采用softmax函数将结果转换至0-1之间。将上述带入到公式中,得到简化的计算公式:

CrossEntropyLoss=-\sum_{i=1}^{}y^{i}log(\hat{y}^{i})=-\sum_{i=1}^{}y^{i}log(\frac{e^{xi}}{\sum_{j}^{}e^{xj}})=-log(\frac{e^{x_{lable}}}{\sum_{j}^{}e^{xj}})=-x_{lable}+log(\sum_{j}^{}e^{xj})

其中
x_{lable}
为真实类别对应的预测值。有权重的损失函数的计算如下:

CrossEntropyLoss=w_{lable}(-x_{lable}+log(\sum_{j}^{}e^{xj}))

(2)NLLLoss():负对数似然损失函数,对数似然加上负号,最大似然估计越大越好,取完负号之后就是负对数似然越小越好,因此负对数似然函数可以作为损失函数。在pytorch中NLLLoss()是对经过log_oftmax的转换后的输入数据作为参数,然后取负数,经过这个操作后,与原始数据直接输入到CrossEntropyLoss的结果一样,两者只是要求输入的参数不同。



版权声明:本文为wekings原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。