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