softmax with cross-entropy loss求导(转载+细节整理)

softmax 函数
softmax(柔性最大值)函数,一般在神经网络中, softmax可以作为分类任务的输出层。

其实可以认为softmax输出的是几个类别选择的概率,比如我有一个分类任务,要分为三个类,softmax函数可以根据它们相对的大小,输出三个类别选取的概率,并且概率和为1。

即总共有kk类,必有:
k=1Cyi=1\sum_{k=1}^Cy_i=1

为了方便下面的推导,先来个图示:
softmax with cross-entropy loss求导(转载+细节整理)
----------------------------------------
softmax函数的公式是这种形式:
ai=ezikezka_i=\frac{e^{z_i}}{\sum_k^{e^{z_k}}}

其中:
wijw_{ij}:第ii个神经元的第jj个权重,
b:偏移值。
ziz_i:该网络的第ii个输出。

ziz_i后面施加softmax函数,得到aia_i

损失函数使用Cross_Entropy
----------------------------------------
J=iyiln aiJ=-\sum_i{y_i}ln\ a_i
其中:
aia_i:模型预测值
yiy_i:预期数值

当二分类时,有

1Nn=1N[pnlogqn+(1pn)log(1qn)]\frac{1}{N}\sum_{n=1}^N[p_nlogq_n+(1-p_n)log(1-q_n)]
其中:
NN:数据集的总数
pnp_n:真实分布
qnq_n:预测分布
----------------------------------------------

这篇博客中,我们的目标函数是:
Jzi\frac{\partial J}{\partial z_i}
j(Jjajajzi)=\sum_j(\frac{\partial J_j}{\partial a_j}\frac{\partial a_j}{\partial z_i})

其中:
Jjaj\frac{\partial J_j}{\partial a_j}
=yjlnajaj=-\frac{-y_j·ln a_j}{\partial a_j}
=yj1aj=-y_j\frac{1}{a_j}

ajzi\frac{\partial a_j}{\partial z_i}
=[ezjkezk]zi=\frac{\partial[ \frac{e^{z_j}}{ \sum_k e^{z_k} }]}{\partial z_i}

下面分情况,这里之所以要分情况是求导的规律来决定的:

[ezjkezk]zi(1)\frac{\partial[ \frac{e^{z_j}}{ \sum_k e^{z_k} }]}{\partial z_i}(1)
为了处理式(1),根据:
f(x)=g(x)h(x)f(x)=\frac{g(x)}{h(x)}
f(x)=g(x)h(x)g(x)h(x)h(x)2f'(x)=\frac{g'(x)h(x)-g(x)h'(x)}{|h(x)|^2}

所以这里:
g(x)=ezjg(x)=e^{z_j}
h(x)=kezkh(x)={\sum_k e^{z_k}}

i=j,g(x)=ezj,h(x)=ezji=j时,g'(x)=e^{z_j},h'(x)=e^{z_j}
ii≠j,g(x)=0,h(x)=ezj时,g'(x)=0,h'(x)=e^{z_j}

由此处理式(1)得到:
i=ji=j时
ajzi=ezikezk(ezi)2[kezk]2=aiai2\frac{\partial a_j}{\partial z_i}=\frac{e^{z_i}{\sum_k e^{z_k}}-(e^{z_i})^2}{[ { \sum_k e^{z_k} }]^2}=a_i-a_i^2

iijj时
ajzi=(ezj)(ezi)[kezk]2=ajai\frac{\partial a_j}{\partial z_i}=\frac{-(e^{z_j})(e^{z_i})}{[ { \sum_k e^{z_k} }]^2}=-a_j·a_i

总结下:
Jzi\frac{\partial J}{\partial z_i}
=j(Jjajajzi)=\sum_j (\frac{\partial J_j}{\partial a_j} \frac{\partial a_j}{\partial z_i})
=i=j[(yjaj)(aiai2)]+ij[(yjaj)(ajai)]=\sum_{i=j}[(\frac{-y_j}{a_j})(a_i-a_i^2)]+\sum_{i \ne j}[(\frac{-y_j}{a_j})(-a_ja_i)]
=yi(1ai)+ij[yjai]=-y_i(1-a_i)+\sum_{i \ne j}[y_ja_i]
=yi+aijyj=-y_i+a_i\sum_jy_j
jyj=1(1)∵ \sum_j y_j=1(因为所有情况的概率和为1)
yi+ai∴原式=-y_i+a_i

参考链接:
https://blog.****.net/Charel_CHEN/article/details/81266838
https://blog.****.net/qian99/article/details/78046329
https://zhuanlan.zhihu.com/p/27223959
http://shuokay.com/2016/07/20/softmax-loss/