当前位置: 首页 > news >正文

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

一、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.gsyq.cn/news/22570.html

相关文章:

  • experiment2
  • 关于卷积神经网络(CNN)的入门学习报告
  • 【记录】Ubuntu|Ubuntu服务器挂载新的硬盘的流程(开机自动挂载) - 指南
  • 10月16日日记
  • 为 .NET 10 GC(DATAS)做准备
  • LLM学习记录DAY3
  • 二进制警报器
  • 常见问题处理 --- win卡任务栏 设置无法打开 桌面重启
  • p66实验题
  • 20251016
  • 虚拟线程的pinned问题终于被jdk25完美解决了
  • P4168 [Violet] 蒲公英题解
  • VGG使用块的网络
  • 使用SpringBoot + Thymeleaf + MyBatisPlus实现一个简单的书籍管理系统
  • 创业思路
  • P2605 [ZJOI2010] 基站选址
  • kafka连接认证
  • CF622D 题解
  • vue学习的总结
  • 【28】C# WinForm入门到精通 ——多文档窗体MDI【属性、强大的方法、实例、源码】【多窗口重叠、水平平铺、垂直平铺、窗体传值】
  • 第五周预习
  • 2025 非标门/铸铝门/别墅大门厂家推荐榜:聚焦品质与服务的实力之选
  • 工业数字化未来:IT与OT融合实践
  • 阅读《记录一类分治方法》笔记
  • CF2140E2
  • 实验指导-基于阿里云Serverless应用引l擎SAE的服务部署迀移 - 详解
  • 夜莺监控设计思考(二)边缘机房架构思考
  • 德州东站换乘攻略(仅供参考)
  • Date 2025.10.6
  • macOS 双开/多开微信WeChat完整教程(支持 4.X 及以上版本) - 实践