深度学习之softmax函数-梯度计算

在深度学习中,softmax层一般作为输出层出现,也就是网络的最后一层;测试过程中,这一层直接输出网络的最终结果,而在训练过程这一层又会作为误差反传的第一层,也就是计算误差的第一层。
下面我们就来推导一下:
假设softmax层有K个神经元(也可以理解为K个输出)

softmax\_out = [a_1,a_2,a_3,...a_j,...a_k]

其中a_i=\frac{e^{z_i}}{\sum_{1}^k{e^{z_i}}}
首先我们先计算softmax的输出a_i对输入z_j的偏导:
这里有两个情况需要分别处理(1)i=j,(2)i\neq j

i=j时:
\frac{\partial {a_i}}{\partial {z_j}} = \frac{ e^{z_j} * \sum_{1}^k{e^{z_i}} - {(e^{z_j})^2} } {({\sum_{1}^k{e^{z_i}}})^2} = \frac{e^{z_j}}{\sum_{1}^k{e^{z_i}}} * (1-{\frac{e^{z_j}}{\sum_{1}^k{e^{z_i}}}}) = a_i(1-a_i)

i \neq j时:

\frac{\partial {a_i}}{\partial {z_j}} = - {e^{z_i}} * {e^{z_j}} * \frac{1}{({\sum_{1}^k{e^{z_i}}})^2} = - {a_i}{a_j}

有了这两个公式就可以计算出对应梯度。
假设模型损失的值为E
\frac{\partial E}{\partial z_i} = \frac{\partial E}{\partial a_i} \frac{\partial a_i}{\partial z_i}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容