原文链接:
sigmoid和softmax总结_老哥的专栏-CSDN博客_sigmoid和softmax区别
浅谈sigmoid函数和softmax函数_甘如荠-CSDN博客_sigmoid函数与softmax函数
机器学习(六)Sigmoid函数和Softmax函数 - 简书
相关博客
NLLLoss & cross-entropy比较:pytorch - loss function - summary
softmax & sigmoid 第一层理解:
Sigmoid 又叫Logistic 激活函数。将实数值压缩进 0 到 1 的区间内。
softmax is a generalization of logistic function that “squashes” (maps) a K-dimensional vector z of arbitrary real values to a K-dimensional vector σ(z) of real values in the range (0, 1) that add up to 1.
总结:
sigmoid将一个real value映射到(0,1)的区间(当然也可以是(-1,1)),这样可以用来做二分类。
而softmax把一个k维的real value向量(a1,a2,a3,a4…)映射成一个(b1,b2,b3,b4…)其中bi是一个0-1的常数,然后可以根据bi的大小来进行多分类的任务,如取权重最大的一维。
可见在二元分类的情况下,Softmax 退化为了 Sigmoid.
import numpy as np
import matplotlib.pyplot as plt
def softmax(x):
orig_shape=x.shape
if len(x.shape)>1:
#Matrix
#shift max whithin each row
constant_shift=np.max(x,axis=1).reshape(1,-1)
x-=constant_shift
x=np.exp(x)
normlize=np.sum(x,axis=1).reshape(1,-1)
x/=normlize
else:
#vector
constant_shift=np.max(x)
x-=constant_shift
x=np.exp(x)
normlize=np.sum(x)
x/=normlize
assert x.shape==orig_shape
return x
softmax_inputs = np.arange(-3, 4)
inputs = softmax_inputs.tolist()
print(softmax_inputs)
softmax_outputs = softmax(softmax_inputs)
print("Sigmoid Function Output :: {}".format(softmax_outputs))
# 画图像
plt.plot(inputs, softmax_outputs)
plt.xlabel("Softmax Inputs")
plt.ylabel("Softmax Outputs")
plt.show()
softmax & sigmoid 第二层理解:
sigmoid函数针对两点分布提出。神经网络的输出经过它的转换,可以将数值压缩到(0,1)之间,得到的结果可以理解成“分类成目标类别的概率P”。而不分类到该类别的概率,就是(1 - P),这也是典型的两点分布的形式;
softmax本身针对多项分布提出,当类别数是2时,它退化为二项分布。
神经网络在做二分类时,使用softmax还是sigmoid,做法其实有明显差别。
由于softmax是对两个类别(正反两类,通常定义为0/1的label)建模,所以对于NLP模型而言(比如泛BERT模型),Bert输出层需要通过一个nn.Linear()全连接层压缩至2维,然后接softmax
而sigmoid只对一个类别建模(通常就是正确的那个类别),所以Bert输出层需要通过一个nn.Linear()全连接层压缩至1维,然后接sigmoid。
总而言之,sotfmax和sigmoid确实在二分类的情况下可以化为相同的数学表达形式,但并不意味着二者有一样的含义,而且二者的输入输出都是不同的。
一种常见的错法(其实就是我自己的错法),即,错误地将softmax和sigmoid混为一谈,在把BERT输出 层压缩至2维的情况下,却用sigmoid对结果进行计算。
softmax & log softmax
softmax溢出:
softmax上溢和下溢问题_张欣的博客-CSDN博客_softmax上溢
在计算机里面数据都是以二进制的形式存储的,如果数据超过了计算机所能存储的最大范围,就会发生溢出。
softmax公式里面因为存在指数函数,所以有可能会出现上溢或下溢的问题。
当指数函数里面传入的值很大时,就会出现上溢,爆出OverflowError.
当指数函数里面传入的值是很小的负数时,就会出现下溢,输出结果就是0, 这样就有可能导致分母的值为0。
log softmax
log_softmax 在数学上等价于log(softmax(x))
问题:
理论上对于单标签多分类问题,直接经过softmax求出概率分布,然后把这个概率分布用cross entropy做一个似然估计误差。但是softmax求出来的概率分布,每一个概率都是(0,1)的,这就会导致有些概率过小,导致下溢。
解决办法:
考虑到这个概率分布总归是要经过cross entropy的,而cross entropy的计算是把概率分布外面套一个 负log 来似然,那么直接在计算概率分布的时候加上log, 把概率从(0,1)变为(-∞,0),这样就防止中间会有下溢出。
所以log_softmax说白了就是将本来应该由cross entropy做的套log的工作提到预测概率分布来,跳过了中间的存储步骤,防止中间数值会有下溢出,使得数据更加稳定。