本文摘自知乎答主’初识CV’的回答,连接:二分类问题,应该选择sigmoid还是softmax? – 知乎
对于二分类问题, 理论上,两者没有任何区别。
由于现在Pytorch,TensorFlow等框架计算矩阵方式问题,两者在反向传播的过程中还是有区别的。实验表明,对于不同的模型,可能sigmoid效果好,也可能softmax效果好。
由公式可见,两个公式可以完全统一,所以理论上来说两者没有区别。
然后分析两者之间的差异(以Pytorch为例)
使用Sigmoid函数时,最后一层全连接层的神经元个数为1,而用softmax函数的时候,最后一层全连接层的神经元个数为2.因为Sigmoid函数只有是目标和不是目标之分,实际上只存在一类目标类,另一个是背景类。而softmax函数将目标分类为两类,所以有两个神经元。这也是导致两者存在差异的主要原因。
Sigmoid函数针对两点分布提出。神经网络的输出经过它的转换,可以将数值压缩到(0,1)之间,得到的结果可以理解成 分类成目标类别的概率P,而不分到该类别的概率为(1-p),这是典型的亮点分布的形式。
softmax函数本身针对多项分布提出,,当类别数是2时,它退化为二项分布。而它和sigmoid函数真正区别就在—分布包含两个分类类别,而亮点分布其实是针对一个类别的概率分布,其对应的那个类别的分布直接由1-p得出。
简单点理解就是, Sigmoid函数,我们可以当作成它是对一个类别的”建模”,将该类别建模完成,另一个相对的类别就直接通过1减去得到。 而softmax函数,是对两个类别建模,同样的,得到两个类别的概率之和是1。
神经网络在做二分类时,使用Softmax还是Sigmoid,做法其实有明显差别。由于Softmax是对两个类别(正反两类,通常定义为0/1的label)建模,所以对于NLP模型而言(比如泛BERT模型),Bert输出层需要通过一个nn.Linear()全连接层压缩至2维,然后接Softmax(Pytorch的做法,就是直接接上torch.nn.CrossEntropyLoss);而Sigmoid只对一个类别建模(通常就是正确的那个类别),所以Bert输出层需要通过一个nn.Linear() 全连接层压缩至1维,然后接Sigmoid(torch就是接torch.nn.BCEWithLogitsLoss)。
作者:初识CV
链接:https://www.zhihu.com/question/295247085/answer/1778398778
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Original: https://blog.csdn.net/dingyplucky/article/details/126739820
Author: 是luckyBaby呢
Title: 二分类问题中,sigmoid与softmax的区别
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/667092/
转载文章受原作者版权保护。转载请注明原作者出处!