Softmax函数和Sigmoid函数的思考

ops/2024/9/24 0:24:54/

【为什么 Softmax 函数面对二分类问题时可以简化为 Sigmoid 函数】

将二分类问题当成普通多分类问题,神经网络如下所示:

因为有两个分类,所以需要有两个输出,然后经过 Softmax 后得到每个分类的预测概率。 

假设第一个分类的得分为S_{1}=W_{1}X+b_{1},第二个分类得分 S_{2}=W_{1}X+b_{2},则经过 Softmax 层后得到 第一个分类的概率为:

P_{1}=\frac{e^{S_{1}}}{e^{S_{1}}+e^{S_{2}}}=\frac{1}{1+e^{S_{2}-S_{1}}}

 第二个分类的概率为:

P_{2}=\frac{e^{S_{2}}}{e^{S_{1}}+e^{S_{2}}}=\frac{1}{1+e^{S_{1}-S_{2}}}

S=S_{2}-S_{1} ,所以P_{1}P_{2}可以重写为:

P_{1}=\frac{1}{1+e^{S}}

P_{2}=\frac{1}{1+e^{-S}}  

 此时将P_{1}P_{2}相加可以非常惊奇的发现:P_{1}+P_{2}=1,也就是说我们只需要计算出来一个P,然后另一个直接通过1-P即可计算出来。

这两个概率P随得分S的变化图像如下所示:

由上图可见,采取 P_{2}的公式时,S越大,P的取值越接近1,符合我们的直觉,所以选择这个作为Sigmoid函数。于是上述神经网络可以简化为只有一个输出的神经网络,然后经过Sigmoid函数得到预测为分类1的概率P,另一个分类的概率为1-P,新神经网络只需要训练一个权重W和偏移量b即可。

【二分类情况下 softmax 和 Sigmoid 函数的区别】

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

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

  总而言之,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,才是正确的选择。

参考:

为什么 softmax 函数面对二分类问题时可以简化为 sigmoid 函数_将softmax结果转换为sigmoid值-CSDN博客

https://www.cnblogs.com/wynlfd/p/14101373.html


http://www.ppmy.cn/ops/4981.html

相关文章

网上订餐系统|基于springboot的网上订餐系统设计与实现(源码+数据库+文档)

网上订餐系统目录 目录 基于springboot的网上订餐系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户功能模块的实现 (1)用户注册界面 (2)用户登录界面 (3)菜品详情界面 &#xff08…

javase__进阶 day13stream流和方法引用

1.不可变集合 1.1 什么是不可变集合 ​ 是一个长度不可变,内容也无法修改的集合 1.2 使用场景 ​ 如果某个数据不能被修改,把它防御性地拷贝到不可变集合中是个很好的实践。 ​ 当集合对象被不可信的库调用时,不可变形式是安全的。 简单…

C语言经典例题-19

1.字符串左旋结果 题目内容:写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。 例:给定s1 AABCD和s2 BCDAA,返回1 给定s1 abcd和s2 ACBD,返回0 AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA AABCD右旋一…

探索设计模式的魅力:融合AI大模型与函数式编程、开启智能编程新纪元

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 ✨欢迎加入探索AI大模型与函数式编程模式融合之旅✨ 在编程世界的广阔疆域里,两大…

【基础IO】谈谈动静态库(怒肝7000字)

文章目录 前言实验代码样例静态库生成一个静态库归档工具ar静态库的链接 动态库创建动态库加载动态库 动静态链接静态链接动态链接动静态链接的优缺点 前言 在软件开发中,库(Library)是一种方式,可以将代码打包成可重用的格式&…

C++智能指针(二十)

一.RAII(Resource Acquisition Is Initialization) RAII资源获取即初始化,RAII的思想就是在构造时初始化资源,或者托管已经构造的资源。在析构的时候释放资源。一般不允许复制或赋值,并且提供若干的资源访问的方法。比…

vue3-setup与vue2的data共存

文章目录 前言一、vue3的setup响应式状态生命周期钩子示例注意事项 二、与vue2 的data 共存setup 与 data 的区别setup 与 data 的共存注意事项示例 前言 vue3 setup 学习 一、vue3的setup Vue 3 的 setup 函数是 Composition API 的核心,它提供了一种新的方式来使…

【Stable Diffusion】ModuleNotFoundError: No module named ‘ifnude‘ and roop v0.0.2

提示:ModuleNotFoundError: No module named ‘ifnude’ 一、issues/299:ModuleNotFoundError: No module named ‘ifnude’ 路径 cmd 中也可以看到,路径可能有点不一样,但是后面的路径应该都是一样的,如:…