神经网络之Softmax激活函数求导过程 - 指南

news/2025/10/16 22:21:35/文章来源:https://www.cnblogs.com/wzzkaifa/p/19146748

一、Softmax 函数的定义

给定一个输入向量:

z=[z1,z2,...,zn]⊤ \mathbf{z} = [z_1, z_2, ..., z_n]^\topz=[z1,z2,...,zn]

Softmax 函数将其变换为一个输出向量(概率分布):

σ(z)i=ezi∑j=1nezjfor i=1,...,n \sigma(\mathbf{z})_i = \frac{e^{z_i}}{\sum_{j=1}^n e^{z_j}} \quad \text{for } i = 1, ..., nσ(z)i=j=1nezjezifor i=1,...,n

这是一个向量函数,将实数向量映射为每个元素在 (0, 1) 之间,且总和为 1。


二、目标:求导

大家要推导的是:

∂σ(z)i∂zk \frac{\partial \sigma(\mathbf{z})_i}{\partial z_k}zkσ(z)i

也就是说:
Softmax 输出第iii个分量对输入向量第kkk个分量的偏导数。


三、对两种情况分别推导

✅ 情况 1:当i=ki = ki=k(对自己求导)

大家记 Softmax 输出为sis_isi

si=ezi∑j=1nezj s_i = \frac{e^{z_i}}{\sum_{j=1}^n e^{z_j}}si=j=1nezjezi

利用商法则:

∂si∂zi=ezi⋅∑jezj−ezi⋅ezi(∑jezj)2=ezi(∑jezj−ezi)(∑jezj)2 \frac{\partial s_i}{\partial z_i} = \frac{e^{z_i} \cdot \sum_j e^{z_j} - e^{z_i} \cdot e^{z_i}}{(\sum_j e^{z_j})^2} = \frac{e^{z_i}(\sum_j e^{z_j} - e^{z_i})}{(\sum_j e^{z_j})^2}zisi=(jezj)2ezijezjeziezi=(jezj)2ezi(jezjezi)

整理一下:

∂si∂zi=si(1−si) \frac{\partial s_i}{\partial z_i} = s_i (1 - s_i)zisi=si(1si)


✅ 情况 2:当i≠ki \ne ki=k(对别的分量求导)

∂si∂zk=0⋅∑jezj−ezi⋅ezk(∑jezj)2=−eziezk(∑jezj)2=−sisk \frac{\partial s_i}{\partial z_k} = \frac{0 \cdot \sum_j e^{z_j} - e^{z_i} \cdot e^{z_k}}{(\sum_j e^{z_j})^2} = -\frac{e^{z_i} e^{z_k}}{(\sum_j e^{z_j})^2} = -s_i s_kzksi=(jezj)20jezjeziezk=(jezj)2eziezk=sisk


四、结果:Jacobian 矩阵形式

我们将所有偏导组织成一个 Jacobian 矩阵J∈Rn×nJ \in \mathbb{R}^{n \times n}JRn×n,有:

$$
J_{ik} = \frac{\partial s_i}{\partial z_k} =
\begin{cases}
s_i (1 - s_i), & \text{if } i = k \

也能够写成矩阵形式:

∂s∂z=diag(s)−ss⊤ \frac{\partial \boldsymbol{s}}{\partial \mathbf{z}} = \text{diag}(\boldsymbol{s}) - \boldsymbol{s} \boldsymbol{s}^\topzs=diag(s)ss

其中:


五、在神经网络中的用法

常见组合:Softmax + CrossEntropy(交叉熵损失)

在多分类神经网络中,常见组合是:

这种组合在反向传播时有非常好的性质,导数公式变得非常简单:

∂Loss∂zi=y^i−yi \frac{\partial \text{Loss}}{\partial z_i} = \hat{y}_i - y_iziLoss=y^iyi

其中:

这就是为什么框架(如 PyTorch)中提供 CrossEntropyLoss 是直接整合了 Softmax + Log + NLLLoss。


✅ 总结表:Softmax 求导

项目内容
函数定义si=ezi∑jezjs_i = \frac{e^{z_i}}{\sum_j e^{z_j}}si=jezjezi
对自己求导∂si∂zi=si(1−si)\frac{\partial s_i}{\partial z_i} = s_i (1 - s_i)zisi=si(1si)
对他人求导∂si∂zk=−sisk\frac{\partial s_i}{\partial z_k} = -s_i s_kzksi=sisk
Jacobian 矩阵J=diag(s)−ss⊤J = \text{diag}(s) - s s^\topJ=diag(s)ss
应用多分类输出层、交叉熵损失的梯度计算

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/938541.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

课后作业3

https://files.cnblogs.com/files/blogs/847991/课后作业3.rar?t=1760623964&download=true

KMP和Manacher

以下代码相关注释未完善,大体内容如下: #include <iostream> #include <vector> #include <string> #include <string_view>#define S(X) for (char i : X) {\std::cout << i;\}\cl…

experiment2

Task1 问题1: srand(time(NULL));的作用:经过查询,发现这行代码用于初始化随机数生成器的种子,srand()是设置随机种子的函数,time(NULL)返回当前系统时间,将当前时间作为种子,确保每次程序运行时产生的随机数序列不同.…

索引有什么作用?

一句话概念 索引(Index) 就像是数据库里的“目录”或“书的索引页”。 它的主要作用是:加快查询速度,减少数据库扫描整张表的次数。📖 举个简单的例子 假设你有一个商品表 products,里面有几万条记录。 如果你执…

关于卷积神经网络(CNN)的入门学习报告

关于卷积神经网络(CNN)的入门学习报告 在观看了B站上关于卷积神经网络的系列教学视频后,我对CNN的基本原理和核心组件有了初步的认识。 一、 核心动机:解决全连接网络处理图像时的困境 首先,为什么要用CNN?传统的…

【记录】Ubuntu|Ubuntu服务器挂载新的硬盘的流程(开机自动挂载) - 指南

【记录】Ubuntu|Ubuntu服务器挂载新的硬盘的流程(开机自动挂载) - 指南2025-10-16 21:43 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: …

10月16日日记

1.今天体测50米,引体向上等。 2.明天学习英语 3.底层无法处理的异常要抛出,有明确处理策略时才捕获,切忌捕获后什么都不做。

LinuxC++——etcd-cpp-api精简源代码函数参数查询参考 - 教程

LinuxC++——etcd-cpp-api精简源代码函数参数查询参考 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…

TELUS如何通过Google技术栈实现业务增长与生产力跃升

本文详细介绍了加拿大通信技术公司TELUS通过部署ChromeOS、Google Workspace、Chrome Enterprise Premium和Cameyo构建企业级技术栈,实现登录速度提升3倍、降低运营成本并改善客户服务体验的数字化转型实践。编辑注 今…

云服务器上部署 EasyTier中转服务器

云服务器开放端口 控制台中放开11010端口 连接云服务器安装软件 wget -P /root/ https://ghfast.top/https://github.com/Doboo/scripts/blob/main/easytier.sh && chmod 777 /root/easytier.sh 设置组网信息 …

问世界

在这个世界上,是否所有的问题都有答案?还是说这个世界本身就是个巨大的问题?

为 .NET 10 GC(DATAS)做准备

原作者:maoni 原文链接:https://maoni0.medium.com/preparing-for-the-net-10-gc-88718b261ef2在 .NET 9 中,我们默认启用了 DATAS。但 .NET 9 并不是长期支持(LTS)版本,因此很多人会在升级到 .NET 10 时首次获得…

实用指南:Kotlin协程 vs Java虚拟线程:从Continuation挂起到ForkJoin调度,解锁现代并发新范式

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

LLM学习记录DAY3

📘今日学习总结 一、语言模型基础能力的建立:预训练 1.1 预训练的核心思想目标:通过大规模无监督文本学习语言表示。 方式:自回归预测下一个词:\[\mathcal{L}_{\text{LM}}(\mathbf{u}) = \sum_{t=1}^{T} \log P(…

你的程序为何卡顿?从LINUX I/O三大模式寻找答案

你的程序为何卡顿?从LINUX I/O三大模式寻找答案I/O交互流程 在LINUX中,内核空间和用户空间都位于虚拟内存中。LINUX采用两级保护机制:0级供内核使用,3级供用户程序使用。每个进程都有独立的用户空间(0~3G),对其…

日总结 13

BP 神经网络(Back Propagation Neural Network)是一种基于误差反向传播算法训练的多层前馈神经网络,核心是通过反向传播误差来调整网络权重,从而实现对复杂非线性关系的学习与拟合,是深度学习的基础模型之一。 一…

开源许可协议 gpl vs mit?

大一点的项目用GPL,与社区个人共享劳动过程与成果,保护劳动果实不被商业公司吸血、完全抄袭与窃取。 小项目或者纯依赖库,用MIT,方便你我他接手,续上代码更新。