问题

二分类问题,应该选择sigmoid还是softmax?

回答
在二分类问题中,我们通常会使用一个输出层和一个激活函数来预测属于两个类别之一的概率。那么,是选择 Sigmoid 还是 Softmax 呢?这是一个很常见的问题,我们来详细探讨一下。

首先,我们得明确二分类问题的本质:

二分类问题就是要把输入数据划分到两个互斥的类别中,比如“是”或“否”、“猫”或“狗”、“垃圾邮件”或“非垃圾邮件”。最关键的是,这两个类别是互补的,也就是说,如果一个样本不属于类别 A,那它必然属于类别 B。

Sigmoid 激活函数:它是怎么工作的?

Sigmoid 函数,也称为 logistic 函数,它的数学表达式是:

$sigma(z) = frac{1}{1 + e^{z}}$

这个函数有一个非常漂亮的特性:它的输出范围在 0 到 1 之间。

当输入 $z$ 很大时,$sigma(z)$ 接近 1。
当输入 $z$ 很小时(负的很多),$sigma(z)$ 接近 0。
当 $z = 0$ 时,$sigma(z) = 0.5$。

在二分类问题中,我们通常会设置一个输出神经元,这个神经元接收前面所有层的加权和(也就是 $z$),然后将这个值通过 Sigmoid 函数。

Sigmoid 函数的输出,我们可以直接将其解释为输入样本属于正类(通常是标签为 1 的类别)的概率。
那么,它属于负类(标签为 0 的类别)的概率是多少呢?因为两个类别是互补的,所以负类的概率就是 $1 ext{Sigmoid(z)}$。

举个例子:

假设我们训练了一个模型来判断一封邮件是否是垃圾邮件。
我们设置一个输出神经元。
模型计算出这封邮件的“得分”是 $z = 3.5$。
通过 Sigmoid 函数:$sigma(3.5) = frac{1}{1 + e^{3.5}} approx 0.97$。
这意味着模型预测这封邮件属于“垃圾邮件”(我们设其为正类)的概率是 97%。
那么,它属于“非垃圾邮件”(负类)的概率就是 $1 0.97 = 0.03$(3%)。

Sigmoid 的优势:

1. 直接输出概率: Sigmoid 的输出非常直观,可以直接理解为属于某个类别的概率。
2. 适用于独立输出: 如果你的输出是相互独立的(尽管在二分类问题中它们不是严格独立的,但 Sigmoid 的处理方式是这样),Sigmoid 也是一个不错的选择。
3. 计算简单: Sigmoid 函数本身以及其导数都相对容易计算。

Softmax 激活函数:它又是什么?

Softmax 函数通常用于多分类问题,但我们也可以看看它在二分类问题中的表现。

对于一个有 K 个类别的分类问题,Softmax 函数会将一个 K 维的向量 $z = [z_1, z_2, ..., z_K]$ 转换为一个 K 维的概率分布向量 $p = [p_1, p_2, ..., p_K]$,其中:

$p_i = frac{e^{z_i}}{sum_{j=1}^{K} e^{z_j}}$

Softmax 函数有几个关键特性:

输出总和为 1: 所有输出类别的概率加起来等于 1。
输出值在 0 到 1 之间: 每个类别的概率都在这个范围内。
指数化: 它会将输入值进行指数化,使得较大的输入值对应更大的概率。

现在,让我们看看 Softmax 如何应用到二分类问题(K=2):

假设我们有一个包含两个输出神经元的网络。
第一个输出神经元计算得到 $z_1$。
第二个输出神经元计算得到 $z_2$。

Softmax 函数将它们转换为概率:

$p_1 = frac{e^{z_1}}{e^{z_1} + e^{z_2}}$
$p_2 = frac{e^{z_2}}{e^{z_1} + e^{z_2}}$

问题来了:

在二分类问题中,我们只需要知道样本属于“正类”的概率(或者“负类”的概率)。
如果我们使用 Softmax,我们会得到两个概率 $p_1$ 和 $p_2$。 我们可以将 $p_1$ 理解为属于类别 1 的概率,将 $p_2$ 理解为属于类别 2 的概率。
但 Softmax 这种“输出两个概率”的方式,有点“多此一举”了。 因为我们知道 $p_1 + p_2 = 1$。如果我们计算出了 $p_1$,那么 $p_2$ 就自然是 $1 p_1$。

更重要的是,Softmax 在内部通常是利用了两个输出之间的差值来做判断的。

考虑一下 Softmax 的表达式:
$p_1 = frac{e^{z_1}}{e^{z_1} + e^{z_2}}$
$p_2 = frac{e^{z_2}}{e^{z_1} + e^{z_2}}$

如果我们对 $z_1$ 和 $z_2$ 同时加上或减去同一个值 $C$,比如 $z'_1 = z_1 + C$ 和 $z'_2 = z_2 + C$,那么:

$p'_1 = frac{e^{z_1 + C}}{e^{z_1 + C} + e^{z_2 + C}} = frac{e^{z_1}e^{C}}{e^{z_1}e^{C} + e^{z_2}e^{C}} = frac{e^{z_1}}{e^{z_1} + e^{z_2}} = p_1$
$p'_2 = frac{e^{z_2 + C}}{e^{z_1 + C} + e^{z_2 + C}} = frac{e^{z_2}e^{C}}{e^{z_1}e^{C} + e^{z_2}e^{C}} = frac{e^{z_2}}{e^{z_1} + e^{z_2}} = p_2$

这意味着 Softmax 的输出概率对输出层神经元的绝对值不敏感,只对它们之间的相对差值敏感。

那么,Softmax 在二分类问题中“不够优化”的地方在哪里?

1. 冗余的计算: Softmax 计算了两个概率,而我们只需要一个。
2. 冗余的参数: 我们需要两个输出神经元,而理论上一个就够了(假设你使用 Sigmoid)。

这里就涉及到一些更深层次的联系:

实际上,当 K=2 时,Softmax 函数会退化成 Sigmoid 函数。
让我们来看一下 Softmax 的公式:

$p_1 = frac{e^{z_1}}{e^{z_1} + e^{z_2}}$

如果我们令 $z = z_1 z_2$,那么:

$p_1 = frac{e^{z_1}}{e^{z_1} + e^{z_2}} = frac{e^{z_1 z_2}}{e^{z_1 z_2} + e^{z_2 z_2}} = frac{e^{z}}{e^{z} + e^{0}} = frac{e^{z}}{e^{z} + 1} = frac{1}{1 + e^{z}}$

Aha!这不就是 Sigmoid 函数吗?

所以,当你有一个包含两个输出神经元的网络,并且在输出层使用了 Softmax,那么你实际上的行为是:
计算 $z_1$ 和 $z_2$。
然后计算 $z = z_1 z_2$。
最后对 $z$ 应用 Sigmoid 函数,得到 $p_1 = ext{Sigmoid}(z)$。$p_2$ 就是 $1 p_1$。

结论:在标准的二分类问题中,选择 Sigmoid 更加直接、高效且符合逻辑。

Sigmoid: 通常只需要一个输出神经元,其输出就是属于正类的概率。
Softmax: 虽然也可以用于二分类,但它需要两个输出神经元,并且计算过程等效于将两个输出的差值输入到 Sigmoid 中。这会增加不必要的计算和参数。

什么时候可能会“误用”Softmax 来做二分类?

1. 通用框架: 有些深度学习框架在实现分类任务时,会默认提供 Softmax 作为多分类的激活函数。如果你在实现一个二分类器,但直接套用了多分类的流程,可能会不经意间使用了 Softmax(通常是通过设置输出层神经元数量为 2)。
2. 概念混淆: 有些人可能不太清楚 Sigmoid 和 Softmax 在二分类问题中的具体区别,而倾向于使用更通用的 Softmax。
3. 特定场景(极少见): 理论上,如果你想强制模型去学习两个输出之间的“相对关系”,并且希望它们加起来等于 1,或许会有一些非常特殊的、非标准的理由去使用 Softmax,但对于绝大多数二分类任务来说,这都不是首选。

总结一下,对于二分类问题:

首选 Sigmoid 激活函数。
模型输出层通常只需要一个神经元。
Sigmoid 的输出值直接代表了样本属于正类(标签为 1)的概率。
Softmax 用于多分类问题,输出的是属于各个类别的概率分布。

虽然 Softmax 在 K=2 时等价于 Sigmoid,但使用 Sigmoid 更为直接,避免了不必要的计算和概念上的混淆。所以,当你的任务是明确的二分类时,请毫不犹豫地选择 Sigmoid。

网友意见

user avatar

话不多说,直接上干货!

函数分类大pk!sigmoid和softmax,到底分别怎么用?



设计模型执行分类任务(如对胸部X光检查到的疾病或手写数字进行分类)时,有时需要同时选择多个答案(如同时选择肺炎和脓肿),有时只能选择一个答案(如数字“8”)。本文将讨论如何应用Sigmoid函数或Softmax函数处理分类器的原始输出值。


神经网络分类器


分类算法有很多种,但本文讨论的内容只限于神经网络分类器。分类问题可通过不同神经网络进行解决,如前馈神经网络和卷积神经网络。


应用Sigmoid函数或Softmax函数


神经网络分类器最终结果为某一向量,即“原始输出值”,如[-0.5, 1.2, -0.1, 2.4],这四个输出值分别对应胸部X光检查后发现的肺炎、心脏肥大、瘤和脓肿。但这些原始输出值是什么意思?


将输出值转换为概率可能更容易理解。比起看似随意的“2.4”,患有糖尿病的可能性为91%,这种说法更便于患者理解。


Sigmoid函数或Softmax函数可以将分类器的原始输出值映射为概率。


下图显示了将前馈神经网络的原始输出值(蓝色)通过Sigmoid函数映射为概率(红色)的过程:



然后采用Softmax函数重复上述过程:



如图所示,Sigmoid函数和Softmax函数得出不同结果。


原因在于,Sigmoid函数会分别处理各个原始输出值,因此其结果相互独立,概率总和不一定为1,如图0.37 + 0.77 + 0.48 + 0.91 = 2.53。


相反,Softmax函数的输出值相互关联,其概率的总和始终为1,如图0.04 + 0.21 + 0.05 + 0.70 = 1.00。因此,在Softmax函数中,为增大某一类别的概率,其他类别的概率必须相应减少。



Sigmoid函数应用:

以胸部X光检查和入院为例


胸部X光片:一张胸部X光片能够同时显示多种疾病,因此胸部X射线分类器也需要同时显示多种病征。下图为一张显示肺炎和脓肿的胸部X光片,在右侧的标签栏中有两个“1”:



入院:目标是根据患者的健康档案,判断该患者将来入院的可能性。因此,分类问题可设计为:根据诊断可能导致患者未来入院的病症(如果有的话),对该患者现有的健康档案进行分类。导致患者入院的疾病可能有多种,因此答案可能有多个。


图表:下面两个前馈神经网络分别对应上述问题。在最后计算中,由Sigmoid函数处理原始输出值,得出相应概率,允许多种可能性并存——因胸部X射线可能反映出多种异常状态,则患者入院的病因可能不止一种。




Softmax函数应用:

以手写数字和Iris(鸢尾花)为例


手写数字:在区别手写数字(MNIST数据集:en.wikipedia.org/wiki/M)时,分类器应采用Softmax函数,明确数字为哪一类。毕竟,数字8只能是数字8,不能同时是数字7。



Iris:Iris数据集于1936年引入(en.wikipedia.org/wiki/I),一共包含150个数据集,分为山鸢尾、杂色鸢尾、维吉尼亚鸢尾3类,每类各有50个数据集,每个数据包含花萼长度、花萼宽度、花瓣长度、花瓣宽度4个属性。


以下9个示例摘自Iris数据集:



数据集中没有任何图像,但下图的杂色鸢尾(en.wikipedia.org/wiki/I),可供你欣赏:



Iris数据集的神经网络分类器,要采用Softmax函数处理原始输出值,因为一朵鸢尾花只能是某一个特定品种——将其分为几个品种毫无意义。



关于“e”的注解


要理解Sigmoid和Softmax函数,应先引入 “e”。在本文中,只需了解e是约等于2.71828的数学常数。


下面是关于e的其他信息:


• e的十进制表示永远存在,数字出现完全随机——类似于pi。


• e常用于复利、赌博和某些概率分布的研究中。


• 下面是e的一个公式:



但e的公式不止一个。其计算方法有多种。


有关示例:intmath.com/exponential


• 2004年,谷歌公司首次公开募股达2,718,281,828美元,即“e百万美元”。


• 维基百科中人类历史上著名的十进制数字e的演变(https://en.wikipedia.org/wiki/E_%28mathematical_constant%29#Bernoulli_trials),从1690年的一位数字开始,持续到1978年的116,000位数字:




Sigmoid函数和Softmax函数


Sigmoid =多标签分类问题=多个正确答案=非独占输出(例如胸部X光检查、住院)


• 构建分类器,解决有多个正确答案的问题时,用Sigmoid函数分别处理各个原始输出值。


• Sigmoid函数如下所示(注意e):



在该公式中,σ表示Sigmoid函数,σ(zj)表示将Sigmoid函数应用于数字Zj。 “Zj”表示单个原始输出值,如-0.5。 j表示当前运算的输出值。如果有四个原始输出值,则j = 1,2,3或4。在前面的例子中,原始输出值为[-0.5,1.2,-0.1,2.4],则Z1 = -0.5,Z2 = 1.2,Z3 = -0.1,Z4 = 2.4。


所以,



Z2,Z3、Z4 的计算过程同上。


由于Sigmoid函数分别应用于每个原始输出值,因此可能出现的输出情况包括:所有类别概率都很低(如“此胸部X光检查没有异常”),一种类别的概率很高但是其他类别的概率很低(如“胸部X光检查仅发现肺炎”),多个或所有类别的概率都很高(如“胸部X光检查发现肺炎和脓肿”)。


下图为Sigmoid函数曲线:





Softmax =多类别分类问题=只有一个正确答案=互斥输出(例如手写数字,鸢尾花)


• 构建分类器,解决只有唯一正确答案的问题时,用Softmax函数处理各个原始输出值。


• Softmax函数的分母综合了原始输出值的所有因素,这意味着,Softmax函数得到的不同概率之间相互关联。


• Softmax函数表述如下:




除分母外,为综合所有因素,将原始输出值中的e ^ thing相加,Softmax函数与Sigmoid函数差别不大。换言之,用Softmax函数计算单个原始输出值(例如Z1)时,不能只计算Z1,分母中的Z1,Z2,Z3和Z4也应加以计算,如下所示:




Softmax函数的优势在于所有输出概率的总和为1:





区分手写数字时,用Softmax函数处理原始输出值,如要增加某一示例被分为“8”的概率,就要降低该示例被分到其他数字(0,1,2,3,4,5,6,7和/或9)的概率。

Sigmoid和Softmax的其他示例




总结


• 如果模型输出为非互斥类别,且可以同时选择多个类别,则采用Sigmoid函数计算该网络的原始输出值。


• 如果模型输出为互斥类别,且只能选择一个类别,则采用Softmax函数计算该网络的原始输出值。


留言 点赞 关注

我们一起分享AI学习与发展的干货

欢迎关注全平台AI垂类自媒体 “读芯术”

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有