二者的区别与联系
- 如果模型输出为互斥类别,且只能选择一个类别,如单标签多分类问题,则采用Softmax函数计算该网络的原始输出值,然后接一个交叉熵损失函数。
- 如果模型输出为非互斥类别(即没有包含关系),且可以同时选择多个类别,如多标签多分类问题,则采用Sigmoid函数计算该网络的原始输出值。
- 对于某个分类场景,当Softmax函数能用时,Sigmoid函数一定可以用。
- 对于二分类问题,二者在数学上是没有区别的(证明写一下数学公式就看出来了)。
- 对于二分类问题,当用Sigmoid函数的时候,最后一层全连接层的神经元个数为1,而当用Softmax函数的时候,最后一层全连接层的神经元个数是2。因为Sigmoid函数只有是目标和不是目标之分,实际上只存在一类目标类,另外一个是背景类。而Softmax函数将目标分类为了二类,所以有两个神经元。这也是导致两者存在差异的主要原因。如果错误的用Sigmoid对二维神经元进行计算,实际上做了两次独立的实验,两个值分别是“分到第一类的概率p”、“分到第二类的概率q”,得到的两个概率值之和不等于1。
所以如果想用SE为左右两支路去生成权重的话,还是得用softmax限制两个权重和为1,这样利于网络的学习。
Softmax(归一化指数函数)
基础知识
- softmax是个非常常用而且比较重要的函数,他把一些输入映射为0-1之间的实数,并且归一化(保证和为1),而多分类的概率之和也刚好为1,因此在多分类的场景中使用广泛。但前提是假设各个类别互斥,即一个样本只能属于一个类别。
- Softmax函数的分母综合了原始输出值的所有因素,这意味着,Softmax函数得到的不同概率之间相互关联。
- Softmax函数可以使得神经网络在反向传播过程中更容易执行梯度求导(导数公式见上),而且能够凸显原始向量中最大的值,并抑制远低于最大值的其他分量(只选一个的思想),这也是该函数被称作 Softmax 函数的原因(即平滑化的 argmax 函数)。
- 由于Softmax函数先拉大了输入向量元素之间的差异(通过指数函数),然后才归一化为一个概率分布,在应用到分类问题时,它使得各个类别的概率差异比较显著,最大值产生的概率更接近1,这样输出分布的形式更接近真实分布。
- 理解为什么叫 “soft” “max” ?softmax可以当作argmax的一种平滑近似,与argmax操作中暴力地选出一个最大值(产生一个one-hot向量)不同,softmax将这种输出作了一定的平滑,即将one-hot输出中最大值对应的1按输入元素值的大小分配给其他位置。
温度系数
- 在原始的softmax基础上额外增加一个温度系数 ,但一般作者很少做相关的解释,并且任务不同,取值的范围也不同。温度系数主要是用来调整logits-softmax曲线的平滑程度,常用在知识蒸馏(通常)、对比学习(通常)中。
- 代码为:
out = F.softmax(x/t, dim=1)
,如果想得到一个学习到的权重的话,一般写在forward函数里面。减小,softmax的输入变大,输出各类别之间的概率差距变大(结合softmax曲线看,陡峭的部分),如果后接一个交叉熵损失函数的话,loss变小;增大,softmax的输入变小,输出的各类别的概率差距变小(结合softmax曲线看,平滑的部分),如果后接一个交叉熵损失函数的话,loss变大。
Sigmoid
- 在特征相差比较复杂或是相差不是特别大时效果比较好。
- 对于二分类的情况,Sigmoid函数针对两点分布提出。神经网络的输出经过它的转换,可以将数值压缩到(0,1)之间,得到的结果可以理解成分到目标类别的概率P,而不分到该类别的概率是(1 - P),这也是典型的两点分布的形式。而Softmax得到的是“分到正确类别的概率和分到错误类别的概率”,即分到各个类别的概率。