softmax函数的反向传播求导

吴恩达老师在深度学习视频中讲解 s o f t m a x \mathrm{softmax} softmax函数时,直接给出了损失函数对 z [ L ] z^{[L]} z[L]的导数,这里推导一下计算过程。

假设输出层有 n n n个神经元,使用 s o f t m a x \mathrm{softmax} softmax函数后神经网络的输出为
y ^ j = exp ⁡ ( z j [ L ] ) ∑ i = 1 n exp ⁡ ( z i [ L ] ) j = 1 , 2 , . . . , n \hat{y}_j=\frac{\exp(z^{[L]}_j)}{\sum_{i=1}^n\exp(z^{[L]}_i)}\quad j=1,2,...,n y^j=i=1nexp(zi[L])exp(zj[L])j=1,2,...,n
使用交叉熵损失函数,定义为
L ( y ^ , y ) = − ∑ i = 1 n y i log ⁡ ( y i ^ ) L(\hat{y}, y)=-\sum_{i=1}^{n}y_i\log(\hat{y_i}) L(y^,y)=i=1nyilog(yi^)
s o f t m a x \mathrm{softmax} softmax函数的定义不难看出,对于每一个 z j [ L ] z^{[L]}_j zj[L],它对 y ^ \hat{y} y^的每个元素都有贡献。那么在进行反向传播时, y ^ \hat{y} y^的每个元素都要计算对 z j [ L ] z^{[L]}_j zj[L]的导数,再分别乘以损失函数对 y ^ \hat y y^每个元素的导数,然后求和。也即
∂ L ∂ z j [ L ] = ∑ i = 1 n ∂ L ∂ y i ^ ∂ y i ^ ∂ z j [ L ] \frac{\partial L}{\partial z^{[L]}_j}=\sum_{i=1}^{n}\frac{\partial L}{\partial \hat{y_i}}\frac{\partial \hat{y_i}}{\partial z^{[L]}_j} zj[L]L=i=1nyi^Lzj[L]yi^
对于等式右侧的前一部分,显然
∂ L ∂ y i ^ = − y i y i ^ \frac{\partial L}{\partial \hat{y_i}}=-\frac{y_i}{\hat{y_i}} yi^L=yi^yi
对于后一部分,需要分为两种情况讨论

  • i = j i=j i=j时:
    ∂ y j ^ ∂ z j [ L ] = exp ⁡ z j [ L ] ( ∑ i = 1 n exp ⁡ ( z i [ L ] ) ) − ( exp ⁡ z j [ L ] ) 2 ( ∑ i = 1 n exp ⁡ ( z i [ L ] ) ) 2 = y j ^ ( 1 − y j ^ ) \begin{aligned} \frac{\partial\hat{y_j}}{\partial z^{[L]}_j} &=\frac{\exp{z^{[L]}_j}(\sum_{i=1}^n\exp(z^{[L]}_i))-(\exp{z^{[L]}_j})^2}{(\sum_{i=1}^n\exp(z^{[L]}_i))^2}\\ &=\hat{y_j}(1-\hat{y_j}) \end{aligned} zj[L]yj^=(i=1nexp(zi[L]))2expzj[L](i=1nexp(zi[L]))(expzj[L])2=yj^(1yj^)

  • i ≠ j i\neq j i=j时:
    ∂ y i ^ ∂ z j [ L ] = 0 − exp ⁡ z i [ L ] exp ⁡ z j [ L ] ( ∑ i = 1 n exp ⁡ ( z i [ L ] ) ) 2 = − y i ^ y j ^ \begin{aligned} \frac{\partial\hat{y_i}}{\partial z^{[L]}_j} &=\frac{0-\exp{z^{[L]}_i\exp{z^{[L]}_j}}}{(\sum_{i=1}^n\exp(z^{[L]}_i))^2}\\ &=-\hat{y_i}\hat{y_j} \end{aligned} zj[L]yi^=(i=1nexp(zi[L]))20expzi[L]expzj[L]=yi^yj^

那么
∂ L ∂ z j [ L ] = y j ^ ( 1 − y j ^ ) ( − y j y j ^ ) + ∑ i ≠ j − y i ^ y j ^ ( − y i y i ^ ) = − y j ( 1 − y j ^ ) + ∑ i ≠ j y i y j ^ = − y j + y j y j ^ + ∑ i ≠ j y i y j ^ = y j ^ − y j \begin{aligned} \frac{\partial L}{\partial z^{[L]}_j}&=\hat{y_j}(1-\hat{y_j})(-\frac{y_j}{\hat{y_j}})+\sum_{i\neq j}-\hat{y_i}\hat{y_j}(-\frac{y_i}{\hat{y_i}})\\ &=-y_j(1-\hat{y_j})+\sum_{i\neq j}y_i\hat{y_j}\\ &=-y_j+y_j\hat{y_j}+\sum_{i\neq j}y_i\hat{y_j}\\ &=\hat{y_j}-y_j \end{aligned} zj[L]L=yj^(1yj^)(yj^yj)+i=jyi^yj^(yi^yi)=yj(1yj^)+i=jyiyj^=yj+yjyj^+i=jyiyj^=yj^yj
于是对于整个 z [ L ] z^{[L]} z[L]显然有
d z [ L ] = y ^ − y dz^{[L]}=\hat{y}-y dz[L]=y^y
在多个样本时显然有
d Z [ L ] = 1 m ( Y ^ − Y ) dZ^{[L]}=\frac{1}{m}(\hat{Y}-Y) dZ[L]=m1(Y^Y)
这里的 1 m \frac{1}{m} m1来自来自损失函数。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值