- 简介
Softmax 函数
Softmax 函数在神经网络分类是十分常用的函数,如下所示,在神经元output layer中,可以输出一个R4 维度的向量,来进行分类,例如输出层为向量 O=[0.2,0.1,0.4,0.3], 可根据向量中元素大小(元素之和为1)来判断该输入(可以是图片,也可以是文字)属于哪一类,而在这种分类的情况中,Softmax 函数就起到了十分重要的作用。

Softmax 函数的公式为:ai=∑j=1nezjezi
其中,ai 为第 i 个神经元经过Softmax 函数得到的值,zi 为第 i 个神经元的输出值,其计算公式为 $ z_{i}=W_{i}*x+ b $ $(W_{i}为权重矩阵W_{ij} 的第i行)。 $
代价函数交叉熵
为了计算损失函数,我们使用交叉熵代价函数,有 Loss=−∑inyilogai
其中 yi 代表第ai 个输出的真实值。
- Softmax函数交叉熵的求导
1)
对于Softmax函数的求导,用得最多的应该是链式法则,对于链式法则,举个例子如下:
设我们有函数 g(f(x)), 则∂x∂g(f(x))=∂f(x)∂g(f(x))∂x∂f(x), 这就是链式法则。
2)
对于交叉熵函数求导,首先,我们要求导的是交叉熵对神经元输出的梯度: ∂zi∂L
根据链式法则,我们有:∂zi∂L=∂aj∂L∂zi∂aj
其中, 使用 aj 是因为对Softmax函数包含了所有神经网络输出的和,即 ai=∑j=1nezjezi,所以,就算我们不是求交叉熵对aj的梯度,但是aj依旧包含了ai 的元素。
总的来说就是,由于Softmax 函数的特殊性,对于aj 第j个神经元的输出,其中也包含了ai 中的元素。
3)
对于求 ∂zi∂L=∂aj∂L∂zi∂aj ,可先求其前半部分 ∂aj∂L:
∂aj∂L=∂aj∂(−∑jnyjlogaj)=−∑jnajyj
当j=i 时,∂ai∂L=−aiyi
当j̸=i时,∂aj∂L=−∑j̸=inajyj
(4)
公式 ∂zi∂L=∂aj∂L∂zi∂aj 的第二部分: ∂zi∂aj , 需要分俩种情况讨论,即 j=i 和 j̸=i 俩种情况。
对于 j=i,
∂zi∂ai=∂zi∂∑j=1nezjezi=(∑j=1nezj)2ezi∑j=1nezj−(ezi)2=∑j=1nezjezi−(∑j=1nezjezi)2=ai−ai2=ai(1−ai)
对于 j̸=i,
∂zi∂aj=∂zi∂∑j=1nezjezj=(∑j=1nezj)2−ezjezi=−∑j=1nezjezj∑j=1nezjezi=−ajai
因此,对于第二部分的求导,我们有 ∂zi∂aj=ai(1−ai)+∑j̸=in−ajai
5)
则对于∂zi∂L=∂aj∂L∂zi∂aj,我们有:
$\frac{\partial{L}}{\partial{z_{i}}} $
=∂aj∂L∂zi∂aj
$= -\frac{y_{i}}{a_{i}}(a_{i}(1-a_{i})) + \sum^{n}{j \neq i}\frac{y{j}}{a_{j}}a_{j}a_{i} $
=−yi(1−ai)+∑j̸=inyjai
$ = -y_{i}+a_{i}y_{i}+\sum^{n}{j \neq i}y{j}a_{i}$
=−yi+ai∑j=1nyj
由于对真实值,我们知道 yj 为第i个神经元期望输出的值,一般而言,∑j=1nyj=1, 故对于这种通过 Softmax函数的输出来确定其分类的,只有一个类别会是1,因此有代价函数对第i个神经元的输出 zi 的梯度为:
∂zi∂L=−yi+ai