10_自动微分模块与计算图[pytorch框架与神经网络基础]
8.自动微分模块训练神经网络时最常用的算法就是反向传播。在该算法中参数(模型权重)会根据损失函数关于对应参数的梯度进行调整。为了计算这些梯度PyTorch内置了名为 torch.autograd 的微分引擎(自动微分模块)。一般来说,pytorch中模型的计算流程为前向计算 → 构建计算图 → 计算损失 → 反向传播 → 自动微分 → 优化器更新参数 自动微分负责“怎么算梯度” 反向传播是计算梯度的一种高效算法利用链式法则从后往前算 优化器拿到梯度后负责“怎么更新参数”8.1 前向传播与计算图的构建前向传播把输入数据xxx沿着神经网络层层递进,经过所有参数和激活函数的运算,最终得到输出结果的过程。计算图是一个有向无环图(DAG),由两部分组成节点(Nodes)张量(数据),参数(w和b)或操作(如加、减、乘、卷积、激活函数)。pytorch中,直接创建的张量被称为叶子节点(Leaf Tensor)边(Edges)代表数据的流向(即张量作为输入,经过运算,产生输出)。每执行一次前向传播,就是遍历一次模型代码,同时pytorch.autograd会遍历其中的所有数学运算,构建出计算图,在调用backward()时提供精确的“导数路线”。requires_grad和梯度累计你可以在张量初始化时指定requires_gradTrue或调用.retain_grad()来声明此张量数据是可训练的参数,对每个requires_gradTrue的叶子节点(Leaf Tensor),都会关联一个AccumulateGrad节点。同时,对requires_gradTrue具有传播性与其有关的张量都具备requires_gradTrue。每个requires_gradTrue的叶子节点(Leaf Tensor)其梯度都会被保存在内存中。AccumulateGrad结点是pytorch中自动微分引擎中一个特殊的、底层的 Function节点它专门负责接收反向传播来的梯度并将其累加到对应叶子张量的.grad属性中,直到调用zero_grad()才会将梯度清零。下图展示了一个简单的计算图,其数学表达式如下lossMSE(y,z),zw∗xb loss MSE(y,z) \quad ,z w * x blossMSE(y,z),zw∗xb在这个例子中,www和bbb的梯度计算方式为∂l∂w∂l∂z⋅∂z∂w2(w∗xb−y)∗x∂l∂b∂l∂z⋅∂z∂b2(w∗xb−y)∗1 \begin{align} \frac{\partial l}{\partial w} \frac{\partial l}{\partial z} \cdot \frac{\partial z}{\partial w} 2(w * x b - y) * x \\ \\ \frac{\partial l}{\partial b} \frac{\partial l}{\partial z} \cdot \frac{\partial z}{\partial b} 2(w * x b - y) * 1 \end{align}​∂w∂l​∂z∂l​⋅∂w∂z​2(w∗xb−y)∗x∂b∂l​∂z∂l​⋅∂b∂z​2(w∗xb−y)∗1​​其中,∂l∂z2(z−y)\frac{\partial l}{\partial z} 2(z - y)∂z∂l​2(z−y),被称为顶层误差信号。并在后续计算当中被传递到∂l∂w\frac{\partial l}{\partial w}∂w∂l​和∂l∂b\frac{\partial l}{\partial b}∂b∂l​之中。如定义初始常量x5,y0,w1,b3x5,y0,w1,b3x5,y0,w1,b3,可以得到其计算图的自顶向下的拓扑结构loss (grad_fnMseLossBackward0) ← 均方误差结点 (关联了z和y以及MSE的求导规则) └── z (grad_fnAddBackward0) ← 加法节点 (关联了b和w*x以及加法求导规则) ├── (左) MulBackward0 ← 乘法节点 (关联了w和x以及乘法求导规则) │ ├── w (叶子, AccumulateGrad) │ └── x (常量, 不追踪) └── (右) b (叶子, AccumulateGrad)其程序及pytorch的计算过程如下# 当X为标量时梯度的计算defscaler_grad_compute():xtorch.tensor(5)# 目标值: labelytorch.tensor(0.)# 设置要更新的权重和偏置的初始值wtorch.tensor(1,requires_gradTrue,dtypetorch.float32)btorch.tensor(3,requires_gradTrue,dtypetorch.float32)# 设置网络的输出值zw*xb# 设置损失函数,并进行损失的计算losstorch.nn.MSELoss()lossloss(z,y)# 自动微分loss.backward()# 打印 w,b 变量的梯度# backward 函数计算的梯度值会存储在张量的 grad 变量中print(fw-{w.grad})print(fb-{b.grad})scaler_grad_compute()计算顶层误差:∂l∂z2(z−y)2∗(wxb−y)16\frac{\partial l}{\partial z} 2(z - y) 2 * (wx b - y) 16∂z∂l​2(z−y)2∗(wxb−y)16,并传递到AddBackward0(加法)节点中,此时loss、y、MSE被“移出”计算图。AddBackward0把误差信号复制成两份因为加法节点的梯度分流(左) 乘法结点根据乘法求导法则计算出www的梯度∂l∂w∂l∂z⋅∂z∂w16∗580\frac{\partial l}{\partial w} \frac{\partial l}{\partial z} \cdot \frac{\partial z}{\partial w} 16 * 5 80∂w∂l​∂z∂l​⋅∂w∂z​16∗580,并传递给其叶子节点(右) 计算bbb的梯度∂l∂b∂l∂z⋅∂z∂b16∗116\frac{\partial l}{\partial b} \frac{\partial l}{\partial z} \cdot \frac{\partial z}{\partial b} 16 * 1 16∂b∂l​∂z∂l​⋅∂b∂z​16∗116,由于其requires_gradTrue且为叶子节点(Leaf Tensor),其梯度都会被保存在内存中 b.grad16。此时、*、x(requires_gradFalse)被“移出”计算图,而w节点接收上层的梯度并保存 w.grad 80。ad16。此时、*、x(requires_gradFalse)被“移出”计算图,而w节点接收上层的梯度并保存 w.grad 80。这种通过计算图拓扑的方法简化了计算梯度的复杂度。这就是反向传播算法(Back Propagation)的核心思想。

相关新闻

亚马逊工具飞鱼数据参谋折扣码是什么?飞鱼数据参谋是什么?

亚马逊工具飞鱼数据参谋折扣码是什么?飞鱼数据参谋是什么?

亚马逊工具飞鱼数据参谋折扣码是什么?飞鱼数据参谋是什么?在亚马逊百万级卖家的激烈竞争中,选品如同在迷雾中探路 —— 既需要精准捕捉市场需求,又要避开红海陷阱。传统选品工具往往依赖估算数据或滞后信息,而飞鱼数据…

2026/9/24 14:28:51 阅读更多 →
Skia SkSL 与 Runtime Effects 完整实战指南:从着色语言语法到色彩管理、预乘 Alpha 与代码最小化

Skia SkSL 与 Runtime Effects 完整实战指南:从着色语言语法到色彩管理、预乘 Alpha 与代码最小化

图形学 【免费下载链接】skia Skia is a complete 2D graphic library for drawing Text, Geometries, and Images. See documentation for contribution instructions. 项目地址: https://gitcode.com/gh_mirrors/ski/skia 点击查看 免费下载 SkSL(Ski…

2026/9/24 14:28:51 阅读更多 →
WinUtil:装软件做优化修系统,一个窗口搞定

WinUtil:装软件做优化修系统,一个窗口搞定

WinUtil:装软件做优化修系统,一个窗口搞定 【免费下载链接】winutil Chris Titus Techs Windows Utility - Install Programs, Tweaks, Fixes, and Updates 项目地址: https://gitcode.com/GitHub_Trending/wi/winutil 新机装系统那天&#xff0c…

2026/9/24 14:28:51 阅读更多 →

最新新闻

Python+OpenCV答题卡识别实战:透视校正与填涂判定

Python+OpenCV答题卡识别实战:透视校正与填涂判定

简介:这是一套面向计算机相关专业毕业设计场景的智能答题卡识别系统完整资料,基于Python与OpenCV实现,适合正在准备毕设或需要图像识别项目实战练习的学习者。项目经导师指导并通过评审,源码均经本地编译调试,可正常运…

2026/9/24 19:29:01 阅读更多 →
IDEA关闭标签页快捷键修改指南:彻底搞定Keymap自定义

IDEA关闭标签页快捷键修改指南:彻底搞定Keymap自定义

上周有个从 VSCode 跳槽过来的同事在工位喊了一嗓子:"IDEA 里关闭当前标签页怎么是 CtrlF4?这也太反人类了吧,我快被这个快捷键搞疯了。"我当时正准备回话,旁边另一个做 Java 开发很久的同事也凑过来:"…

2026/9/24 19:29:00 阅读更多 →
19种器官细胞图像识别:PyTorch医学图像分类实战指南

19种器官细胞图像识别:PyTorch医学图像分类实战指南

简介:面向医学图像分类任务的中型数据集,整合19类器官细胞图像,覆盖肾上腺、子宫、甲状腺、食道等类别,训练集2100张、测试集500张,已按文件夹划分,可直接用于CNN分类网络或基于yolov5的分类项目。包体共20…

2026/9/24 19:29:00 阅读更多 →
键盘检测工具怎么用?一篇讲清按键失灵排查与实测方法

键盘检测工具怎么用?一篇讲清按键失灵排查与实测方法

键盘检测工具这类软件,很多人只在键盘到手时打开一次,随手按两下就关了。我以前也这样,直到被一把“偶发失灵”的键盘折磨了半个月,才真正意识到一个不到1MB的小工具在排查故障时有多能打。这篇文章就把我实际测试的过程、踩过的坑…

2026/9/24 19:29:00 阅读更多 →
2026年自助建站系统怎么选?主流方案对比与实操避坑指南

2026年自助建站系统怎么选?主流方案对比与实操避坑指南

做网站这件事,这些年被自助建站系统彻底改造成了“流水线作业”。哪怕你完全不懂代码,只要会打字、会传图片,几个小时就能拼出一个像模像样的站点。到了2026年,这个赛道的产品已经不是简单拼模板、拼功能了,而是在拼AI…

2026/9/24 19:29:00 阅读更多 →
K8s混部技术实战:从原理到落地,提升集群资源利用率

K8s混部技术实战:从原理到落地,提升集群资源利用率

干了这么多年K8s集群运维,我见过太多资源利用率表上写着CPU平均使用率不到20%的集群了。今天想认真聊聊混部技术——就是把在线业务和离线任务塞到同一批物理节点上,用资源调度优化手段把整体资源利用率拉上去的做法。这篇文章会从原理讲到实操&#xff…

2026/9/24 19:28:00 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →