二分类情况下sigmoid函数和softmax函数区别

说到softmaxsigmoid二者差别,就得说说二者分别都是什么。其实很简单,网上有数以千计的优质博文去给你讲明白,我只想用我的理解来简单阐述一下:

  • sigmoid函数针对两点分布提出。神经网络的输出经过它的转换,可以将数值压缩到(0,1)之间,得到的结果可以理解成“分类成目标类别的概率P”。而不分类到该类别的概率,就是(1 - P),这也是典型的两点分布的形式;
  • softmax本身针对多项分布提出,当类别数是2时,它退化为二项分布,而它和sigmoid真正的区别就在这儿——二项分布包含两个分类类别(姑且分别称为A和B);而两点分布其实是针对一个类别的概率分布,其对应的那个类别的分布,直接由1-P粗暴得出。

首先我们要明白,当你用Sigmoid函数的时候,你的最后一层全连接层的神经元个数为1,而当你用Softmax函数的时候,你的最后一层全连接层的神经元个数是2。这个很好理解,因为Sigmoid函数只有是目标和不是目标之分,实际上只存在一类目标类,另外一个是背景类。而Softmax函数将目标分类为了二类,所以有两个神经元。这也是导致两者存在差异的主要原因。

据上所述,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

总而言之,sotfmax和sigmoid确实在二分类的情况下可以化为相同的数学表达形式,但并不意味着二者有一样的含义,而且二者的输入输出都是不同的。sigmoid得到的结果是“分到正确类别的概率和未分到正确类别的概率”,softmax得到的是“分到正确类别的概率和分到错误类别的概率”。

一种常见的错法,即,错误地将softmax和sigmoid混为一谈,在把BERT输出 层压缩至2维的情况下,却用sigmoid对结果进行计算。这样我们得到的结果其意义是什么呢?
假设我们现在BERT输出层经nn.Linear()压缩后,得到一个二维的向量:

[-0.9419267177581787, 1.944047451019287]

对应类别分别是(0,1)。我们经过sigmoid运算得到:

tensor([0.2805, 0.8748])

前者0.2805指的是分类类别为0的概率,0.8748指的是分类类别为1的概率。二者相互独立,可看作两次独立的实验(显然在这里不适用,因为0-1类别之间显然不是相互独立的两次伯努利事件)。所以显而易见的,二者加和并不等于1.
若用softmax进行计算,可得:

tensor([0.0529, 0.9471])

这里两者加和是1,才是正确的选择。

假设存在A、B两个类别,它们类别的最终输出值为a和b。以上计算得到的结果可以如下看待:
sigmoid:
在这里插入图片描述
softmax:
在这里插入图片描述

差别还是很明显的,所以,大佬的话果然没错,这两者之间确实有差别,而softmax的处理方式,有时候会得到相较于sigmoid处理方式的微小提升。

你可能感兴趣的:(机器学习,ML,分类,深度学习)