首先我们知道神经网络输出层的结果一般无法直接作为概率值,因为它既包含负值,加和也不为1,这是不满足概率的定义的。因此首先我们需要对其做一个转化使得:
- 向量值全为非负值
- 向量值加和等于1
- 转化是递增函数
而上面几个条件就排除了 x i ∑ i x i \frac{x_i}{\sum_{i} x_i} ∑ixixi, x i 2 ∑ i x i 2 \frac{x_i^2}{\sum_{i} x_i^2} ∑ixi2xi2, ∣ x i ∣ ∑ i ∣ x i ∣ \frac{|x_i|}{\sum_{i} |x_i|} ∑i∣xi∣∣xi∣ 等naive的方法,因为它们可能会出现除零,非线性递增等问题。
其实看完上面的例子,不难想到,要同时满足非负性和递增性,最简单的就是指数函数
e
x
p
exp
exp 和对数函数
l
o
g
log
log了,例如下面的函数就可以满足所有条件:
log
(
1
+
exp
(
x
i
)
)
∑
j
log
(
1
+
exp
(
x
j
)
)
\frac{\text{log}(1+\text{exp}(x_i))}{\sum_j \text{log}(1+\text{exp}(x_j))}
∑jlog(1+exp(xj))log(1+exp(xi))
事实上你也可以使用这个函数作为多分类的概率函数。但是推动我们使用softmax的主要原因有两点:
- 根据 广义线性模型推导多项Logistic模型 中的论述,softmax函数是当数据服从Multinoulli分布时广义线性模型的目标函数形式。因此使用softmax函数暗含了数据服从Multinoulli分布。
- 由于多分类的损失函数是交叉熵:
L = − ∑ i y i log ( s i ) L = -\sum_i y_i \text{log}(s_i) L=−i∑yilog(si)
而当 s i s_i si 为softmax函数 e z i ∑ k e z k \frac{e^{z_i}}{\sum_k e^{z_k}} ∑kezkezi 时,会带来计算的简便性:
∂ L ∂ z j = − ∑ i y i s i ⋅ ∂ s i ∂ z j = − ∑ i y i s i ⋅ e z i ⋅ ∂ z i ∂ z j ⋅ ∑ k e z k − e z j ⋅ e z i ( ∑ k e z k ) 2 = − ∑ i y i s i ⋅ e z i ∑ k e z k ⋅ 1 { i = j } ⋅ ∑ k e z k − e z j ∑ k e z k = − ∑ i y i s i ⋅ s i ⋅ ( 1 { i = j } − s j ) = − ∑ i y i ( 1 { i = j } − s j ) = s j ∑ i y i − ∑ i y i ⋅ 1 { i = j } = s j − y j \begin{aligned} \frac{\partial L}{\partial z_j} &= - \sum_i \frac{y_i}{s_i}\cdot \frac{\partial s_i}{\partial z_j}\\ &= - \sum_i \frac{y_i}{s_i}\cdot \frac{e^{z_i}\cdot \frac{\partial z_i}{\partial z_j}\cdot \sum_{k}e^{z_k} - e^{z_j}\cdot e^{z_i}}{(\sum_{k}e^{z_k})^2}\\ &= - \sum_i \frac{y_i}{s_i}\cdot \frac{e^{z_i}}{\sum_k e^{z_k}} \cdot \frac{ 1\{i=j\}\cdot \sum_{k}e^{z_k} - e^{z_j}}{\sum_{k}e^{z_k}}\\ &= - \sum_i \frac{y_i}{s_i}\cdot s_i \cdot (1\{i=j\} - s_j)\\ &= - \sum_i y_i (1\{i=j\} - s_j)\\ & = s_j \sum_i y_i - \sum_i y_i\cdot 1\{i=j\}\\ &= s_j -y_j \end{aligned} ∂zj∂L=−i∑siyi⋅∂zj∂si=−i∑siyi⋅(∑kezk)2ezi⋅∂zj∂zi⋅∑kezk−ezj⋅ezi=−i∑siyi⋅∑kezkezi⋅∑kezk1{i=j}⋅∑kezk−ezj=−i∑siyi⋅si⋅(1{i=j}−sj)=−i∑yi(1{i=j}−sj)=sji∑yi−i∑yi⋅1{i=j}=sj−yj
显然上面的例子 log ( 1 + exp ( x i ) ) ∑ j log ( 1 + exp ( x j ) ) \frac{\text{log}(1+\text{exp}(x_i))}{\sum_j \text{log}(1+\text{exp}(x_j))} ∑jlog(1+exp(xj))log(1+exp(xi)) 就没有这样的计算简便性。