Softmax函数个人解读

1 什么是Softmax?

     S o f t m a x = s o f t + m a x Softmax=soft + max Softmax=soft+max,其中 m a x max max就是求最大值的意思,其核心是soft,在英文中soft有软的意思。与之相对应的hardmax,也就是说的在实际中经常求得最大值,如:numpy.max()。

    通过上述这个例子,我们不难发现hardmax最大特点就是其求出的最大值是唯一的。因此,在一些特定的应用场景中,这个方法是很不合理的,比如:文本分类,一篇文章可能包含多种主题的信息(即多个类别),我们更期望得到文章属于各个类别的概率值(置信度)。
    以下是 Softmax 函数的定义:
S o f t m a x ( z i ) = e z i ∑ c = 1 C e z c Softmax\left(z_i\right)=\frac{e^{z_i}}{\sum_{c=1}^C e^{z_c}} Softmax(zi)=c=1Cezcezi
    其中== z i z_i zi为第 i i i个节点的输出值, C C C为输出节点的个数,即类别个数==。通过Softmax函数就可以将多分类问题的输出值转换到区间 [0,1] 和为1的概率分布

2 Softmax 优点

    Softmax函数从基本上来看就是一个指数函数最大特点:随着x的不断增大,斜率不断增大。即:x轴上的一个很小的变化,会导致y轴的很大变化。总的来说:Softmax函数可以拉开输出值之间的距离

在这里插入图片描述

    假设某篇文章可能存在的种类有3类(例如:冒险、科幻等),我们将离散的类别转化为连续的数字 z 1 , z 2 , z 3 z_1,z_2,z_3 z1,z2,z3为 [4,5,6] 。我们尝试使用softmax和不使用softmax两种方法

import numpy as np

z=np.array([4,5,6])
ans1=z/np.sum(z)		# 不使用softmax
print(ans1)  # array([0.26666667, 0.33333333, 0.4       ])

ans2=np.exp(z)/np.sum(np.exp(z))	# 使用softmax
print(ans2)  # array([0.09003057, 0.24472847, 0.66524096])

    从两种计算方法的结果中,我们不难发现,使用指数形式的softmax能够将数值之间的距离拉的更大。

    使用Softmax函数的另一个优点就是,在深度学习中通常使用反向传播求解梯度来进行参数的更新。指数函数在进行梯度下降时更容易求导。如: ( e x ) ′ = e x (e^x)'=e^x (ex)=ex

3 Softmax 缺点

    当x非常大时,指数函数的y值会变得非常大,数值可能会溢出

import numpy as np

print(np.exp(300))  # 1.9424263952412558e+130

z=np.array([123,456,789])
softmax=np.exp(z)/np.sum(np.exp(z))
print(softmax)  # array([ 0.,  0., nan])

    因此,==当 z i z_i zi的值过大时,softmax函数就存在着数值溢出的风险。==争对数值溢出可以使用方法对其进行优化,如:将每一个输出值 - 输出值中的最大值。

z=np.array([123,456,789])
z-=np.max(z)
softmax=np.exp(z)/np.sum(np.exp(z))
print(softmax) # [5.75274406e-290 2.39848787e-145 1.00000000e+000]
参考资料

[1] https://zhuanlan.zhihu.com/p/105722023

在这里插入图片描述