卷积神经网络(二):Softmax损失以及反向传播导数推导

本文详细解析了Softmax函数及交叉熵损失函数的工作原理,包括Softmax函数的定义及其在神经网络中的应用,以及如何利用链式法则进行Softmax层的反向传播求导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Softmax与交叉熵

Softmax函数如下:

Pk=eθkxdj=0eθjxPk=eθkx∑j=0deθjx

其中,Pk对应输出层第k个神经元的输出,也就是预测为第k类的概率,d表示输出层神经元总数
其损失函数(交叉熵)如下:
J(θ)=1ni=0nj=0dI(label(i)==k)lnPiJ(θ)=−1n∑i=0n∑j=0dI(label(i)==k)lnPi

其中,label(i)表示第i个样本的标签为第几类,I(label(i)==k)判断第i个样本的标签是否为k,若是值为1否则值为0

Softmax对反向传播推导

Softmax反向传播求导主要使用链式求导法则,因此我们只需要从输出层开始逐层倒推即可。
博主为了简便期间,先只讨论一般的神经网络情况(只存在全连接层,无卷积,池化层)

对前一层神经元输出的求导

在这里我们将Softmax层展开,如果前一层的输出(卷积神经网络中通常是全连接层)是X,那么记θX=Y,

Pk=eykdj=0eyjPk=eyk∑j=0deyj

根据链式求导法则,要求出Loss对y的偏导那就可以继续求Loss对x的偏导。

这里写图片描述

Loss对y的偏导分为两种情况,1:对于第i个样本的第label(i)个y的偏导

这里写图片描述

2.对非标签对应项的y的偏导,如果记为b

这里写图片描述

总的来说可以归纳为:

ΔJθΔyk=i=0n1n[I(label(i)==k)Pk,i]ΔJθΔyk=−∑i=0n1n[I(label(i)==k)−Pk,i]

因此

ΔJθΔxm=j=0di=0nΔJθΔykΔykΔxm=j=0d{i=0n1n[I(label(i)==j)Pj,i]θm,j}ΔJθΔxm=−∑j=0d∑i=0nΔJθΔykΔykΔxm=−∑j=0d{∑i=0n1n[I(label(i)==j)−Pj,i]∗θm,j}

对更前的层的输出的求导

核心原理
同样使用链式法则倒推,假设要求得某一层某个神经元z的导数则:

ΔJθΔz=j=0Di=0nΔJθΔxjΔxjΔzΔJθΔz=−∑j=0D∑i=0nΔJθΔxjΔxjΔz

其中,我们假设了x0x0xDxD都是z神经元在前向传播过程中参与计算了的(也就是说倘若把x的表达式用z对应的层的神经元展开,则x0x0xDxD是全部z参与运算得到的x,毕竟只有z参与运算才有x对z的导数)
公式表述
为了能够简洁的表示损失对某一神经元或者权重的求导,一般记敏感度δljδjl为损失J对第l层的某个神经元j激活前的输出的偏导
可以写成如下公式:
这里写图片描述
其中WlijWijl表示第l层第i个神经元连接第l+1层第j个神经元的权值,XliXil表示第l层的第i个输入,SljSjl表示第l层的第i个输出,f(x)表示激活函数
敏感度通过(2)式方向传播,而对权值的偏导数可以如(1)式通过敏感度求得
(以上(1),(2)两个公式都是只考虑一个样本的情况,否则还要加一个求和)

对于卷积神经网络

对于卷积神经网络的求导原理与上述情况一样,由于有卷积和池化层的存在,下一层会存在大量的与上一层无关的神经元,因此敏感度反向传播方式类似于反卷积的过程,由于原理已经掌握,而且在实践中都是由深度学习框架实现,在此就不再详述,感兴趣的可以自己查找其他博客。

<think>首先,用户的问题是:“我想了解softmax函数的导数计算方法或公式”,这是在机器学习背景下。用户明确要求了softmax导数计算或公式。现在,我需要参考提供的引用。引用是关于softmax损失层、牛顿方法、多类分类器中的softmax函数,以及最大池化和平均池化的。但用户的问题焦点是softmax函数的导数。关键引用:-引用[1]:提到softmax损失层计算多项式逻辑损失,并提到它提供了数值稳定的梯度。这表明softmax导数在梯度计算中很重要。-引用[3]:提到在多类分类器中,softmax函数用作输出节点的激活函数。用户的问题是关于导数计算,所以我应该解释softmax函数及其导数公式。回顾系统级指令:-使用$...$格式表示行内数学表达式。-独立公式使用$$...$$格式并单独成段。-LaTeX语法正确。-使用中文回答。-生成相关问题。-在引用的段落末尾自然地添加引用标识。回答结构:-结构清晰,帮助用户逐步解决问题。-尽量保证回答真实可靠。步骤:1.**定义softmax函数**:首先解释softmax函数是什么。2.**导数计算**:详细推导softmax函数的导数。3.**公式展示**:使用LaTeX格式。4.**在机器学习中的应用**:简要说明为什么导数重要,例如在反向传播中。5.**生成相关问题**:在结尾添加相关问题。softmax函数定义:对于输入向量\(\mathbf{z}=[z_1,z_2,\ldots,z_K]^T\)(其中K是类别数),softmax函数输出概率分布:\[s_i=\frac{e^{z_i}}{\sum_{j=1}^{K}e^{z_j}}\quad\text{for}\quadi=1,2,\ldots,K\]导数计算:softmax函数的导数需要计算偏导数\(\frac{\partials_i}{\partialz_j}\)。-当\(i=j\):\[\frac{\partials_i}{\partialz_i}=s_i(1-s_i)\]-当\(i\neqj\):\[\frac{\partials_i}{\partialz_j}=-s_is_j\]这是因为:\[s_i=\frac{e^{z_i}}{\sum_{k}e^{z_k}}\]设\(S=\sum_{k}e^{z_k}\),则\(s_i=e^{z_i}/S\)。-导数\(\frac{\partials_i}{\partialz_i}=\frac{\partial}{\partialz_i}\left(\frac{e^{z_i}}{S}\right)=\frac{e^{z_i}S-e^{z_i}\frac{\partialS}{\partialz_i}}{S^2}=\frac{e^{z_i}S-e^{z_i}e^{z_i}}{S^2}=\frac{e^{z_i}}{S}\cdot\frac{S-e^{z_i}}{S}=s_i(1-s_i)\)-对于\(i\neqj\),\(\frac{\partials_i}{\partialz_j}=\frac{\partial}{\partialz_j}\left(\frac{e^{z_i}}{S}\right)=e^{z_i}\cdot\left(-\frac{1}{S^2}\right)\cdot\frac{\partialS}{\partialz_j}=e^{z_i}\cdot\left(-\frac{1}{S^2}\right)\cdote^{z_j}=-\frac{e^{z_i}e^{z_j}}{S^2}=-s_is_j\)在机器学习中,softmax通常用于分类,并与交叉熵损失结合。引用[1]提到softmax损失层提供了数值稳定的梯度,这很重要。回答应该用中文。生成相关问题:基于主题,如为什么导数重要、数值稳定性等。添加引用:在相关的地方自然地添加引用标识。例如,提到数值稳定性时,引用引用[1]。最终回答结构:1.介绍softmax函数。2.解释导数公式。3.展示公式。4.讨论在反向传播中的应用。5.相关问题。</think>### Softmax函数的导数计算方法 在机器学习中,softmax函数是一种常用的激活函数,主要用于多类分类问题的输出层。它将输入向量转换为一个概率分布,确保所有输出值之和为1,且每个元素在0到1之间。理解其导数对于反向传播和优化模型(如梯度下降)至关重要[^3]。以下我将逐步解释softmax函数的定义、导数计算方法及公式,确保内容真实可靠。 #### 1. **Softmax函数定义** 设输入向量为 $\mathbf{z} = [z_1, z_2, \ldots, z_K]^T$,其中 $K$ 是类别数。softmax函数对每个元素 $z_i$ 的输出为: $$ s_i = \frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}} $$ 这里,$s_i$ 表示第 $i$ 个类别的预测概率,且 $\sum_{i=1}^{K} s_i = 1$。例如,在分类器中,softmax将原始分数(logits)转换为概率分布[^3]。 #### 2. **Softmax函数的导数计算** softmax导数涉及计算偏导数 $\frac{\partial s_i}{\partial z_j}$(即输出 $s_i$ 对输入 $z_j$ 的梯度)。导数结果取决于 $i$ 和 $j$ 是否相等: - **当 $i = j$(相同索引)**: $$ \frac{\partial s_i}{\partial z_i} = s_i (1 - s_i) $$ - **当 $i \neq j$(不同索引)**: $$ \frac{\partial s_i}{\partial z_j} = -s_i s_j $$ 这些公式表明,softmax导数是一个矩阵(Jacobian矩阵),其中对角线元素为 $s_i(1 - s_i)$,非对角线元素为 $-s_i s_j$。这确保了梯度计算的局部性和效率。 **推导说明**(可选阅读): 设 $S = \sum_{k=1}^{K} e^{z_k}$,则 $s_i = e^{z_i} / S$。 - 对于 $\frac{\partial s_i}{\partial z_i}$:使用商法则,$\frac{\partial s_i}{\partial z_i} = \frac{e^{z_i} S - e^{z_i} \cdot e^{z_i}}{S^2} = \frac{e^{z_i}}{S} \cdot \frac{S - e^{z_i}}{S} = s_i (1 - s_i)$。 - 对于 $\frac{\partial s_i}{\partial z_j}$($i \neq j$):$\frac{\partial s_i}{\partial z_j} = e^{z_i} \cdot \left( -\frac{1}{S^2} \right) \cdot e^{z_j} = -\frac{e^{z_i} e^{z_j}}{S^2} = -s_i s_j$。 这种推导利用了链式法则和偏导数的性质,确保数值稳定性(避免大梯度导致的溢出)[^1]。 #### 3. **在机器学习中的应用** 在反向传播中,softmax通常与交叉熵损失函数结合使用。损失函数对输入 $z_j$ 的梯度为: $$ \frac{\partial L}{\partial z_j} = s_j - y_j $$ 其中 $L$ 是交叉熵损失,$y_j$ 是真实标签(one-hot编码)。这得益于softmax导数的简单形式,使梯度计算高效且易于实现。例如,在神经网络中,这有助于优化权重参数。softmax损失层直接提供数值稳定的梯度,避免数值问题[^1]。 #### 4. **注意事项** - **数值稳定性**:实际实现时,为避免指数计算溢出,常使用 $\mathbf{z}$ 减去最大值(如 $z_i \leftarrow z_i - \max(\mathbf{z})$),这不改变输出概率,但提升计算鲁棒性[^1]。 - **性能**:导数计算的时间复杂度为 $O(K^2)$,但在GPU加速下高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值