softmax导数推理过程

softmax公式

a j = e Z j ∑ i = 1 m e Z i a_j=\frac{e^{Z_j}}{\sum_{i=1}^{m}e^{Z_i}} aj=i=1meZieZj

简单解释一下这个公式, a j a_j aj表示最终输出第j类的概率,而第j类的概率是用 e Z j e^{Z_j} eZj比上所有类别的和。

损失函数

L = − ∑ i y i ln ⁡ a i L=-\sum_i{y_i\ln{a_i}} L=iyilnai
损失函数用这个而不用平方差的形式,简单的说是因为这个训练出的模型效果更好。
详细解释请看这篇博客:平方损失函数与交叉熵损失函数

求导

先约定一下: d Z i dZ_i dZi表示 ∂ L ∂ Z i \frac{\partial L}{\partial Z_i} ZiL

d Z i = ∂ L ∂ Z i = ∑ j ( ∂ L j ∂ a j ∂ a j ∂ Z i ) = ∑ j ( ∂ ( − y j ln ⁡ a j ) ∂ a j ∂ a j ∂ Z i ) dZ_i=\frac{\partial L}{\partial Z_i}=\sum_j{(\frac{\partial L_j}{\partial a_j}\frac{\partial a_j}{\partial Z_i})}=\sum_j{(\frac{\partial {(-y_j\ln{a_j}})}{\partial a_j}\frac{\partial a_j}{\partial Z_i})} dZi=ZiL=j(ajLjZiaj)=j(aj(yjlnaj)Ziaj)

先不看求和符号,分成两部分 ∂ ( − y j ln ⁡ a j ) ∂ a j , ∂ a j ∂ Z i \frac{\partial {(-y_j\ln{a_j}})}{\partial a_j},\frac{\partial a_j}{\partial Z_i} aj(yjlnaj),Ziaj进行求导。

∂ ( − y j ln ⁡ a j ) ∂ a j = − y j a j \frac{\partial {(-y_j\ln{a_j}})}{\partial a_j}=-\frac{y_j}{a_j} aj(yjlnaj)=ajyj

∂ a j ∂ Z i \frac{\partial a_j}{\partial Z_i} Ziaj,这部分比较特殊,i和j代表不同的数,i表示一个特定的数,而j表示任意一个节点。
所以我们分两种情况:
1、i=j时: ∂ a j ∂ Z i = ∂ a i ∂ Z i = ∂ e Z i ∑ k e Z k ∂ Z i = e Z i ∑ k e Z k − ( e Z i ) 2 ( ∑ k e Z k ) 2 \frac{\partial a_j}{\partial Z_i}=\frac{\partial a_i}{\partial Z_i}=\frac{\partial {\frac{e^{Z_i}} {\sum_k e^{Z_k}}}}{\partial Z_i}=\frac{e^{Z_i}\sum_k{e^{Z_k}}-(e^{Z_i})^2}{(\sum_k{e^{Z_k}})^2} Ziaj=Ziai=ZikeZkeZi=(keZk)2eZikeZk(eZi)2

解释一下 ( e Z i ) 2 (e^{Z_i})^2 (eZi)2是怎么来的,对 ∑ k e Z k \sum_k{e^{Z_k}} keZk求导,等于对 e Z 1 + e Z 2 + . . . e Z i + . . . + e Z n e^{Z_1}+e^{Z_2}+...e^{Z_i}+...+e^{Z_n} eZ1+eZ2+...eZi+...+eZn求导,因为k是从一开始的,肯定有一个k值和i相等,而其他 e Z k e^{Z_k} eZk相对于 Z i Z_i Zi都是常数,求导变成零,只剩下 e Z i e^{Z_i} eZi,所以求导为上面的形式。继续推导。
上式= 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}}(1-\frac{e^{Z_i}}{\sum_ke^{Z_k}})=a_i(1-a_i) keZkeZi(1keZkeZi)=ai(1ai)

2、 i ≠ j i\neq j i̸=j时:
∂ a j ∂ Z i = ∂ e Z j ∑ k e Z k ∂ Z i = − e Z i e Z j ( ∑ k e Z k ) 2 = − a i a j \frac{\partial a_j}{\partial Z_i}=\frac{\partial {\frac{e^{Z_j}} {\sum_{k}e^{Z_k}}}}{\partial Z_i}=\frac{-e^{Z_i}e^{Z_j}}{(\sum_{k}{e^{Z_k}})^2}=-a_ia_j Ziaj=ZikeZkeZj=(keZk)2eZieZj=aiaj
这里对 ∑ k e Z k \sum_k{e^{Z_k}} keZk求导方法和上面一样。
最后将上面的导数合并一下
∑ j ( ∂ L j ∂ a j ∂ a j ∂ Z i ) = ∑ j ≠ i ( ∂ L j ∂ a j ∂ a j ∂ Z i ) + ∑ j = i ( ∂ L j ∂ a j ∂ a j ∂ Z i ) \sum_j{(\frac{\partial L_j}{\partial a_j}\frac{\partial a_j}{\partial Z_i})}=\sum_{j\neq i}{(\frac{\partial L_j}{\partial a_j}\frac{\partial a_j}{\partial Z_i})}+\sum_{j=i}{(\frac{\partial L_j}{\partial a_j}\frac{\partial a_j}{\partial Z_i})} j(ajLjZiaj)=j̸=i(ajLjZiaj)+j=i(ajLjZiaj)
= ∑ j ≠ i − y j a j ( − a i a j ) + ∑ j = i − y i a i a i ( 1 − a i ) =\sum_{j\neq i}{-\frac{y_j}{a_j}(-a_ia_j)}+\sum_{j=i}{-\frac{y_i}{a_i}}a_i(1-a_i) =j̸=iajyj(aiaj)+j=iaiyiai(1ai)
= ( ∑ j ≠ i a i y j ) + ( a i − 1 ) y i = ( ( a i ∑ j ≠ i y j ) + a i y i ) − y i =(\sum_{j\neq i}{a_iy_j})+(a_i-1)y_i=((a_i\sum_{j\neq i}y_j)+a_iy_i)-y_i =(j̸=iaiyj)+(ai1)yi=((aij̸=iyj)+aiyi)yi
= a i ( ∑ j y j ) − y i = a i − y i =a_i(\sum_jy_j)-y_i=a_i-y_i =ai(jyj)yi=aiyi

最后我想说明一下, ( ( a i ∑ j ≠ i y j ) + a i y i ) ((a_i\sum_{j\neq i}y_j)+a_iy_i) ((aij̸=iyj)+aiyi)这里我用了两个括号,就是想给大家一个提示,因为 a i ∑ j ≠ i y j a_i\sum_{j\neq i}y_j aij̸=iyj这里少了一个 j = i j=i j=i的点,而后面有一个 a i y i a_iy_i aiyi,合起来正好是 a i ( ∑ j y j ) a_i(\sum_jy_j) ai(jyj);还有一点是最后的结果为什么去掉求和符号,对于分类问题 ∑ j y j \sum_jy_j jyj等于1。
举个例子:
[ y 1 y 2 y 3 ] \begin{bmatrix} y1\\ y2 \\ y3 \end{bmatrix} y1y2y3表示最终要分的三个类别,而分的类别最终只能有一种结果,所以 y 1 , y 2 , y 3 y1,y2,y3 y1,y2,y3中只有一个为1,其他全为零,所以求和为1。

softmax的案例将会在下一篇博客中详细介绍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值