Softmax函数求导

【深度学习】softmax和交叉熵的配合求导 在分类问题中,尤其是在神经网络中,交叉熵函数非常常见。因为经常涉及到分类问题,需要计算各类别的概率,所以交叉熵损失函数又都是与sigmoid函数或者softmax函数成对出现。 阅读详情

在这里插入图片描述
来源:https://blog.youkuaiyun.com/zt_1995/article/details/62227603

其实整个推导,上面这个图片已经介绍得十分清楚了,但是仍有很多小步骤被省略掉了,我会补上详细的softmax求导的过程:
(1)softmax函数
\quad首先再来明确一下softmax函数,一般softmax函数是用来做分类任务的输出层。softmax的形式为:
Si=ezi∑kezkS_i = \frac{e^{z_i}}{\sum_ke^{z_k}}Si​=∑k​ezk​ezi​​ 其中SiS_iSi​表示的是第i个神经元的输出,接下来我们定义一个有多个输入,一个输出的神经元。神经元的输出为zi=∑ijxij+bz_i = \sum_{ij}x_{ij}+bzi​=∑ij​xij​+b,其中wijw_{ij}wij​是第iii个神经元的第jjj个权重,b是偏移值.ziz_izi​表示网络的第iii个输出。给这个输出加上一个softmax函数,可以写成:ai=ezi∑kezka_i = \frac{e^{z_i}}{\sum_ke^{z_k}}ai​=∑k​ezk​ezi​​, 其中aia_iai​表示softmax函数的第i个输出值。这个过程可以用下图表示:
在这里插入图片描述
(2)损失函数
softmax的损失函数一般是选择交叉熵损失函数,交叉熵函数形式为C=−∑iyilnaiC=-\sum_i{y_i lna_i}C=−∑i​yi​lnai​,其中y_i表示真实的标签值
(3)需要用到的高数的求导公式

c'=0(c为常数)
(x^a)'=ax^(a-1),a为常数且a≠0
(a^x)'=a^xlna
(e^x)'=e^x
(logax)'=1/(xlna),a>0且 a≠1
(lnx)'=1/x
(sinx)'=cosx
(cosx)'=-sinx
(tanx)'=(secx)^2
(secx)'=secxtanx
(cotx)'=-(cscx)^2
(cscx)'=-csxcotx
(arcsinx)'=1/√(1-x^2)
(arccosx)'=-1/√(1-x^2)
(arctanx)'=1/(1+x^2)
(arccotx)'=-1/(1+x^2)
(shx)'=chx
(chx)'=shx
(uv)'=uv'+u'v
(u+v)'=u'+v'
(u/)'=(u'v-uv')/^2 

(3)进行推导
我们需要求的是loss对于神经元输出ziz_izi​的梯度,求出梯度后才可以反向传播,即是求:
∂C∂zi\frac{\partial C}{\partial z_i}∂zi​∂C​, 根据链式法则(也就是复合函数求导法则)∂C∂aj∂aj∂zi\frac{\partial C}{\partial a_j}\frac{\partial a_j}{\partial z_i}∂aj​∂C​∂zi​∂aj​​,初学的时候这个公式理解了很久,为什么这里是aja_jaj​而不是aia_iai​呢?这里我们回忆一下softmax的公示,分母部分包含了所有神经元的输出,所以对于所有输出非i的输出中也包含了ziz_izi​,所以所有的a都要参与计算,之后我们会看到计算需要分为i=ji=ji=j和i≠ji \neq ji̸​=j两种情况分别求导数。
首先来求前半部分:
∂C∂aj=−∑jyilnaj∂aj=−∑jyj1aj\frac{\partial C}{ \partial a_j} = \frac{-\sum_jy_ilna_j}{\partial a_j} = -\sum_jy_j\frac{1}{a_j}∂aj​∂C​=∂aj​−∑j​yi​lnaj​​=−∑j​yj​aj​1​,接下来求第二部分的导数,如果i=ji=ji=j,∂ai∂zi=∂(ezi∑kezk)∂zi=∑kezkezi−(ezi)2(∑kezk)2=(eiz∑kezk)(1−ezi∑kezk)=ai(1−ai)\frac{\partial a_i}{\partial z_i} = \frac{\partial(\frac{e^{z_i}}{\sum_ke^{z_k}})}{\partial z_i}=\frac{\sum_ke^{z_k}e^{z_i}-(e^{z_i})^2}{(\sum_ke^{z_k})^2}=(\frac{e^z_i}{\sum_ke^{z_k}})(1 - \frac{e^{z_i}}{\sum_ke^{z_k}})=a_i(1-a_i)∂zi​∂ai​​=∂zi​∂(∑k​ezk​ezi​​)​=(∑k​ezk​)2∑k​ezk​ezi​−(ezi​)2​=(∑k​ezk​eiz​​)(1−∑k​ezk​ezi​​)=ai​(1−ai​),如果i≠ji \neq ji̸​=j,∂ai∂zi=∂ezj∑kezk∂zi=−ezj(1∑kekz)2ezi=−aiaj\frac{\partial a_i}{\partial z_i}=\frac{\partial\frac{e^{z_j}}{\sum_ke^{z_k}}}{\partial z_i} = -e^{z_j}(\frac{1}{\sum_ke^z_k})^2e^{z_i}=-a_ia_j∂zi​∂ai​​=∂zi​∂∑k​ezk​ezj​​​=−ezj​(∑k​ekz​1​)2ezi​=−ai​aj​,接下来把上面的组合之后得到∂C∂zi=(−∑jyj1aj)∂aj∂zi=−yiaiai(1−ai)+∑j≠iyjajaiaj=−yi+yiai+∑j≠iyjai=−yi+ai∑jyj\frac{\partial C}{\partial z_i}=(-\sum_{j}y_j\frac{1}{a_j})\frac{\partial a_j}{\partial z_i}=-\frac{y_i}{a_i}a_i(1-a_i)+\sum_{j \neq i}\frac{y_j}{a_j}a_ia_j=-y_i+y_ia_i+\sum_{j \neq i}\frac{y_j}a_i=-y_i+a_i\sum_{j}y_j∂zi​∂C​=(−∑j​yj​aj​1​)∂zi​∂aj​​=−ai​yi​​ai​(1−ai​)+∑j̸​=i​aj​yj​​ai​aj​=−yi​+yi​ai​+∑j̸​=i​ayj​​i​=−yi​+ai​∑j​yj​,推导完成!
(4)对于分类问题来说,我们给定的结果yiy_iyi​最终只有一个类别是1,其他是0,因此对于分类问题,梯度等于:
∂C∂zi=ai−yi\frac{\partial C}{\partial z_i}=a_i - y_i∂zi​∂C​=ai​−yi​

最后放一份CS231N的代码实现,帮助进一步理解:

#coding=utf-8
import numpy as np

def softmax_loss_native(W, X, y, reg):
    '''
    Softmax_loss的暴力实现,利用了for循环
    输入的维度是D,有C个分类类别,并且我们在有N个例子的batch上进行操作
    输入:
    - W: 一个numpy array,形状是(D, C),代表权重
    - X: 一个形状为(N, D)为numpy array,代表输入数据
    - y: 一个形状为(N,)的numpy array,代表类别标签
    - reg: (float)正则化参数
    f返回:
    - 一个浮点数代表Loss
    - 和W形状一样的梯度
    '''
    loss = 0.0
    dW = np.zeros_like(W) #dW代表W反向传播的梯度
    num_classes = W.shape[1]
    num_train = X.shape[0]
    for i in xrange(num_train):
        scores = X[i].dot(W)
        shift_scores = scores - max(scores) #防止数值不稳定
        loss_i = -shift_scores[y[i]] + np.log(sum(np.exp(shift_scores)))
        loss += loss_i
        for j in xrange(num_classes):
            softmax_output = np.exp(shift_scores[j]) / sum(np.exp(shift_scores))
            if j == y[i]:
                dW[:, j] += (-1 + softmax_output) * X[i]
            else:
                dW[:, j] += softmax_output * X[i]
    loss /= num_train
    loss += 0.5 * reg * np.sum(W * W)
    dW = dW / num_train + reg * W
    return loss, dW

def softmax_loss_vectorized(W, X, y, reg):
    loss = 0.0
    dW = np.zeros_like(W)
    num_class = W.shape[1]
    num_train = X.shape[0]
    scores = X.dot(W)
    shift_scores = scores - np.max(scores, axis=1).reshape(-1, 1)
    softmax_output  = np.exp(shift_scores) / np.sum(np.exp(shift_scores), axis=1).reshape(-1, 1)
    loss = -np.sum(np.log(softmax_output[range(num_train), list(y)]))
    loss /= num_train
    loss += 0.5 * reg * np.sum(W * W)
    dS = softmax_output.copy()
    dS[range(num_train), list(y)] += -1
    dW = (x.T).dot(dS)
    dW = dW/num_train + reg*W
    return loss, dW
softmax及其求导过程 1.softmax softmax多用于多分类问题,它会把网络的输出变成概率,公式如下: softmax一般会和交叉熵结合在一起,因为交叉熵的输入是概率,而softmax就可以把网络的输出变成对应等比例的概率。 2.softmax求导过程: 假设求导时,有如下x: s 为网络输出,第一个输出节点为,第二个为,以此类推第 i 个输出节点为... 阅读详情

相关推荐

softmax函数

本文先介绍了softmax的函数公式,并详细推导了softmax函数公式的求导过程,然后说明了softmax的溢出问题,并探讨了解决方法,最后提及了softmax函数在多分类问题中的应用。

这个函数可导的博客 7326

softmax及函数求导

softmax 1. 概念 softmax 的核心在于 soft,而 soft 有软的含义,与之相对的是 hard 硬。很多场景中需要我们找出数组所有元素中值最大的元素,是指上都是求的 hardmax。 softmax 定义: softmax(zi)=ezi∑j=1nezj softmax(z_i) = \frac{e^{z_i}}{\sum^n_{j=1}e^{z_j}} softmax(zi​)=∑j=1n​ezj​ezi​​ 其中,ziz_izi​ 为第i个结点的输出值,n为输出结点的个数,即分类的类

ywm_up 7638

softmax函数及交叉熵函数求导

softmax函数 这里以神经网络多分类问题为例,假设输出层有nnn个神经元,输出为z1,z2,...,znz_1,z_2,...,z_nz1​,z2​,...,zn​,经过softmax函数后的输出为a1,a2,...,ana_1,a_2,...,a_na1​,a2​,...,an​,aia_iai​的计算公式为: ai=ezi∑j=1nezja_i=\frac{e^{z_i}}{\sum_{j...

qq_38032064的博客 813

softmax 函数以及相关求导过程+交叉熵(Cross entropy)

参考文章(需要看): 2简单的交叉熵损失函数,你真的懂了吗?:https://blog.youkuaiyun.com/red_stone1/article/details/80735068 一、softmax函数 softmax(柔性最大值)函数,一般在神经网络中, softmax用于多分类过程中。它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类。softmax函...

ytusdc的博客 7497

Softmax Regression损失函数的求导

softmax regression 代价函数: J(θ)=−1m[∑i=1m∑j=1kI{y(i)=j}logeθjTX(i)∑l=1keθlTX(i)] J(\theta) = -\frac{1}{m}\left[\sum_{i=1}^{m}\sum_{j=1}^{k}I\{y^{(i)}=j\}log \frac{e^{{\theta_j^T}{X^{(i)}}}}{\sum_{l=1}...

mabel爱消消乐的博客 996

在深度学习中Softmax交叉熵损失函数的公式求导

(以下部分基本介绍转载于点击打开链接) 在深度学习NN中的output层通常是一个分类输出,对于多分类问题我们可以采用k-二元分类器来实现,这里我们介绍softmax。softmax回归中,我们解决的是多分类问题(相对于 logistic 回归解决的二分类问题),类标  可以取  个不同的值(而不是 2 个)。因此,对于训练集 ,我们有 。(注意此处的类别下标从 1 开始,而不是 0

zq18239961260的博客 8535

交叉熵损失函数求导与Softmax函数求导

前情提要。

十一月廿七风雨大作 9613

思科路由器重分发(静态路由+OSPF动态路由+RIP动态路由)

思科路由器重分发(静态路由+OSPF动态路由+RIP动态路由)

2301_81256766的博客 1261

sigmoid函数、tanh函数、softmax函数及求导

sigmoid函数和tanh函数都是激活函数,接收一个输入,产生一个输出。这里的求导是对激活函数求导。而softmax函数是一个多输入多输出的函数,这里提到的求导是对经过softmax函数后进行交叉熵计算得到的损失函数求导。 sigmoid函数及求导 sigmoid激活函数形式为: σ(x)=sigmoid(x)=11+e−x\sigma (x)=sigmoid(x)=\frac{1}{1+e^{...

qq_38032064的博客 4697

从零到一:用AXI DataMover在Zynq MPSoC上实现高效DMA传输(附Vitis HLS驱动示例)

本文详细介绍了如何在Xilinx Zynq UltraScale+ MPSoC平台上使用AXI DataMover实现高效的DMA数据传输。通过解析AXI DataMover架构、Vivado工程配置、Vitis HLS驱动开发及性能优化技巧,帮助开发者快速构建高性能数据传输通道,并提供了可直接复用的代码示例。

weixin_42520796的博客 427

Python 实战:高效绕过 reCAPTCHA v3 的自动化策略

本文深入探讨了使用Python高效绕过reCAPTCHA v3验证的实战策略。文章首先解析了reCAPTCHA v3无感验证的评分机制,随后详细介绍了两种核心解决方案:一是利用CapSolver等专业API服务直接获取有效token,二是通过Playwright模拟真人浏览器行为以提升评分。文中提供了从定位关键参数到代码实现的完整流程,并强调了合规操作与请求频率控制的重要性,为自动化开发者提供了切实可行的技术指南。

weixin_29057065的博客 489

softmax函数的定义及求导

softmax函数的定义及求导本文中(x0,x1,...,xm)(x_0, x_1, ..., x_m)代表一个向量,也就是一个mm行1列的矩阵。在监督式的深度学习中,输入通常是一个向量,用xx表示,输出yy则可以分为多种情况。 布尔型标量。yy为0或者1表示输入xx是否属于某一类别。 向量。此时输入xx可能属于多个类别。y=(y0,y1,...,yn)y=(y_0, y_1, ..., y_n)。

softee的专栏 1万+

【Python脚本】Python自动大麦网抢票,准点原价秒杀演唱会门票,拒绝黄牛交易!从我做起!!!1

你是否错过了周杰伦的票,最近又没抢到五月天的票,不要太难过,今晚有张学友的票,后天还有张杰的票,加油哦!

weixin_45841831的博客 6万+

Softmax函数交叉熵及其求导

1. 简介 SoftmaxSoftmaxSoftmax 函数 SoftmaxSoftmaxSoftmax 函数在神经网络分类是十分常用的函数,如下所示,在神经元output layer中,可以输出一个R4R4R^{4} 维度的向量,来进行分类,例如输出层为向量 O=[0.2,0.1,0.4,0.3]O=[0.2,0.1,0.4,0.3]O=[ 0.2,0.1,0.4,0.3 ], 可根据向量中...

Hansry的博客 1819

PCB盲埋孔工艺全解析:从机械钻孔到激光钻孔的进阶之路

本文全面解析了PCB盲埋孔工艺,对比了机械钻孔与激光钻孔两种核心技术的工艺流程、优势与局限。机械钻孔成本低、工艺成熟,适用于常规孔径;激光钻孔则能实现微孔、叠孔等复杂HDI结构,精度更高。文章深入探讨了如何根据孔径、成本、板厚及产品需求选择合适工艺,并强调了设计与制造协同的重要性,为高密度PCB设计提供实用指南。

weixin_29306317的博客 686

Android 中 app freezer 原理详解(二):S 版本

在之前的两篇博文《Android 中app内存回收优化(一)》和《Android 中app内存回收优化(二)》中详细剖析了 Android 中 app 内存优化的流程。这个机制的管理通过 CachedAppOptimizer 类管理,为什么叫这个名字,而不叫 AppCompact 等?freezer,一个针对应用进程长期处于 Cached 状态的优化。在之前博文《app freezer 原理 R 版本》

私房菜 3611

Softmax代价函数求导过程

Cost Function参考UFLDL的Softmax回归,SoftMax回归的的损失函数形为:J(θ)=−1N∑i=1m∑j=1k⎛⎝I(y(i)=k)logeθTjx(i)∑kl=1eθTjx(i)⎞⎠(1.1) J(\theta) = -\frac{1}{N}\sum_{i=1}^m\sum_{j=1}^k\left( I\left(y^{(i)} = k\right) \log \fra

liu_zheng87的博客 2839

DCMM评估报告模板样例

这篇DCMM评估报告对某数据管理公司2020年的数据管理能力进行了全面分析。报告显示,该公司在数据战略方面取得初步进展,但在数据治理和数据架构方面仍存在明显不足,包括缺乏有效治理流程、数据质量监控不足,以及数据标准化和转换灵活性不足等问题。评估报告提出了针对性改进建议,包括完善数据战略、建立治理流程、加强质量监控和提升数据转换灵活性等,为提升数据管理成熟度提供了重要指导。

cdfunlove的博客 166

Softmax及其损失函数求导推导过程

Softmax激活函数的损失函数求导过程推导Softmax函数介绍新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导...

linyu0716的博客 3358

极智AI | 详解 ViT 算法实现

大家好,我是极智视界,本文详细介绍一下 ViT 算法的设计与实现,包括代码。

极智视界 5604

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

softmax交叉熵损失函数求导

0 前言 来写一个softmax求导的推导过程,不仅可以给自己理清思路,还可以造福大众,岂不美哉~ softmax经常被添加在分类任务的神经网络中的输出层,神经网络的反向传播中关键的步骤就是求导,从这个过程也可以更深刻地理解反向传播的过程,还可以对梯度传播的问题有更多的思考。 1 softmax 函数 softmax(柔性最大值)函数,一般在神经网络中, softmax可以作为分类任务的输出层。其...

Lavi的专栏 4177

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

详解softmax函数以及相关求导过

这几天学习了一下softmax激活函数,以及它的梯度求导过程,整理一下便于分享和交流! softmax函数 softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类! 假设我们有一个数组,V,Vi表示V中的第i个元素,那么这个元素的softmax值就是更形象的如下图表示: softmax直白来说就是将原来输出是3

wzy的博客 7387

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

[损失函数]Softmax求导

原文链接: https://blog.youkuaiyun.com/u014380165/article/details/79632950 我们知道卷积神经网络(CNN)在图像领域的应用已经非常广泛了,一般一个CNN网络主要包含卷积层,池化层(pooling),全连接层,损失层等。虽然现在已经开源了很多深度学习框架(比如MxNet,Caffe等),训练一个模型变得非常简单,但是你对损失函数求梯...

急流勇进 1万+

Softmax函数详解以及求导过程

这几天学习了一下softmax激活函数,以及它的梯度求导过程,整理一下便于分享和交流! softmax函数 softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类! 假设我们有一个数组,V,Vi表示V中的第i个元素,那么这个元素的softmax值就是 Si=ei∑jejS_{i}=\frac{e^{i}}{\sum_{j} e^{j}}S...

猫敷雪 2869

softmax函数介绍以及我在softmax函数求导中的疑惑

简要介绍softmax函数,以及softmax函数的导数,网上对于该函数求导过程的参考资料很多,但是对于softmax函数,为什么要分i=j和i≠j两种情况,我学习之初有些钻牛角尖,待我理解之后,我便有心按我的理解整理下来。

weixin_38415589的博客 3500
上一篇: Real-Time Rotation-Invariant Face Detection with Progressive Calibration Networks (逐步校正不同角度的人脸)论文阅读
下一篇: 《Adaptive Local Tone Mapping Based on Retinex for High Dynamic Range Images》C++实现
just_sort
博客等级 码龄11年 2357粉丝 1667原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值