What is the Softmax Function?详解机器学习中的Softmax函数【小白菜可懂】
目录
定义
softmax函数是把K个实值转换为另外K个实值并使K个实值之和为1的函数。输入数值可以是正数/负数/0或者几种的组合,经过softmax函数转换为[0,1]之间的数值,以便于用来描述概率分布。如果一个输入数值很小或负数,softmax函数则将它转换为小的概率值;如果一个输入数值很大,softmax函数则将它转换为大的概率值,每一个转换后的数值都将保持在[0,1]的范围之内。
Softmax函数有时被称为Softargmax函数,或multi-class logistic regression(多类别逻辑回归函数)。这是因为softmax函数是逻辑回归函数的一般化形式,可用来作多种类分类任务,它的公式与常用的逻辑回归sigmoid函数非常相似。Softmax函数这种分类器只能用在类别相互独立不相关的情况下。
很多多层神经网络在倒数第二层结束时输出的结果不便于规整,很难处理。在此,softmax函数正好派上用场,因为它可以把输出的结果数值归一化到概率的分布上,可以展示给用户或者作为输入传给其他系统。因此经常在神经网络的最后一层加上softmax函数。
公式
softmax函数公式如下:
Mathematical definition of the softmax function

所有的zi值是输入vector的元素,可以是任意实值。下面各项是归一化项来保证输出数值之和等于1,也就构成了一个有效的符合逻辑的概率分布。
【Softmax公式符号解释】
![]() | 输入vector,由( )组成 |
![]() | 有的zi值是输入vector的元素,可以是任意实值。例如一个神经网络有一个(-0.62,8.12,2.53)的vector输出,这不是一个有效的符合逻辑的概率分布,这正是softmax的用武之地。 |
![]() | 标准的指数函数被用于输入vector的每一个元素,它输出一个大于0的正值,如果输入负值,则输出结果小,如果输入大正值,则输出结果大。然而,输出结果不会被限定于(0,1)之间,不符合概率分布的要求。 |
![]() | 公式的分母项是归一化项,它保证函数输出结果值之和为1,且每个输出结果在(0,1)之间,因此构成一个有效的符合逻辑的概率分布。 |
![]() | 多类别分类器的类别数量。 |
计算
假设有一个包含三个实值的数组。这些值可能是机器学习模型(神经网络模型)的输出。我们想把这些值转换为概率分布。

首先计算数组每个元素的指数函数值。这是softmax等式的分子项。

这些值还不像是概率值。注意输入元素,尽管8只比5大一点,2981却比148大很多,这是因为指数函数作用。我们能够归一化它们,通过上述三个指数运算后结果的求和来作为softmax等式的分母。

我们看到归一化项主要受z1的影响。
最后,除以归一化项,我们得到了每个元素的softmax输出数值。注意这不是单个的输出数值,而是softmax函数将一个数组转换为同长度的数组,在此长度为3。

经我们检验,三个输出值都是有效的符合逻辑的概率值,它们处于(0,1)之间,且求和为1。
由于指数运算,第一个元素8,softmax函数放大了它的影响力,同时压缩5和0的输出值,降到很小的概率值。
如果你在机器学习模型中使用softmax函数,在解释它为真实概率值之前要谨慎,因为它有一个产生近似于0或1数值的偏向趋势。如果神经网络有一个[8,5,0]输出值,如示例所示,softmax函数将会赋予95%的概率值给第一个类别,但这在实际神经网络预测中存在不确定性。这将会导致神经网络预测有一个很高的置信度,但是预测的结果却不是真实的结果。
Softmax vs Sigmoid
如上所述,softmax函数与sigmoid函数是相似的。softmax运算的是vector,sigmoid运算的是标量。

实际上,sigmoid函数是softmax函数的一种特殊形式,是一种二分类的分类器。我们看到,如果我们设置输入vector为[x,0],用softmax公式计算第一个元素的输出数值:

分式上下同除以
,可得:

可见,当二分类时,sigmoid函数与softmax函数是相等的。计算vector第二个元素的数值是不必要的,因为只有两个概率值且它们和为1。故而,我们用逻辑回归开发一个两个类别的分类器,我们可以使用sigmoid函数,不用去处理vectors。但是,超过两个的/相互独立不相关的类别时须使用softmax函数。
如果超过两个类别但是它们不是相互独立的类别(多标签分类器,举个🌰:一辆骚红色的/敞篷的轿车,打了red/open-body/car三个标签,包含了颜色/框架结构/功能类别三个属性,三个属性至之间的类别便不是相互独立的,可以交叉相互从属)时,分类器必须分解为多个二元分类器,每种使用独有的sigmoid函数。
Softmax vs Sigmoid 计算
我们设定输入vector为[3,0],将其代入softmax和sigmoid函数。尽管sigmoid函数输入的是标量,我们可以只选择vector第一个元素代入sigmoid函数。

当vector第二个元素被设定为0时,对于vector第一个元素,sigmoid函数和softmax函数给出了相同的数值。因为sigmoid给出的是概率值且两个概率值之和必须是1,所以计算vector的第二个元素的输出值不是必要的。
Softmax vs Argmax
相较于argmax函数,softmax函数被用于是一种平滑的可微的选择。因此softmax函数有时候被更明确地称之为softargmax函数。和softmax函数一样,argmax函数进行vector运算,转换每一个数值到0,除了最大值之外,最大值被转换为1。

如果zi是vector z唯一的最大值,则yi=1。
通常,训练一个机器学习模型时使用softmax,但是利用模型推断时关闭argmax层的softmax层。
训练时必须使用softmax,因为softmax是连续可微的,允许我们去优化损失函数。然而,推断时有时候我们需要模型输出单独的预测值而非概率值,这种情况下argmax函数更有用。
当有多个最大值时,通常argmax返回1/Nmax,这是一种归一化结构,以便于保证输出元素之和为1,这点与softmax一致。另外一种可选择的定义是,所有最大值都返回为1,或者只返回第一个为1。
Softmax vs Argmax 计算
翻译家让我们再次设定输入vector为[3,0],softmax计算同上。最大值是第一个元素,故而argmax第一个元素的返回值为1,其他为0。

从🌰中可以清楚地看到,softmax像是“软化”了的argmax的估算值:它返回的是[0,1]之间的非整数数值,可作为有效的符合逻辑的概率值。如果我们用机器学习模型来作推断,而不是训练它,那么我们可能希望得到一个整数输出结果,这个结果是系统代替我们经过一个困难的决策后作出的,这类决策任务可以是诊断肿瘤/确认版权/签署文件等。这种情况下argmax输出的数值更容易处理,可以用来建立混淆矩阵和计算分类器的准确度和召回率。
应用
神经网络中的Softmax函数
softmax函数一种用途是放在神经网络的最后一层。举个🌰,一个识别猫狗的CNN,要求一张图像里要么是😺要么是🐶,不能同时包含猫狗,因此这两个类别是相互独立不相关的。一般的,网络最后的全连接层将会产生诸如[-7.98,2.39]这样的vector数值,尚未归一化,不是有效的符合逻辑的概率值。如果我们在网络最后添加一层softmax层,将会把这些数值转换为概率分布。这就意味着输出结果可以直接呈现给用户,例如95%的概率确定这是一只😺。也意味着输出结果可以导入其他的机器学习模型,而不用归一化操作,因为已经保证了[0,1]区间范围。
注意到如果网络将图像分类为😺和🐶,被配置为有两个种类的输出结果,则每张图像将被强制分类为其中之一,要么😺要么🐶,即使图像既不是😺也不是🐶。如果我们允许这种可能性,我们必须重新配置神经网络使之包含混杂类别的第三种类别。
神经网络中的Softmax计算示例
训练伸进网络时softmax是必要的。假设我们有一个识别猫狗的神经网络。我们设定😺为class1,🐶为class2。
当我们输入一张😺的图像到网络时,网络输出结果为[1,0]。当输入一张🐶的图像时,我们希望得到结果[0,1]。
神经网络图像处理到最后的全连接层结束。这层输出结果包含猫狗的两个数值,但还不是概率值。通常操作是在神经网络的最后再添加一层softmax层,转换结果数值为概率分布。训练之始,神经网络权重是随机配置的。例如😺图像进入网络到达图像处理最后阶段的分值为[1.2,0.3]。将[1.2, 0.3]送入softmax函数,我们便能够得到最初的概率分布[0.71,0.29]。

显而易见,这不是想要的。这种情况下,完美的网络应该输出[1,0]。

我们可以设定网络的损失函数,来量化网络的输出概率和我们期望的概率的差距。损失函数数值越小,输出vector与正确类别越接近。这种情况下最常用的损失函数是交叉损失熵,此函数值为:

因为softmax是连续的可微的函数,对于网络中的每一个权重,训练集中每一张图像,可以计算损失函数的导数。
这种性质允许我们适配网络权重以减小损失函数,使网络输出数值更接近于我们期望的数值,提升网络的准确度。多次迭代训练之后,更新网络权重。现在当同样的一张😺图像送入网络后,全连接层的输出结果为vector[1.9,0.1]。把它再次送入softmax函数,我们得到输出概率值:

显然,这是一个更好的结果,更接近于希望的结果[1,0]。重新计算交叉损失熵:

我们看到,损失函数减小了,表明神经网络提升了。
区分损失函数差别是为了查明网络权重如何调整的,这种方法当我们使用argmax函数时变的不可行,因为argmax结果没有区分度。这种具有区分度的性质使得softmax函数在训练神经网络时非常有用。
强化学习中的Softmax函数
在强化学习中,当模型需要决策时softmax函数也经常使用,采取行动获得最高的激励,称之为“利用-exploitation”,或者探索步骤,称之为“探索-exploration”。
强化学习中的Softmax计算示例
假设我们训练一个打扑克的人机对抗的强化学习模型。我们必须配置一个温度
,用来描述系统随机探索行为的相似度。现在系统有两个选择:出牌A或出牌王。目前从它学到的判断,当前条件下,出牌A有80%可能赢。假设没有其他可能的出牌方式,出牌王有20%可能赢。我们配置温度参数
为2。
强化学习系统使用softmax函数得到出牌A和出牌王的概率。强化学习中修改的softmax公式如下所示:

强化学习softmax公式符号解释

将数值代入等式,可得:

这意味着尽管模型出牌A有80%确信度是正确的策略,但是只有57%可能性出这手牌。这是因为强化学习中我们设定一个值去探索(测试出新的策略)同时去利用(利用既有策略)。如果我们选择提高温度参数,模型会变得更加“冲动”:它更可能执行探索步骤而非总是执行获胜的策略。
历史
提示:已知最早的softmax函数的使用早于机器学习。事实上,softmax函数来自于物理学和统计力学,因波尔兹曼分布和吉布斯分布而知名。公式由奥地利物理学家和哲学家Ludwig Boltzmann于1868年提出。
波尔兹曼研究热平衡系统中的气体统计热力学。他发现波尔兹曼分布能描述特定状态系统的概率,给出状态的能量和系统的温度。他提出的公式的版本与强化学习中的更相似。实际上,在强化学习领域参数
被称为温度也是为了致敬波尔兹曼。
1902年美国物理学家和化学家Josiah Willard Gibbs推广了波尔兹曼分布,他据此因热力学和熵的定义获得基金。这也奠定了光谱学的基础,即是通过观察材料吸收和反射的光线来分析材料。
1959年在自己著作《Individual Choice Behavior: A Theoretical Analysis》中 Robert Duncan Luce提出应用softmax函数。最后1989年John S. Bridle提出在神经网络前向传播中由softmax取代argmax,因为softmax维持了输入值的等级序列,是捷取最大值“赢家通吃”操作的有区分度的一般化过程。近些年来,随着神经网络广泛应用,softmax因为上述性质变得众所周知。
参考
What is the Softmax Function?https://deepai.org/machine-learning-glossary-and-terms/softmax-layer
https://deepai.org/machine-learning-glossary-and-terms/softmax-layer
Softmax functionhttps://en.wikipedia.org/wiki/Softmax_function
https://en.wikipedia.org/wiki/Softmax_function

)组成


