-
1. Softmax
作用:将网络输出值的每一维映射成(0,1)之间的概率值,且所有维的概率值之和等于1。
具体理解:
神经网络解决多分类(N分类)问题,最后一层输出会是N个神经元,所以对于每一个输入样本,都对应输出一个N维的向量,如[-2.3 , 1.9 , 3.4 , -5.6],此时每一维的值有正有负有大有小。
一般会将此时网络的输出再通过一个softmax层,每一维都变成了一个[0,1]之间的概率值,并且所有维的概率值之和等于1,将概率值最大的一维规定为该输入样本对应的标签类,如[0.1 , 0.2 , 0.6 , 0.1],为第三类。
softmax具体的计算公式为:(指数函数可以将R上所有的值映射到(0,正无穷))
pytorch代码调用:
self.softmax = nn.Softmax(dim=-1)
##########################################
p = self.softmax(logist)
注意:
dim=0:对第0维(每一列)的所有元素进行softmax运算
dim=1:对第1维(每一行)的所有元素进行softmax运算
dim=-1:对倒数第1维的所有元素进行softmax运算
-
2. LogSoftmax
作用:就是对每一个y取, 一方面是为了解决溢出的问题,另一方面是方便CrossEntropyLoss的计算。
具体理解: 如上图,因为softmax会进行指数操作,当上一层的输出,也就是softmax的输入比较大的时候,可能就会产生overflow。比如上图中,z1、z2、z3取值很大的时候,超出了float能表示的范围。 同理当输入为负数且绝对值也很大的时候,会分子、分母会变得极小,有可能四舍五入为0,导致下溢出。 尽管在数学表示式上是对softmax在取对数的情况。但是在实操中是通过:
pytorch代码调用:
self.logsoftmax = nn.LogSoftmax(dim=-1)
#################################################
p = self.logsoftmax(logist)
-
3. 二者比较
联系:由上面的分析可以发现,LogSoftmax其实就是在Softmax的结果上再做一次log运算
区别:虽然在数学上 LogSoftmax(y) = log(Softmax(y)),但是做这两个单独操作速度较慢,数值上也不稳定,LogSoftmax这个函数实际上是使用了上述另一种公式来正确计算输出和梯度。
参考:
https://www.zhihu.com/question/358069078
https://blog.youkuaiyun.com/hao5335156/article/details/80607732