1 Softmax定义

  Softmax从字面上来说,可以分成soft和max两个部分。max故名思议就是最大值的意思。Softmax的核心在于soft,而soft有软的含义,与之相对的是hard硬。很多场景中需要我们找出数组所有元素中值最大的元素,实质上都是求的hardmax。下面使用Numpy模块实现hardmax。[1]

import numpy as np

a = np.array([1, 2, 3, 4, 5]) # 创建ndarray数组
a_max = np.max(a)
print(a_max) # 5

  通过上面的例子可以看出hardmax最大的特点就是只选出其中一个最大的值,即非黑即白。但是往往在实际中这种方式是不合情理的,比如对于文本分类来说,一篇文章或多或少包含着各种主题信息,我们更期望得到文章对于每个可能的文本类别的概率值(置信度),可以简单理解成属于对应类别的可信度。所以此时用到了soft的概念,Softmax的含义就在于不再唯一的确定某一个最大值,而是为每个输出分类的结果都赋予一个概率值,表示属于每个类别的可能性。[1]
即Softmax实现了对输出事件概率的一种约束,使得每个事件的概率值都在[0, 1]之间并且,个概率事件的和为1.

2 为什么使用Softmax

  下面给出Softmax函数的定义:
Softmax ⁡ ( z i ) = e z i ∑ c = 1 C e z c \operatorname{Softmax}\left(z_{i}\right)=\frac{e^{z_{i}}}{\sum_{c=1}^{C} e^{z_{c}}} Softmax(zi)=c=1Cezcezi
其中 z i z_{i} zi为第i个节点的输出值,C为输出节点的个数,即分类的类别个数。通过Softmax函数就可以将多分类的输出值转换为范围在[0, 1]和为1的概率分布。引入指数函数对于Softmax函数是把双刃剑,即得到了优点也暴露出了缺点。

  1. 使用指数函数的优点
    在这里插入图片描述
    指数函数曲线呈现递增趋势,最重要的是斜率逐渐增大,也就是说在x轴上一个很小的变化,可以导致y轴上很大的变化。这种函数曲线能够将输出的数值拉开距离。假设拥有三个输出节点的输出值为 z 1 、 z 2 、 z 3 z_{1}、z_{2}、z_3 z1z2z3为[2, 3, 5]。首先尝试不使用指数函数 z i ∑ c = 1 3 z c \frac{z_{i}}{\sum_{c=1}^{3} z_{c}} c=13zczi ,接下来使用指数函数的Softmax函数计算
import torch
import numpy as np

num = [2, 3, 5]

sum_num = np.sum(num)
print(sum_num)  # 10

result_sum = num / sum_num
print(result_sum)  # [0.2 0.3 0.5]

num = torch.Tensor(num)
result_torch_sum = torch.softmax(num, dim=0)
print(result_torch_sum)  # tensor([0.0420, 0.1142, 0.8438])

经过使用指数形式的Softmax函数能够将差距大的数值距离拉的更大。

3 Pytorch 实现Softmax

4 Pytorch 实现log_softmax

  log_softmax作用:在softmax的结果上再做多一次log运算,

F.log_softmax(x,dim=1) 或者 F.log_softmax(x,dim=0)

2.参数解释

  • x指的是输入矩阵。
  • dim指的是归一化的方式,如果为0是对列做归一化,1是对行做归一化
import torch
import torch.nn.functional as F
logits = torch.rand(2,2)
pred = F.softmax(logits, dim=1)
pred1 = F.log_softmax(logits, dim=1)
print(logits)
print(pred)
print(pred1)

5 防止数值溢出方法

6 参考文献

[1]一文详解Softmax函数
[2]Pytorch Softmax用法
[3]Pytorch中Softmax和LogSoftmax的使用
[4]Pytorch学习笔记(七):F.softmax()和F.log_softmax函数详解

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐