softmax及其求导过程

目录

 

1.softmax

2.softmax求导过程:

3. softmax结合交叉熵


1.softmax

softmax多用于多分类问题,它会把网络的输出变成概率,公式如下:

                                                        

softmax一般会和交叉熵结合在一起,因为交叉熵的输入是概率,而softmax就可以把网络的输出变成对应等比例的概率。

 

2.softmax求导过程:

假设求导时,有如下x:

                   

s 为网络输出,第一个输出节点为S_{1},第二个为S_{2},以此类推第 i 个输出节点为S_{i},同理 x 就是网络的输入节点了,第 j 个输入节点为X_{j} 。

这时候要分两种情况,即 i = j 和 i不等于j的情况。

举例,例如求 S_{1}X_{1}的导数:(相当于与 i = j情况)

但是由于从softmax公式的分母可知,分母包括了e^{x1}e^{x2}​​​​​​​,……,e^{xj}​​​​​​​,所以任何一个输出节点 S_{i}都要对所有x 进行求导。

所以就有了 i 不等j 这种情况,如:求 s1 对 x2 的导数:

所以可以得到,i=j 时 和 i 不等于 j 时的 softmax导数如下:

                              

3. softmax结合交叉熵

由于交叉熵的输入是概率,因此经常和sigmoid或softmax结合在一起。一般情况下,在神经网络中,最后一个输出层的节点个数与分类任务的目标数相等。假设最后的节点数为N,那么对于每一个样例,神经网络可以得到一个N维的数组作为输出结果,数组中每一个维度会对应一个类别。在最理想的情况下,如果一个样本属于k,那么这个类别所对应的的输出节点的输出值应该为1,而其他节点的输出都为0,即[0,0,1,0,….0,0],这个数组也就是样本的Label,是神经网络最期望的输出结果,交叉熵就是用来判定实际的输出与期望的输出的接近程度!

交叉熵公式:

                             Loss=-\sum_{i}^{ }y_{i}\l n(S_{i})

如下图所示,若Loss对Z点求导,则:

                    \frac{\partial Loss}{\partial Z_{j}}=-\sum_{i}^{ }\frac{\partial (y_{i}*ln(S_{i}))}{\partial S_{i}}*\frac{\partial S_{i}}{\partial Z_{j}} =-\sum_{i}^{ }\frac{y_{i}}{S_{i}}*\frac{\partial S_{i}}{\partial Z_{j}}=-\frac{y_{j}}{S_{j}}*S_{j}(1-S_{j})+\sum_{i\neq j}^{ }\frac{y_{i}}{S_{i}}*S_{i}S_{j}=-y_{i}+\sum_{i}^{ }y_{i}S_{j}=S_{j}-y_{i}

解释下上面的式子,由softmax的公式可知,输出节点Si 是由所有Z组成的,所以若Loss对某个Z,如Zi求导的话,则需要对每个输出节点S进行求导。可以从求导的结果看出:用交叉熵对网络softmax前的输出求导,其结果等于softmax后的结果减去真实标签label。

  • 14
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
为了回答你的问题,我将引用、和的内容。softmax函数的求导可以通过链式法则进行计算。首先,我们需要知道softmax函数的定义是: softmax(z_i) = \frac{e^{z_i}}{\sum^n_{j=1}e^{z_j}} 其中,z_i是第i个输出节点的值,n是输出节点的个数。softmax函数的目的是将多分类的输出值转换为[0, 1]范围内且和为1的概率分布。 现在我们来计算softmax函数的导数。假设我们要计算对第k个输出节点的导数,即 \frac{\partial softmax}{\partial z_k}。根据链式法则,我们可以得到如下结果: \frac{\partial softmax}{\partial z_k} = \frac{\partial}{\partial z_k} \left( \frac{e^{z_k}}{\sum^n_{j=1}e^{z_j}} \right) 为了简化计算,我们先计算分子部分 e^{z_k} 的导数。根据指数函数的导数公式,我们有: \frac{\partial}{\partial z_k} e^{z_k} = e^{z_k} 接下来,我们计算分母部分 \sum^n_{j=1}e^{z_j} 的导数。由于该部分对所有的 z_i 都有贡献,我们需要对每个 z_i 求导并求和。根据中提到的原因,我们需要对所有的输出节点 S 进行求导。因此,我们有: \frac{\partial}{\partial z_k} \left( \sum^n_{j=1}e^{z_j} \right) = \sum^n_{j=1} \frac{\partial}{\partial z_k} e^{z_j} = \sum^n_{j=1} e^{z_j} 将分子和分母的导数结果带入到 softmax 函数的导数公式中,我们可以得到: \frac{\partial softmax}{\partial z_k} = \frac{e^{z_k}}{\sum^n_{j=1}e^{z_j}} - \frac{e^{z_k}}{\left( \sum^n_{j=1}e^{z_j} \right)^2} \sum^n_{j=1} e^{z_j} 简化这个表达式我们有: \frac{\partial softmax}{\partial z_k} = \frac{e^{z_k}}{\sum^n_{j=1}e^{z_j}} \left( 1 - \frac{e^{z_k}}{\sum^n_{j=1}e^{z_j}} \right) 这就是 softmax 函数对第 k 个输出节点的导数表达式。通过这个导数表达式,我们可以计算 softmax 函数在神经网络中的反向传播过程中的梯度。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [softmax及其求导过程](https://blog.csdn.net/u014453898/article/details/108435173)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [softmax及函数求导](https://blog.csdn.net/qq_41357569/article/details/120410841)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值