在多分类问题中,一般选取softmax作为分类器,交叉熵作为损失函数。他们的形式都很简单,但是在BP的时候还是有些复杂,现在总结如下:
交叉熵损失函数
(1) C ( a , y ) = − ∑ i y i l n a i C(a,y)=-\sum_i{y_i ln a_i} \tag{1} C(a,y)=−i∑yilnai(1)
softmax逻辑回归
第
i
i
i个输出值
a
i
a_i
ai为:
(2)
a
i
=
e
z
i
∑
k
e
z
k
a_i=\frac{e^{z_i}}{\sum_ke^{z_k}} \tag{2}
ai=∑kezkezi(2)
结论
(3) ∂ C ∂ z i = a i − y i \frac{∂C}{∂z_i} = a_i−y_i \tag{3} ∂zi∂C=ai−yi(3) 【预测值减真实值】
推导过程
(4)
∂
C
∂
z
i
=
∑
j
(
∂
C
j
∂
a
j
∂
a
j
∂
z
i
)
\frac{∂C}{∂z_i} =\sum_j(\frac{∂C_j}{∂a_j} \frac{∂a_j}{∂z_i} ) \tag{4}
∂zi∂C=j∑(∂aj∂Cj∂zi∂aj)(4)
【因为
z
i
z_i
zi总会出现在分母中,所以会对所有的
a
j
a_j
aj产生影响,每个
a
j
a_j
aj都会有一个损失值
C
j
C_j
Cj(1式)】
-
先看第一项,由(1)式
- (5) ∂ C j ∂ a j = − y j a j \frac{∂C_j}{∂a_j}=-\frac{y_j}{a_j} \tag{5} ∂aj∂Cj=−ajyj(5)
-
对于第二项,我们对 i = j i=j i=j和 i ≠ j i \neq j i̸=j分开讨论:
-
i = j i=j i=j,分子分母总都有 e z i e^{z_i} ezi项,结果为:
(6.1) ∂ a i ∂ z i = e z i ∗ ∑ k e z k − e z i e z i ( ∑ k e z k ) 2 \frac{∂a_i}{∂z_i} = \frac{e^{z_i}*\sum_ke^{z_k}-e^{z_i}e^{z_i}} {(\sum_ke^{z_k})^2} \tag{6.1} ∂zi∂ai=(∑kezk)2ezi∗∑kezk−eziezi(6.1)
(6.2) = e z i ( ∑ k e z k − e z i ) ( ∑ k e z k ) 2 =e^{z_i}\frac {(\sum_ke^{z_k}-e^{z_i})} {(\sum_ke^{z_k})^2} \tag{6.2} =ezi(∑kezk)2(∑kezk−ezi)(6.2)
(6.3) = e z i ∑ k e z k ( ∑ k e z k − e z i ) ∑ k e z k = e z i ∑ k e z k ( 1 − e z i ∑ k e z k ) = a i ( 1 − a i ) =\frac{e^{z_i}}{\sum_ke^{z_k}} \frac{(\sum_ke^{z_k}-e^{z_i})}{\sum_ke^{z_k}} = \frac{e^{z_i}}{\sum_ke^{z_k}} (1-\frac{e^{z_i}}{\sum_ke^{z_k}} ) \tag{6.3} =a_i(1-a_i) =∑kezkezi∑kezk(∑kezk−ezi)=∑kezkezi(1−∑kezkezi)=ai(1−ai)(6.3) -
i ≠ j i \neq j i̸=j, 只有分母有 e z i e^{z_i} ezi项,结果为:
(7) ∂ a j ∂ z i = − e z j ( 1 ∑ k e z k ) 2 e i z = − a i a j \frac{∂a_j}{∂z_i} = -e^{z_j} (\frac{1}{\sum_ke^{z_k}})^2 e^z_i=-a_ia_j \tag{7} ∂zi∂aj=−ezj(∑kezk1)2eiz=−aiaj(7)
【第一个等号是复合函数求导公式,第二个等号是把左右两个指数项放到中间的分子上,化简既得】
-
根据(4,5,6.3,7)式可得最终结果:
∂
C
∂
z
i
=
∑
j
(
∂
C
j
∂
a
j
∂
a
j
∂
z
i
)
\frac{∂C}{∂z_i} =\sum_j(\frac{∂C_j}{∂a_j} \frac{∂a_j}{∂z_i} )
∂zi∂C=j∑(∂aj∂Cj∂zi∂aj)
=
−
[
y
i
a
i
a
i
(
1
−
a
i
)
+
(
∑
j
≠
i
y
j
a
j
−
a
i
a
j
)
]
=-[\frac{y_i}{a_i}a_i(1-a_i)+(\sum_{j \neq i}\frac{y_j}{a_j}-a_ia_j)]
=−[aiyiai(1−ai)+(j̸=i∑ajyj−aiaj)]
=
∑
j
≠
i
a
i
y
j
−
y
i
(
1
−
a
i
)
=\sum_{j \neq i}a_iy_j-y_i(1-a_i)
=j̸=i∑aiyj−yi(1−ai)
=
∑
j
≠
i
a
i
y
j
+
a
i
y
i
−
y
i
=\sum_{j \neq i}a_iy_j + a_iy_i-y_i
=j̸=i∑aiyj+aiyi−yi
=
a
i
∑
j
y
j
−
y
i
=a_i\sum_j y_j -y_i
=aij∑yj−yi
对于分类问题,我们的
y
y
y只有某一维是1,其他都是0。因此求和后还是1,乘以系数
a
i
a_i
ai再减去后边那项就是结果
(5)
∂
C
∂
z
i
=
a
i
−
y
i
\frac{∂C}{∂z_i} =a_i -y_i \tag{5}
∂zi∂C=ai−yi(5)
这个推导还是有点麻烦的,主要就是分两部分 i = j i=j i=j和 i ≠ j i \neq j i̸=j分别讨论,再结合一些小技巧(如最后一步ont-hot化简等…)