Softmax层与LogSoftmax层的对比

  • 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取{log_{e}}^{y_{i}}, 一方面是为了解决溢出的问题,另一方面是方便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.csdn.net/hao5335156/article/details/80607732

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值