目录
前言
本文是对一篇国外的讲解Softmax的文章的翻译。
Softmax函数的输入是一个N维的向量,向量元素是任意实数,输出也是一个N维的向量,但是有如下性质:
- 输出向量元素取值范围是(0, 1)
- 对输出向量的所有元素求和时,和为1
Softmax函数是这样一个映射 S ( a ) : R N → R N S(a): \mathbb{R}^N \xrightarrow{} \mathbb{R}^N S(a):RNRN
S ( a ) : [ a 1 a 2 . . . a N ] → [ S 1 S 2 . . . S N ] S(a): \begin{bmatrix} a_1 \\ a_2 \\ ... \\ a_N\end{bmatrix} \xrightarrow{} \begin{bmatrix} S_1 \\ S_2 \\ ... \\ S_N \end{bmatrix} S(a):⎣⎢⎢⎡a1a2...aN⎦⎥⎥⎤⎣⎢⎢⎡S1S2...SN⎦⎥⎥⎤
并且对于每个元素,用的是如下公式
S j = e a j ∑ i = 1 N e a k , ∀ j ∈ 1... N S_j= \frac{e^{a_j}}{\sum_{i=1}^N e^{a_k}}, \forall_j \in 1...N Sj=∑i=1Neakeaj,∀j∈1...N
我们很容易看到, S j S_j Sj永远是正数(因为式中全是对 e e e求幂),并且由于在分母中包含了分子与其它正数求和,所以 0 < S j < 1 0<S_j<1 0<Sj<1。
举个例子,向量[1.0, 2.0, 3.0]
通过Softmax变成了[0.09, 0.24, 0.67]
。元素顺序不变,并且和为1。假如是[1.0, 2.0, 5.0]
通过Softmax变成了[0.02, 0.05, 0.93]
,同样是顺序不变,且和为1。可以注意到,0.93
比另外2个数字大很多,而且在和为1的情况下,0.93
已经占了绝大多数。直观地来讲,Softmax函数是“温柔”版的最大值函数,不同的是,Softmax没有直接取一个最大值,而是将所有元素变成各自占 100 % 100\% 100% 的不同比例,元素占比越大,Softmax最终的输出值就越大,当然其他元素得出的值就越小。[1]
一、概率学解释
Softmax的两个性质使得它非常适合用概率来解释,这也让Softmax在机器学习领域大有用途。在多分类任务中,我们希望给每个输入做一个标注,标注它属于每个类的概率是多大。
如果我们有N个类别,目标就是找到一个N维向量,每个元素代表这个样本是此类别的概率,这个向量元素求和是1。听起来是不是比较熟悉?
我们可以把Softmax解释成如下所示:
S j = P ( y = j ∣ a ) S_j=P(y=j|a) Sj=P(y=j∣a)
其中, y y y代表输出的类别,范围是 1... N 1...N 1...N, a a a是一个N维向量。有一个最基础的例子就是在多分类逻辑回归中,我们会把一个输入向量 x x x和一个权重向量 w w w做点积,然后这个点积被输入到Softmax中去计算概率。这种结构后面会讲到
我们可以发现,从概率学角度看,Softmax用于模型参数的最大似然估计是最优的,但是这超出了本文范围,具体可以看Deep Learning的第5章。
二、Softmax求导
1.向量微积分
在开始对Softmax进行求导之前,我们先看看如何对向量求导。
Softmax本质上是一个向量函数,输入输出都是向量,换句话说,Softmax有多个输入和多个输出,所以我们不能直接就问“Softmax的导数是什么”,我们应该这么问:
- 在Softmax输出的向量中,我们要计算的是哪个元素的导数值?
- 别忘了Softmax的输入也是向量,有多个元素,所以我们是在关于哪个变量在求偏导呢?
如果你觉得这个听起来很复杂,不要担心,向量微积分就是用来干这事的!我们要找的是这些偏导数:
∂ S i ∂ a j ~\\ \frac{\partial{S_i}}{\partial{a_j}}\\ ∂aj∂Si
这是 第 i 个 输 出 关 于 第 j 个 输 入 求 偏 导 第i个输出关于第j个输入求偏导 第i个输出关于第j个输入求偏导,我们把这个记作: D j S i D_jS_i DjSi。
由于Softmax是 R N → R N \mathbb{R}^N \xrightarrow{} \mathbb{R}^N RNRN的函数,如果整体求导,我们实际上求的是一个 雅 可 比 矩 阵 ( J a c o b i a n M a t r i x ) 雅可比矩阵(Jacobian \ Matrix) 雅可比矩阵(Jacobian Matrix):
D S = [ D 1 S 1 ⋯ D N S 1 ⋮ ⋱ ⋮ D N S 1 ⋯ D N S N ] DS= \begin{bmatrix} D_1 S_1 & \cdots & D_N S_1 & \\ \vdots & \ddots & \vdots \\ D_N S_1 & \cdots & D_N S_N \end{bmatrix} DS=⎣⎢⎡D1S1⋮DNS1⋯⋱⋯DNS1⋮DNSN⎦⎥⎤
在机器学习的文章中,“梯度”常被用来代替“导数”。严格地说,“梯度”是仅针对于标量而定义的(比如机器学习中的损失函数),但对于像Softmax这样的向量函数来说,用“梯度”是不准确的,“雅可比矩阵”才是对向量函数的导数的名称,但是为了方便描述,大多数场合我也直接用“导数”来描述。
2.Softmax的导数
让我们开始计算 D j S i ( 任 意 i 和 j ) D_jS_i(任意i和j) DjSi(任意i和j):
D j S i = ∂ S i ∂ a j = ∂ e a j ∑ k = 1 N e a k ∂ a j \begin{aligned} D_jS_i &= \frac{\partial{S_i}}{\partial{a_j}} \\ &= \frac{\partial{ \frac{e^{a_j}}{\sum_{k=1}^N e^{a_k}}{} }}{\partial{a_j}} \end{aligned} DjSi=∂aj∂Si=∂aj∂∑k=1Neakeaj
我们使用一下分式函数求导公式:
对 于 f ( x ) = g ( x ) h ( x ) f ′ ( x ) = g ′ ( x ) h ( x ) − h ′ ( x ) g ( x ) h 2 ( x ) 对于f(x)=\frac{g(x)}{h(x)} \\ ~\\ f'(x)=\frac{g'(x)h(x) - h'(x)g(x)}{h^2(x)} \\ 对于f(x)=h(x)g(x) f′(x)=h2(x)g′(x)h(x)−h′(x)g(x)
我们让 g i = e a i , h i = ∑ k = 1 N e a k g_i=e^{a_i},h_i=\sum_{k=1}^Ne^{a_k} gi=eai,hi=∑k=1Neak ,注意无论 h i h_i hi 关于哪个 a j a_j aj 求偏导结果都是 e a j e^{a_j} e<