Softmax反向传播

softmax 公式:

假设有一个向量\textbf{x},其长度为nx_{i}表示\textbf{x}中的第i个元素,那么这个元素的softmax值为: 

y_{i}=\frac{e^{x_{i}}}{\sum{}_{j=1}^{k}e^{x_{j}}}

Softmax反向传播

当j!=i时,\frac{\partial l}{\partial x_{i}} =\sum_{j=0,j!=i}^{n}\frac{\partial l}{\partial y_{j}}\frac{\partial y_{j}}{\partial x_{i}}=\sum_{j=0,j!=i}^{n}\frac{\partial l}{\partial y_{j}}\frac{-e^{x_{i}}\cdot e^{x_{j}}}{\sum{}_{k=0}^{n}e^{x_{k}}\cdot\sum{}_{k=0}^{n}e^{x_{k}}}

当j=i时,\frac{\partial l}{\partial x_{i}} =\frac{\partial l}{\partial y_{i}}\frac{\partial y_{i}}{\partial x_{i}}=\frac{\partial l}{\partial y_{i}}\frac{e^{x_{i}}\sum{}_{k=0}^{n}e^{x_{k}}-e^{x_{i}}\cdot e^{x_{i}}}{\sum{}_{k=0}^{n}e^{x_{k}}\cdot\sum{}_{k=0}^{n}e^{x_{k}}}

 

所以 将上面两个式子加起来得到

 \frac{\partial l}{\partial x_{i}} =\sum_{j=0,j!=i}^{n}\frac{\partial l}{\partial y_{j}}\frac{\partial y_{j}}{\partial x_{i}}+\frac{\partial l}{\partial y_{i}}\frac{\partial y_{i}}{\partial x_{i}}=\sum_{j=0,j!=i}^{n}\frac{\partial l}{\partial y_{j}}\frac{-e^{x_{i}}\cdot e^{x_{j}}}{\sum{}_{k=0}^{n}e^{x_{k}}\cdot\sum{}_{k=0}^{n}e^{x_{k}}}+\frac{\partial l}{\partial y_{i}}\frac{e^{x_{i}}\sum{}_{k=0}^{n}e^{x_{k}}-e^{x_{i}}\cdot e^{x_{i}}}{\sum{}_{k=0}^{n}e^{x_{k}}\cdot\sum{}_{k=0}^{n}e^{x_{k}}}=\sum_{j=0}^{n}\frac{\partial l}{\partial y_{j}}\frac{-e^{x_{i}}\cdot e^{x_{j}}}{\sum{}_{k=0}^{n}e^{x_{k}}\cdot\sum{}_{k=0}^{n}e^{x_{k}}}+\frac{\partial l}{\partial y_{i}}\frac{e^{x_{i}}\sum{}_{k=0}^{n}e^{x_{k}}}{\sum{}_{k=0}^{n}e^{x_{k}}\cdot\sum{}_{k=0}^{n}e^{x_{k}}}

=-\sum_{j=0}^{n}\frac{\partial l}{\partial y_{j}}\cdot y_{j}\cdot y_{i}+\frac{\partial l}{\partial y_{i}}\cdot y_{i}

=-(\sum_{j=0}^{n}\frac{\partial l}{\partial y_{j}}\cdot y_{j})\cdot y_{i}+\frac{\partial l}{\partial y_{i}}\cdot y_{i}

注意上式括号里面的量与x_{i}无关,并且其值为\frac{\partial l}{\partial y_{j}}y_{j}的逐元素乘积之和,设为\delta的乘积之和,设其为\sigma

{\frac{\partial l}{\partial \mathbf{x}}} = -\sigma \cdot \mathbf{y}+{\frac{\partial l}{\partial \mathbf{y}}} \cdot \mathbf{y}= \mathbf{y}\cdot({\frac{\partial l}{\partial \mathbf{y}}}-\sigma )

 

有人问这有什么意义?

其实这样就说明softmax的反向传播在编程的时候并不需要 分i=j和i!=j的情况来计算。

以caffe为例子 bottom_diff = top_data * (top_diff - sum(top_diff * top_data))  其中*表示点乘。

可以看出这样来计算backward不需要 gemm矩阵乘,只需要点乘即可完成。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值