概述
oftmax函数的表达式 $ \text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{j} e^{x_j}} $,但在计算机的运算上有一定的缺陷。这个缺陷就是溢出问题。
softmax函数的实现中要进行指数函数的运算,但是此时指数函数的值很容易变得非常大。比如,e^{10} 的值会超过20000,
e^{100} 会变成一个后面有40多个0的超大值, e^{1000} 的结果会返回一个表示无穷大的inf。如果在这些超大值之间进行除法运算,结果会出现“不确定”的情况。
计算机处理“数”时,数值必须在4字节或8字节的有限数据宽度内。这意味着数存在有效位数,也就是说,可以表示的数值范围是有限的。因此,会出现超大值无法表示的问题。这个问题称为溢出,在进行计算机的运算时必须(常常)注意。
数学原理
首先,在上式中分子和分母上都乘上C这个任意的常数(因为同时对分母和分子乘以相同的常数,所以计算结果不变)。然后,把这个C移动到指数函数(exp)中,记为log C。最后,把log C替换为另一个符号C'。所以,在进行softmax的指数函数的运算时,加上(或者减去)某个常数并不会改变运算的结果。这里的C'可以使用任何值,但是为了防止溢出,一般会使用输入信号中的最大值。
python 代码
def softmax(a):
c = np.max(a)
exp_a = np.exp(a - c) # 溢出对策
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
为什么要用 e^x 的形式修改 x 的值?
在神经网络中,Softmax函数经常被用作最后一层的激活函数,尤其是在多类分类问题中。Softmax函数将每个神经元的输出转化为一个概率分布的一部分,使得这些概率值加起来总是等于1。
使用 (e^x) 的原因包括:
-
概率解释:(e^x) 将任何实数转换成正数,这对于表示概率是必要的,因为概率值必须是非负的。
-
归一化:通过除以所有 (e^{z_j}) 的和,确保了输出的概率分布是归一化的,即所有输出的概率值相加等于1。
-
非线性映射:指数函数是非线性的,这使得Softmax函数能够提供一个非线性的映射,这对于复杂的分类任务至关重要。
-
数值稳定性:直接计算 (e^x) 可能会导致数值上的不稳定,特别是当 (x) 很大时。为了避免这种情况,通常会从每一个 (x_i) 中减去最大值 (x_{\text{max}})(即 (x_i - x_{\text{max}})),这样可以防止在计算过程中出现过大的指数值,从而避免了溢出。
-
最大值增强:指数函数有一个属性,就是它可以放大最大值与其他值之间的差距。这意味着在Softmax函数的输出中,最大值对应的类别的概率会显著高于其他类别,这有助于模型更清晰地区分不同的类别。
综上所述,使用 (e^x) 的形式是基于其能够提供概率解释、归一化输出、非线性映射以及数值稳定性的优点。这些特点共同使得Softmax函数成为多类分类任务中非常有效的工具。
标签:指数函数,函数,最大值,稳定性,Softmax,exp,softmax From: https://www.cnblogs.com/litifeng/p/18399317