交叉熵损失的反向传播
对于一个单标签多分类问题,假设网络的输出层的输入为Zin=[z1,⋯,zi,⋯,zn],
输出为$\hat Y=[\hat y_1,\cdots,\hat y_i,\cdots,\hat y_n]$,
真实类标签为$Y = [y_1,\cdots,y_i,\cdots,y_n]$,$n$为类别数(输出层神经元数),通常有:
Y^=Softmax(Zin)(1)
y^i=∑j=0nezjezi(2)
其中$Softmax$为:
Softmax(Zin)=[⋯,∑j=1nezjezi,⋯](3)
交叉熵损失
Loss(Y,Y^)=−i=1∑nyi∗ln(y^i)(4)
损失对神经网络输出的偏导(标量对向量求偏导)为:
∂Y^∂Loss(Y,Y^)=[−y^1y1,⋯,−y^iyi,⋯,−y^nyn]\label5(5)
后向传播推导中遇到的所有量都是变量,最终的目的是找到损失关于某变量的偏导,程序中也只用这个公式求得对应输入点的梯度
Softmax的偏导
求$\hat y_i$对$z_i$的偏导,根据{2}可得:
求$\hat Y$对$Z$的偏导(向量对向量求导)
这里把$y$的坐标写作$k$
$k=i$时:
∂zi∂y^i=ezi∗∑j=1nezj1+ezi∗(−(∑j=1nezj)21)∗ezi=∑j=1nezjezi−(∑j=1nezjezi)2=y^i−y^i2(6)
$k \neq i$时:
∂zi∂y^k=ezk∗(−(∑j=1nezj)21)∗ezi=−(∑j=1nezj)2ezk∗ezi=−y^ky^i(7)
写成矩阵:
∂Zin∂Y^=y^1−y^12−y^1y^2⋮−y^1y^n−y^2y^1y^2−y^22⋮−y^2y^n⋯⋯⋱⋯−y^ny^1−y^ny^2⋮y^n−y^n2(8)
这是一个对称矩阵,在链式求导时加不加转置都一样
根据(5)和(8),损失$L$对输入$Z$的偏导(标量对向量求偏导):
∂Z∂L(Y,Y^)=∂Y^∂L(Y,Y^)(∂Z∂Y^)T=[−y^1y1,⋯,−y^iyi,⋯,−y^nyn]y^1−y^12−y^1y^2⋮−y^1y^n−y^2y^1y^2−y^22⋮−y^2y^n⋯⋯⋱⋯−y^ny^1−y^ny^2⋮y^n−y^n2T=[(y^1−1)y1+y^1y2+⋯+y^1yn,y^2y1+(y^2−1)y2+⋯+y^1yn,⋯]=[y^1i=1∑nyi−y1,⋯,y^ji=1∑nyi−yj,⋯,y^ni=1∑nyi−yn]=[y^1−y1,⋯,y^j−yj,⋯,y^n−yn] (i=1∑nyi=1)=Y^−Y