1. 简介
Softmax
函数
Softmax
函数在神经网络分类是十分常用的函数,如下所示,在神经元output layer中,可以输出一个
R4
维度的向量,来进行分类,例如输出层为向量
O=[0.2,0.1,0.4,0.3]
, 可根据向量中元素大小(元素之和为1)来判断该输入(可以是图片,也可以是文字)属于哪一类,而在这种分类的情况中,
Softmax
函数就起到了十分重要的作用。
Softmax
函数的公式为:
ai=ezi∑nj=1ezj
其中,
ai
为第
i
个神经元经过
Softmax
函数得到的值,
zi
为第
i
个神经元的输出值,其计算公式为
zi=Wi∗x+b
(Wi为权重矩阵Wij的第i行)。
代价函数交叉熵
为了计算损失函数,我们使用交叉熵代价函数,有
Loss=−∑niyilogai
其中
yi
代表第
ai
个输出的真实值。
2. Softmax函数交叉熵的求导
1)
对于Softmax函数的求导,用得最多的应该是链式法则,对于链式法则,举个例子如下:
设我们有函数
g(f(x))
, 则
∂g(f(x))∂x=∂g(f(x))∂f(x)
∂f(x)∂x
, 这就是链式法则。
2)
对于交叉熵函数求导,首先,我们要求导的是交叉熵对神经元输出的梯度:
∂L∂zi
根据链式法则,我们有:
∂L∂zi=∂L∂aj
∂aj∂zi
其中, 使用
aj
是因为对
Softmax
函数包含了所有神经网络输出的和,即
ai=ezi∑nj=1ezj
,所以,就算我们不是求交叉熵对
aj
的梯度,但是
aj
依旧包含了
ai
的元素。
总的来说就是,由于
Softmax
函数的特殊性,对于
aj
第
j
个神经元的输出,其中也包含了
ai
中的元素。
3)
对于求
∂L∂zi=∂L∂aj
∂aj∂zi
,可先求其前半部分
∂L∂aj
:
∂L∂aj=∂(−∑njyjlogaj)∂aj=−∑njyjaj
当
j=i
时,
∂L∂ai=−yiai
当
j≠i
时,
∂L∂aj=−∑nj≠iyjaj
(4)
公式
∂L∂zi=∂L∂aj
∂aj∂zi
的第二部分:
∂aj∂zi
, 需要分俩种情况讨论,即
j=i
和
j≠i
俩种情况。
对于
j=i
,
∂ai∂zi=∂ezi∑nj=1ezj∂zi=ezi∑nj=1ezj−(ezi)2(∑nj=1ezj)2=ezi∑nj=1ezj−(ezi∑nj=1ezj)2=ai−a2i=ai(1−ai)
对于
j≠i,
∂aj∂zi=∂ezj∑nj=1ezj∂zi=−ezjezi(∑nj=1ezj)2=−ezj∑nj=1ezjezi∑nj=1ezj=−ajai
因此,对于第二部分的求导,我们有
∂aj∂zi=ai(1−ai)+∑nj≠i−ajai
5)
则对于
∂L∂zi=∂L∂aj
∂aj∂zi
,我们有:
∂L∂zi
=∂L∂aj∂aj∂zi
=−yiai(ai(1−ai))+∑nj≠iyjajajai
=−yi(1−ai)+∑nj≠iyjai
=−yi+aiyi+∑nj≠iyjai
=−yi+ai∑nj=1yj
由于对真实值,我们知道
yj
为第
i
个神经元期望输出的值,一般而言,
∑nj=1yj=1
, 故对于这种通过
Softmax
函数的输出来确定其分类的,只有一个类别会是1,因此有代价函数对第
i
个神经元的输出
zi
的梯度为:
∂L∂zi=−yi+ai