pytorch深度学习基础(五)——SoftMax函数反向传递公式推导及代码实现

一分钟理解softmax函数(超简单) 做过多分类任务的同学一定都知道softmax函数。softmax函数,又称归一化指数函数。它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。下图展示了softmax的计算方法: 下面为大家解释一下为什么softmax是这种形式。 首先,我们知道概率有两个性质:1)预测的概率为非负数;2)各种预测结果概率之和等于1。 softmax就是将在负无穷到正无... 阅读详情
AI摘要

本文详细介绍了SoftMax函数在深度学习中的应用,包括其基本概念、公式推导以及在PyTorch框架下的代码实现。首先解释了SoftMax函数的定义及其在多分类问题中的作用,接着通过数学推导展示了SoftMax函数在反向传播过程中的偏导数计算方法,并区分了输入输出坐标相对应与不对应两种情况。最后,文章提供了两种代码实现方式,一种是简化但不够严谨的实现,另一种是更正规的代码实现。

SoftMax函数介绍

简介

softmax函数是常用的输出层函数,常用来解决互斥标签的多分类问题。当然由于他是非线性函数,也可以作为隐藏层函数使用

公式

假设我们有若干输入[x1, x2, x3…xn],对应的输出为[y1, y2, y3…yn],对于SoftMax函数我们有
y i = e x i ∑ k = 0 e x k y_i= \frac{e^{x_i}}{\sum_{k=0} e^{^{x_k}}} yi​=∑k=0​exk​exi​​

图像

在这里插入图片描述

反向传递公式推导

SoftMax函数比较特殊,他有多个输入和输出,并且每个输出与所有的输入都有关,所以这个函数输出对于多个输入都有一个偏导数,也就是SoftMax可以得到多个偏导数。对于SoftMax我们有两种情况

当输入坐标与输出坐标相对应时

∂ y i ∂ x j = ∂ y i ∂ x i \frac{\partial y_i}{\partial {x_j}}=\frac{\partial y_i}{\partial {x_i}} ∂xj​∂yi​​=∂xi​∂yi​​
= e x i ⋅ ( ∑ k , i = j e x i ) − e x i ⋅ e x i ( ∑ k , i = j e x k ) 2 = \frac{e^{x_i} \cdot (\sum_{k,i=j} e^{x_i})-e^{x_i} \cdot e^{x_i}}{(\sum_{k, i=j}e^{x_k})^2} =(∑k,i=j​exk​)2exi​⋅(∑k,i=j​exi​)−exi​⋅exi​​
= e x i ∑ k , i = j e x k − ( e x i ∑ k , i = j e x k ) 2 =\frac{e^{x_i}}{\sum_{k, i=j}e^{x_k}}-(\frac{e^{x_i}}{\sum_{k, i=j}e^{x_k}})^2 =∑k,i=j​exk​exi​​−(∑k,i=j​exk​exi​​)2
= y i ( 1 − y i ) =y_i(1-y_i) =yi​(1−yi​)

当输入坐标与输出坐标不对应时

∂ y i ∂ x j = − e x i ⋅ e x j ( ∑ k e x k ) 2 \frac{\partial y_i}{\partial {x_j}}= -\frac{e^{x_i} \cdot e^{x_j}}{(\sum_ke^{x_k})^2} ∂xj​∂yi​​=−(∑k​exk​)2exi​⋅exj​​
= − e x i ∑ k , i ! = j e x k ⋅ e x j ∑ k , i ! = j e x k = − y i ⋅ y j =-\frac{e^{x_i}}{\sum_{k, i!=j}e^{x_k}} \cdot \frac{e^{x_j}}{\sum_{k, i!=j}e^{x_k}}=-y_i \cdot y_j =−∑k,i!=j​exk​exi​​⋅∑k,i!=j​exk​exj​​=−yi​⋅yj​

两种情况合并

∂ y i ∂ x j = e x i ∑ k , i = j e x k − ( e x i ∑ k , i = j e x k ) 2 − e x i ∑ k , i ! = j e x k ⋅ e x j ∑ k , i ! = j e x i = e x i ∑ k , i = j e x k − e x i ⋅ e x j ( ∑ k e x k ) 2 = y i − y i ⋅ y j \frac{\partial y_i}{\partial x_j}=\frac{e^{x_i}}{\sum_{k, i=j}e^{x_k}}-(\frac{e^{x_i}}{\sum_{k, i=j}e^{x_k}})^2-\frac{e^{x_i}}{\sum_{k, i!=j}e^{x_k}} \cdot \frac{e^{x_j}}{\sum_{k, i!=j}e^{x_i}} \\ = \frac{e^{x_i}}{\sum_{k, i=j}e^{x_k}}-\frac{e^{x_i} \cdot e^{x_j}}{(\sum_{k}e^{x_k})^2}=y_i -y_i \cdot y_j ∂xj​∂yi​​=∑k,i=j​exk​exi​​−(∑k,i=j​exk​exi​​)2−∑k,i!=j​exk​exi​​⋅∑k,i!=j​exi​exj​​=∑k,i=j​exk​exi​​−(∑k​exk​)2exi​⋅exj​​=yi​−yi​⋅yj​
按照正常的推导到这里就应该结束了,但我们为了代码实现方便,可以将i和j近似的看成相同的,这样我们就可以得到一个效果类似的不太严谨的代码
∂ y ∂ x = y ⋅ ( 1 − y ) \frac{\partial y}{\partial x}=y \cdot (1-y) ∂x∂y​=y⋅(1−y)

代码实现

一个简单但不严谨的实现

class SoftMax():
    def __init__(self):
        pass
    def _softmax(self,x):
        x = x.T
        x = x - np.max(x, axis=0)
        y = np.exp(x) / np.sum(np.exp(x), axis=0)
        return y.T
    
    def forward(self,input):
        return self._softmax(input)
    
    def backward(self, input, grad_output):
        out = self.forward(input)
        return grad_output * out * (1 - out)

正规代码

代码

class SoftMax():
    def __init__(self):
        pass
    def _softmax(self,x):
        x = x.T
        x = x - np.max(x, axis=0)
        y = np.exp(x) / np.sum(np.exp(x), axis=0)
        return y.T
    
    def forward(self,input):
        return self._softmax(input)
    
    def backward(self, input, grad_output):
        out = self.forward(input)
        ret = []
        for i in range(grad_output.shape[0]):
        	softmax_grad = np.diag(out[i]) - np.outer(out[i], out[i])
        	ret.append(np.dot(softmax_grad, grad_output[i].T))
        ret = np.array(ret)
        return ret

解析
这里的实现可能较为难以理解,我们使用IDLE在下面进行步骤分解解释

先假设out

>>> import numpy as np
>>> out = np.array([[1, 2, 3], [4, 5, 6]])
>>> out
array([[1, 2, 3],
       [4, 5, 6]])
       

grad_output的形状与out相识,我们假设

>>> grad_output = np.array([[3, 4, 5], [6, 7, 8]])
>>> grad_output
array([[3, 4, 5],
       [6, 7, 8]])
       

我们回顾上面推导的反向传递的公式为
∂ y i ∂ x j = y i − y i ⋅ y j \frac{\partial y_i}{\partial x_j}=y_i -y_i \cdot y_j ∂xj​∂yi​​=yi​−yi​⋅yj​
yi即为第i位为每i行对应的值,可以使用np.diag实现

我们取第0位来测试

>>> out[0]
array([1, 2, 3])

>>> np.diag(out[0])
array([[1, 0, 0],
       [0, 2, 0],
       [0, 0, 3]])

y i ⋅ y j 即为 i 行 j 列设置为 y i 和 y j 的乘积 y_i \cdot y_j 即为i行j列设置为y_i和y_j的乘积 yi​⋅yj​即为i行j列设置为yi​和yj​的乘积

>>> np.outer(out[0], out[0])
array([[1, 2, 3],
       [2, 4, 6],
       [3, 6, 9]])

所以softmax的梯度为

>>> softmax_grad = np.diag(out[0]) - np.outer(out[0], out[0])
>>> softmax_grad
array([[ 0, -2, -3],
       [-2, -2, -6],
       [-3, -6, -6]])

那么向前传递的值应该为softmax的梯度和后边传过来的梯度grad_output,我们仍然以第0位为例,这样我们就可以得到第0位的梯度,那么后续我们遍历各个位获得梯度即可。

>>> softmax_grad.dot(grad_output[0].T)
array([-23, -44, -63])

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

相关推荐

深入理解softmax

​ 前言 本文代码基于Pytorch实现。 一、softmax的定义及代码实现 1.1 定义 softmax(xi)=exp(xi)∑jnexp(xj) softmax(x_i) = \frac{exp(x_i)}{\sum_j^nexp(x_j)} softmax(xi​)=∑jn​exp(xj​)exp(xi​)​ 1.2 代码实现 def softmax(X): ''' 实现softmax 输入X的形状为[样本个数,输出向量维度] ''' return torc

小草莓的魔法笔记 5733

深度学习笔记之循环神经网络(四)铺垫:Softmax函数的反向传播过程

上一节介绍了递归神经网络前馈计算过程的基本逻辑,以及作为语言模型时,衡量一个语言模型的优劣性指标——困惑度。本节介绍Softmax函数的反向传播(Backward Propagation,BP)过程。

静静的学习就好 1724

手写BP神经网络:从反向传播推导到NumPy实现,吃透深度学习地基

深度学习模型的成功背后,离不开一个朴实却核心的算法——反向传播。其本质是借助链式法则,将损失函数对网络输出的误差逐层回传,从而计算每个神经元的梯度,驱动参数更新。这一机制构成了BP神经网络训练的基础,也是卷积网络、Transformer等现代架构共用的底层逻辑。在实际应用中,从图像识别到自然语言处理,几乎所有深度学习任务都依赖梯度下降与误差反向传播的协同工作。理解BP神经网络的数学推导、代码实现与调参策略,能帮助工程师快速定位训练中的梯度消失、爆炸及收敛慢等问题。本文以手写NumPy代码的方式,系统拆解BP

weixin_33946020的博客 370

一文彻底搞懂 Softmax 函数,数学原理分析和 PyTorch 验证

Softmax 函数的数学原理分析和 PyTorch 使用

qq_43799400的博客 5万+

从零手写AI核心算法:线性回归、Softmax与神经网络层实现

在人工智能和机器学习领域,理解底层原理是构建扎实技术能力的关键。许多开发者熟悉调用高级API,但对支撑模型的数学、算法和架构却一知半解。本文聚焦于通过手写实现核心算法来穿透技术迷雾,获得扎实的构建能力。我们将从机器学习的基础概念切入,探讨梯度下降、反向传播等核心原理的技术价值。通过亲手实现线性回归、Softmax分类器以及神经网络层等模块,你将深刻理解从数学公式到代码实现的完整链条。这种实践方法不仅能破除对数学符号的恐惧,更能打开算法黑箱,培养对架构设计的直觉。最终,这种深度实践将引导你从技术的“使用者”转

weixin_30307921的博客 476

反向传播与MLP:从手推梯度到PyTorch实现全记录

深度学习入门常遇到两类关卡:一是理解多层感知机(MLP)的前向传播与反向传播原理,二是把数学推导变成可运行的PyTorch代码。反向传播是神经网络训练的基石,它通过链式法则把损失对输出的误差逐层分摊到每个参数;交叉熵损失与Softmax的组合则提供了稳定且直观的优化信号。掌握这些基础后,用PyTorch搭建一个包含线性层、ReLU和Adam优化器的小型MLP并不复杂,关键在于数据标准化、梯度清零、损失曲线与验证集准确率的配合判断。一次面向分类任务的完整实践,从手推两层网络梯度到处理loss卡在0.693、验

weixin_32678995的博客 76

pytorch深度学习基础(二)——反向传递概念透彻解析以及Python手动实现

通过公式推导透彻理解反向传递,使用Python实现乘法层、加法层、Relu层、Sigmoid层、带交叉熵误差的SoftMax层的反向传递实例

艾醒的博客 2685

PyTorch手写神经网络实操:从零理解反向传播与激活函数

神经网络是深度学习的基础模型,其核心在于前向传播的线性变换与非线性激活,以及反向传播中链式法则驱动的梯度更新。理解activation functions(如ReLU、Sigmoid)的导数特性,能避免梯度消失;掌握loss function(如CrossEntropy)的梯度形式,可确保分类任务中优化方向正确。这些原理在PyTorch等框架中被封装,但调试时需回归张量维度与梯度流本质。本文以3层全连接网络为载体,聚焦neural network basics,通过手动推导backpropagation、显

shirlly 403

[深度学习网络从入门到入土] 反向传播backprop

[深度学习网络从入门到入土] 反向传播backprop

qq_54636039的博客 619

用PyTorch和TensorFlow手把手推导Softmax+CrossEntropyLoss的反向传播(附代码)

本文详细解析了Softmax与交叉熵损失函数在反向传播中的数学推导与代码实现,通过PyTorch和TensorFlow手把手教学,帮助开发者深入理解梯度推导过程。文章涵盖计算图构建、数值稳定性优化及工程实践中的关键细节,特别适合希望掌握深度学习底层原理的开发者。

weixin_28737603的博客 236

神经网络与深度学习课后习题:从推导到实战的核心考点全解析

深度学习的基础在于对神经网络底层原理的透彻理解,而不仅仅停留在调用框架接口的层面。前向传播、反向传播、损失函数设计以及激活函数选择构成了模型训练的核心闭环,这些概念看似简单,但在实际工程中却直接影响模型的收敛效果与泛化能力。从单层感知机到卷积神经网络、循环神经网络乃至Transformer,理解计算图上的梯度流动与参数更新机制,是排查训练问题、优化模型性能的关键技能。无论是准备期末考试、考研复试,还是投身真实项目开发,扎实掌握这些基础原理都能事半功倍。本文围绕神经网络与深度学习的高频考点,系统梳理了前馈网络

weixin_34204722的博客 436

手写Affine层与Softmax层:深度学习前向反向传播核心实现

Affine层(仿射变换)和Softmax层是神经网络分类任务中最基础、最不可替代的两个计算单元。Affine层完成输入特征的线性加权与偏置平移,本质是高维空间的坐标系重映射;Softmax层则将原始logits转化为概率分布,依赖数值稳定化(如减去行最大值)规避指数溢出。二者共同构成前向传播的语义闭环与反向传播的梯度起点,其正确实现直接决定模型可训练性。在工程实践中,它们是理解PyTorch/TensorFlow底层机制、调试nan/不收敛问题、掌握权重初始化(He/Xavier)、梯度形状匹配及交叉熵联

weixin_34138056的博客 258

前馈神经网络实战指南:从激活函数到反向传播的PyTorch实现

深度学习是人工智能领域的核心技术之一,而前馈神经网络(FNN)作为最基础的神经网络结构,是理解复杂模型如卷积网络和Transformer的基石。它的核心原理是通过多层非线性变换对输入数据进行特征提取,再借助反向传播算法和梯度下降优化参数。在实际工程中,激活函数的选择(如ReLU、Tanh)直接影响梯度消失问题的严重程度,而自动微分技术(如PyTorch的动态计算图)则大幅简化了梯度的计算过程。掌握前馈网络的前向传播、损失函数设计、参数初始化及训练避坑技巧,是搭建高效机器学习模型的关键。本文从一个深度学习的经

weixin_34252686的博客 351

Softmax全面解析:从数学原理到代码实现与反向传播

在深度学习领域,激活函数是神经网络具备非线性表达能力的关键组件。面对多分类任务,如图像识别、文本分类或音乐风格识别,模型输出层需要将原始得分转换为可解释的概率分布。Softmax正是完成这一转换的标准工具,它通过指数归一化将logits映射为总和为1的非负概率,并放大类别间差异,从而提供清晰的置信度度量。工程实践中,数值稳定性至关重要,减去最大值操作可有效防止指数溢出。同时,Softmax与交叉熵损失联合使用时,反向传播梯度会简化为“预测值减真实值”的优雅形式,大幅提升训练效率。该技术广泛应用于各类多分类场

weixin_29048775的博客 240

CISSP/CCSP证书到手后别松懈!保姆级维持攻略:CPE积分怎么攒?年费怎么交?

本文为CISSP/CCSP持证者提供详细的维持认证攻略,重点介绍如何高效积累CPE积分和避免年费缴纳中的常见问题。通过免费与付费资源结合的策略,帮助持证者轻松完成年度认证要求,同时利用认证创造职业价值。

weixin_30859423的博客 417

企业微信会话存档SDK集成与动态库加载实战

本文详细解析了企业微信会话存档SDK的集成与动态库加载实战,重点解决Windows与Linux环境下动态库加载的差异问题。通过实战案例和优化建议,帮助开发者高效完成企业微信API集成,确保合规存档功能稳定运行。

weixin_26934905的博客 464

激活函数、正向传播、反向传播及softmax分类器,一篇就够了!

1. 深度学习有哪些应用 图像:图像识别、物体识别、图片美化、图片修复、目标检测。 自然语言处理:机器...

377

DEA各种模型原理及stata代码实现

DEA各种模型原理及stata代码实现DEA各种模型原理及stata代码实现一、CCR和BCC1.原理2.效率测算stata代码3.Malmquist指数3.1M指数3.2Global-Malmquist指数4.指数计算代码与案例二、SBM模型1.原理2.stata代码实现三、方向性距离函数(DDF)1.原理2.stata代码实现3.非径向DDF模型(NDDF)3.GML指数4.指数测算四、总结 DEA各种模型原理及stata代码实现 一、CCR和BCC 1.原理 CCR模型产出导向下的效率通过求解以下规划

wonder1322的博客 4万+

softmax 和 交叉熵损失函数

为了解决分类问题

h661975的博客 271

k-shape时间序列聚类实战:从理论到tslearn实现

本文深入探讨了k-shape时间序列聚类算法,从核心原理到tslearn库的实战应用。k-shape通过标准化互相关系数衡量序列形状相似性,专注于识别波动模式而非绝对数值。文章详细介绍了算法流程、Python环境搭建、数据预处理、最佳K值确定方法,并通过完整代码示例展示了模型训练与结果可视化,帮助读者掌握这一强大的“形状捕手”工具。

weixin_29061465的博客 175

最终篇——SWAT模型的建立

同理,Soil Data也是同样的方法导入,在Soil Database Options的选项中,选择UserSiol,用同样的方法导入土壤类型,进行重分类。打开窗口后,只定义HRU Thresholdes,其余两个不用设置,设定各数据单元的计算率,这里的10%的意思是计算精度,即分成级HRU计算单元太小,小于平均计算单元的10%,我们就不对这HRU单元进行计算(也就是说太破碎的计算单元不进行计算),若选择0%意味着全部进行计算,需要耗费大量的内存和时间,对计算机要求较高,不建议。

m0_72556434的博客 5622

手撕反向传播:矩阵乘法梯度推导与维度对齐实战

深度学习模型的训练本质上依赖于梯度下降,而反向传播是高效计算梯度的核心算法。神经网络中大量计算可归结为矩阵乘法,理解其梯度推导成为掌握网络结构修改、自定义层实现以及调试梯度异常的关键。本文从链式法则出发,将标量求导推广至矩阵场景,系统讲解矩阵乘法前向传播与反向传播的数学原理,给出∂Y/∂X、∂Y/∂W等核心公式的逐元素推导和维度校验方法,并结合两层全连接网络的NumPy手写实现与数值梯度验证,展现理论与实践结合的过程。矩阵求导的布局约定、转置映射、梯度形状对齐等内容也一并覆盖。该知识同样适用于卷积、注意力机

weixin_31499265的博客 293

【技能】OpenClaw Memory 与 MemOS 两种 AI 记忆方案深度解析

摘要:本文对比了两种AI记忆系统方案。OpenClaw Memory是轻量级记忆助手,内置SQLite存储,支持语义搜索,部署简单成本低,适合日常对话记忆需求。MemOS是自学习系统,通过Neo4j和Qdrant实现技能自进化,但需部署4套服务,门槛高成本大。建议普通用户选择OpenClaw Memory,技术玩家可逐步尝试MemOS。两种方案各具优势,需根据实际需求选择。

海兰 199

PyTorch深度学习神经网络实战:PyTorch神经网络基础-层与神经元

摘要: 生物神经元通过树突接收信号,在细胞体整合后,通过轴突传导动作电位,经突触释放神经递质传递信号。人工神经元模拟此过程:输入信号加权求和后,经激活函数(如Sigmoid、ReLU等)处理输出,并通过反向传播调整权重和偏置以优化性能。关键组件包括输入、激活函数和输出,数学表达为 ( z = \sum (w_i x_i) + b ),输出为 ( \text{activation_function}(z) )。权重决定特征重要性,偏置调节激活阈值。常用激活函数各有特点,如Softmax多分类时输出概率分布。训

WSSWWWSSW的博客 1028

《MPDIoU:边界框回归的高效革新与YOLOv8集成实战指南》

摘要: MPDIoU(多优先级距离IoU)通过引入中心距离、形状差异和尺度变化的三步优化策略,解决了传统IoU在目标检测中的尺度敏感、收敛低效和场景局限问题。相较于GIoU、DIoU等主流方法,MPDIoU在精度、速度和鲁棒性上实现全面提升,尤其在复杂场景和小目标检测中表现突出。通过代码集成和训练优化,MPDIoU在YOLOv8中显著提升COCO数据集AP指标,并在智能安防(密集行人检测)和工业质检(微小缺陷定位)等垂直领域验证了其应用价值。未来研究方向包括动态权重调整和多模态融合,进一步拓展边界框回归的精

m0_64661770的博客 159

31、车载通信中的可见光通信(VLC)技术解析

本文详细解析了车载通信中可见光通信(VLC)技术的应用背景、优势及发展前景。对比传统RF通信技术(如DSRC),VLC利用LED照明设备实现高效、安全的车辆与车辆、车辆与基础设施之间的通信,具有频谱资源丰富、安全性高、无电磁干扰等优势。文章还探讨了VLC在交叉口交通控制、高速公路通信、自动驾驶等场景的应用潜力,展望了其在未来智能交通系统中的重要作用。

hill8的博客 318
上一篇: pytorch深度学习基础(四)——损失函数
下一篇: LeetCode刷题——第 287 场周赛
艾醒(AiXing-w)
艾醒(AiXing-w) 2021年度博客之星AI领域top5 2021年度博客之星AI领域top5
博客等级 码龄7年 1万+粉丝 320原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾醒(AiXing-w)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值