[预备知识]3. 自动求导机制
自动求导机制
本章节介绍 PyTorch
的自动求导机制,包括计算图、反向传播和梯度计算的原理及实现。
1. 计算图原理
计算图是深度学习框架中的一个核心概念,它描述了计算过程中各个操作之间的依赖关系。
计算图由节点(节点)和边(边)组成,节点表示操作(如加减乘除),边表示数据的流动。
1.1 动态计算图
PyTorch使用动态计算图,其特点:
- 即时构建:随着代码执行动态创建
- 自动微分:基于链式法则自动计算梯度
- 节点组成:
- 叶子节点:用户创建的张量(
requires_grad=True
) - 中间节点:操作结果张量
- 边:张量间的依赖关系
- 叶子节点:用户创建的张量(
import torch# 创建叶子节点(数学符号:x, y ∈ ℝ)
x = torch.tensor(2.0, requires_grad=True) # dx/dx = 1
y = torch.tensor(3.0, requires_grad=True) # dy/dy = 1# 构建计算图(数学表达式:z = x·y, w = z + x)
z = x * y # 中间节点 z = 6.0
w = z + x # 中间节点 w = 8.0print("计算图节点元数据:")
print(f"w.grad_fn: {w.grad_fn}") # AddBackward
print(f"z.grad_fn: {z.grad_fn}") # MulBackward
print(f"x.is_leaf: {x.is_leaf}") # True
1.2 计算图可视化
使用torchviz
生成计算图(需先安装):
pip install torchviz graphviz
from torchviz import make_dot# 可视化前向传播计算图
make_dot(w, params={'x': x, 'y': y}).render("compute_graph", format="png")
说明:图中展示了从叶子节点 x, y 到最终输出 w 的计算路径
2. 反向传播数学原理
2.1 链式法则
对于计算图输出 L L L ,其关于输入变量 x x x 的梯度计算遵循链式法则:
∂ L ∂ x = ∑ p ∈ paths ∏ ( i , j ) ∈ p ∂ j ∂ i \frac{\partial L}{\partial x} = \sum_{p \in \text{paths}} \prod_{(i,j) \in p} \frac{\partial j}{\partial i} ∂x∂L=p∈paths∑(i,j)∈p∏∂i∂j
示例计算:
给定计算流程:
z = x 2 y = z 3 L = ln ( y ) \begin{aligned} z &= x^2 \\ y &= z^3 \\ L &= \ln(y) \end{aligned} zyL=x2=z3=ln(y)
梯度计算:
∂ L ∂ x = 1 y ⋅ 3 z 2 ⋅ 2 x = 6 x 5 x 6 = 6 x \frac{\partial L}{\partial x} = \frac{1}{y} \cdot 3z^2 \cdot 2x = \frac{6x^5}{x^6} = \frac{6}{x} ∂x∂L=y1⋅3z2⋅2x=x66x5=x6
x = torch.tensor(2.0, requires_grad=True)
z = x**2 # z=4.0
y = z**3 # y=64.0
L = torch.log(y) # L=4.1589L.backward()
print(f"理论值 6/x: {6/x.item():.3f}")
print(f"实际梯度: {x.grad.item():.3f}") # 6/2=3.0
2.2 多变量反向传播
对于多变量系统,PyTorch自动计算雅可比矩阵的乘积:
# 创建多变量计算图
x = torch.tensor([1., 2.], requires_grad=True)
y = torch.tensor([3., 4.], requires_grad=True)
z = x**2 + y**3 # z = [1+27=28, 4+64=68]# 反向传播需指定梯度权重(假设L = sum(z))
z.sum().backward() print(f"x.grad: {x.grad}") # [2*1=2, 2*2=4]
print(f"y.grad: {y.grad}") # [3*3²=27, 3*4²=48]
3. 梯度管理
3.1 梯度累积与清零
PyTorch梯度会累积在.grad
属性中,训练时需手动清零:
w = torch.randn(3, requires_grad=True)for _ in range(3):y = w.sum() # 前向传播y.backward() # 反向传播print(f"当前梯度: {w.grad}")w.grad.zero_() # 梯度清零print(f"清零后的梯度: {w.grad}")
3.2 梯度控制方法
方法 | 作用 | 使用场景 |
---|---|---|
torch.no_grad() | 禁用梯度计算 | 模型推理、参数更新 |
detach() | 创建无梯度关联的新张量 | 冻结部分网络 |
retain_graph=True | 保留计算图以供多次反向传播 | 复杂梯度计算 |
# 对比不同控制方法
x = torch.tensor(2.0, requires_grad=True)with torch.no_grad(): # 上下文内不追踪梯度y = x * 3 # y.requires_grad = Falsez = x.detach() # 创建与x值相同但无梯度的张量
z.requires_grad = True # 可重新启用梯度追踪
4. 实际应用
4.1 自定义自动微分
实现简单函数的自定义梯度计算:
class MyReLU(torch.autograd.Function):@staticmethoddef forward(ctx, input):ctx.save_for_backward(input)return input.clamp(min=0)@staticmethoddef backward(ctx, grad_output):input, = ctx.saved_tensorsgrad_input = grad_output.clone()grad_input[input < 0] = 0 # ReLU的导数为分段函数return grad_input# 使用自定义函数
x = torch.randn(4, requires_grad=True)
y = MyReLU.apply(x)
y.sum().backward()
print(f"输入梯度:\n{x.grad}")
4.2 梯度裁剪实践
防止梯度爆炸的两种方法:
# 方法1:按值裁剪
utils.clip_grad_value_(model.parameters(), clip_value=0.5)# 方法2:按范数裁剪
utils.clip_grad_norm_(model.parameters(), max_norm=1.0)# 梯度监控
total_norm = 0
for p in model.parameters():param_norm = p.grad.data.norm(2)total_norm += param_norm.item() ** 2
total_norm = total_norm ** 0.5
print(f"梯度范数: {total_norm:.2f}")
5. 神经网络训练最佳实践
5.1 标准训练流程
model = nn.Sequential(nn.Linear(2, 4),nn.ReLU(),nn.Linear(4, 1),nn.Sigmoid()
)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)for epoch in range(100):# 训练模式model.train() optimizer.zero_grad()outputs = model(X_train)loss = F.binary_cross_entropy(outputs, y_train)loss.backward()# 梯度裁剪torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)optimizer.step()# 评估模式model.eval()with torch.no_grad():val_loss = F.binary_cross_entropy(model(X_val), y_val)
5.2 梯度检查技巧
# 检查梯度是否存在
for name, param in model.named_parameters():if param.grad is None:print(f"警告: 参数 {name} 无梯度!")# 可视化梯度分布
import matplotlib.pyplot as plt
gradients = [p.grad.abs().mean() for p in model.parameters()]
plt.bar(range(len(gradients)), gradients)
plt.title("Average Gradient Magnitude")
plt.show()
通过深入理解计算图原理、链式法则、梯度管理和实际应用,我们可以更好地利用 PyTorch
的自动求导机制来构建和训练神经网络模型。
相关文章:
[预备知识]3. 自动求导机制
自动求导机制 本章节介绍 PyTorch 的自动求导机制,包括计算图、反向传播和梯度计算的原理及实现。 1. 计算图原理 计算图是深度学习框架中的一个核心概念,它描述了计算过程中各个操作之间的依赖关系。 计算图由节点(节点)和边…...
蓝桥杯中的知识点
总结: 这次考的并不理想 比赛前好多知识点遗漏 但到此为止已经结束了 mod 是 模运算(Modulo Operation)的缩写,表示求两个数相除后的 余数 10mod31 (a % b) (7%21) 1e9代表1乘以10的9次方,…...
2023蓝帽杯初赛内存取证-6
这里需要用到pslist模块,结合一下查找关键词: vol.py -f memdump.mem --profile Win7SP1x64 pslist | grep -E "VeraCrypt" 将2023-06-20 16:47:41 UTC0000世界标准时间转换成北京时间: 答案:2023-06-21 00:47:41...
《MySQL 核心技能:SQL 查询与数据库概述》
MySQL 核心技能:SQL 查询与数据库概述 一、数据库概述1. 什么是数据库2.为什么要使用数据库3.数据库的相关概念3.1 数据库(DB):数据的“仓库”3.2 数据库管理系统(DBMS):数据库的“管家”3.3 SQ…...
三维几何变换
一、学习目的 了解几何变换的意义 掌握三维基本几何变换的算法 二、学习内容 在本次试验中,我们实现透视投影和三维几何变换。我们首先定义一个立方体作为我们要进行变换的三维物体。 三、具体代码 (1)算法实现 // 获取Canvas元素 con…...
TDengine 查询引擎设计
简介 TDengine 作为一个高性能的时序大数据平台,其查询与计算功能是核心组件之一。该平台提供了丰富的查询处理功能,不仅包括常规的聚合查询,还涵盖了时序数据的窗口查询、统计聚合等高级功能。这些查询计算任务需要 taosc、vnode、qnode 和…...
15.第二阶段x64游戏实战-分析怪物血量(遍历周围)
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:14.第二阶段x64游戏实战-分析人物的名字 如果想实现自动打怪,那肯定…...
vue浅试(1)
先安装了vue nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置) 稍微了解了一下cursor cursor的使用 请出我们的老师: 提示词: 你是我的好朋友也是一个前端专家,你能向我传授前端知识,…...
VSCode连服务器一直处于Downloading
使用vscode的remote插件连接远程服务器时,部分服务器可能会出现一直处于Downloading VS Code Server的情况 早期的一些教程,如https://blog.csdn.net/chongbin007/article/details/126958840, https://zhuanlan.zhihu.com/p/671718415给出的方法是手动下…...
QGIS实用功能:加载天地图与下载指定区域遥感影像
QGIS 实用功能:加载天地图与下载指定区域遥感影像 目录标题 QGIS 实用功能:加载天地图与下载指定区域遥感影像一、安装天地图插件,开启地图加载之旅二、获取天地图密钥,获取使用权限三、加载天地图服务,查看地图数据四…...
mybatis-plus开发orm
1、mybatis 使用mybatis-generator自动生成代码 这个也是有系统在使用 2、mybatis-plus开发orm--有的系统在使用 MybatisPlus超详细讲解_mybatis-plus-CSDN博客...
ubuntu 交叉编译 macOS 库, 使用 osxcross 搭建 docker 编译 OS X 库
1. ubuntu 交叉编译 macOS 库, 使用 osxcross 搭建 docker 编译 OS X 库 1. ubuntu 交叉编译 macOS 库, 使用 osxcross 搭建 docker 编译 OS X 库 1.1. 安装依赖1.2. 安装 osxcross 及 macOS SDK 1.2.1. 可能错误 1.3. 编译 cmake 类工程1.4. 编译 configure 类工程1.5. 单文件…...
抱佛脚之学SSM四
MyBatis基础 一个接口对应一个映射文件 在映射文件中指定对应接口指定的位置 sql语句中id对应方法名par..参数的类型,resul..返回值的类型 WEB-INF下的文件是受保护的,不能直接访问,只能通过请求转发的方式访问 SqlSessionFactory࿱…...
2.5 函数的拓展
1.匿名函数(简化代码) python中没有这个概念,通过lambda关键字可以简化函数的代码写法 2.lambda表达式 arguments lambda 参数列表 : 函数体 print(aarguments(参数)) #测试lambda #原本代码def sum1(x,y):return xyprint(sum1…...
深度学习--卷积神经网络数据增强
文章目录 一、数据增强1、什么是数据增强?2、为什么需要数据增强? 二、常见的数据增强方法1、图像旋转2、图像翻转3、图像缩放4、图像平移5、图像剪切6、图像亮度、对比度、饱和度调整7、噪声添加8、随机扰动 三、代码实现1、预处理2、使用数据增强增加训…...
Buffer of Thoughts: Thought-Augmented Reasoningwith Large Language Models
CODE: NeurIPS 2024 https://github.com/YangLing0818/buffer-of-thought-llm Abstract 我们介绍了思想缓冲(BoT),一种新颖而通用的思想增强推理方法,用于提高大型语言模型(大型语言模型)的准确性、效率和鲁棒性。具体来说,我们提出了元缓冲…...
mybatisX动态切换数据源直接执行传入sql
代码 mapper接口中方法定义如下,其中#dbName代表传入的数据源变量(取值可参考application.properties中spring.datasource.dynamic.datasource指定的数据源) DS("#dbName")List<LinkedHashMap<String, Object>> execu…...
N8N MACOS本地部署流程避坑指南
最近n8n很火,就想在本地部署一个,尝尝鲜,看说明n8n是开源软件,可以在本地部署,于是就尝试部署了下,大概用了1个多小时,把相关的过程记录一下: 1、基础软件包 abcXu-MacBook-m2-Air…...
搜索策略的基本概念
搜索是人工智能中的一个基本问题,是推理不可分割的一部分,它直接关系到智能系统的性能与运行效率,因而尼尔逊把它列为人工智能研究中的四个核心问题之一。在过去40多年中,人工智能界已对搜索技术开展了大量研究,取得了…...
云原生--CNCF-1-云原生计算基金会介绍(云原生生态的发展目标和未来)
1、CNCF定义与背景 云原生计算基金会(Cloud Native Computing Foundation,CNCF)是由Linux基金会于2015年12月发起成立的非营利组织,旨在推动云原生技术的标准化、开源生态建设和行业协作。其核心目标是通过开源项目和社区协作&am…...
【Chrome插件开发】某视频网站的m4s视频/音频下载方案,及其Chrome插件实现-v250415
文章目录 引言效果v1.0.0 TODO让AI写初稿两条路:在content.js里,还是popup.js里发请求?World in content.js新建项目如何打包background.js:在鼠标右键菜单添加一个选项,点击后通知content.js第一次创建弹窗eslint 9如…...
Nginx:前后端分离配置(静态资源+反向代理)
Nginx 前后端分离配置 [!IMPORTANT] 前端静态资源位置:/www/wwwroot/dist后端部署端口:9999 server {listen 80;server_name www.0ll1.com;location / {root /www/wwwroot/dist;try_files $uri $uri/ /index.html;index index.html index.htm;…...
go中map和slice非线程安全
参考视频:百度 Go二面: map与切片哪个是线程安全的_哔哩哔哩_bilibili go中的map和slice是非线程安全类型的。 非线程安全类型的表现为: 并发调用时会报错并发调用后结果不可预测 go中三种线程安全类型: channel,底…...
第T9周:猫狗识别2
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 第T9周:猫狗识别2 tf.config.list_physical_devices(“GPU”),用于检测当前系统是否有可用的 GPU,并将结果存入 gpus 变量…...
AlmaLinux 9.5 调整home和根分区大小
在使用linux的过程中, 有时会出现因为安装系统时分区不当导致有的分区空间不足,而有的分区空间过剩的情况.下面本文将讲述解决linux系统AlmaLinux 下调整home和根分区大小的方法。 1、查看现有分区 df -Th2、备份/home中的用户数据 mkdir /backup && mv /home/* /ba…...
[Vue3]绑定props 默认值
前言 使用TS、Vue3组织组件中传入props的通用方式 步骤 步骤1:使用 defineProps 定义 Props 使用interface定义props中各项的类型: // 组件List.vue// 定义 Props 类型和接口 interface ListItem {name: string;time: string;content: {status: numbe…...
【android bluetooth 协议分析 11】【AVDTP详解 1】【宏观感受一下avdtp是个啥东东】
我们先从宏观感受一下avdtp协议是个啥东东, 和 a2dp 是啥关系。 在蓝牙协议中的层次。以及他是如何和 例如l2cap 、sdp、a2dp 配合的。先从宏观把握,我们在逐步展开对 avdtp 的源码分析。 我们先从生活中的小例子感性的认识一下 avdtp 在 蓝牙协议中的作…...
【MATLAB第116期】基于MATLAB的NBRO-XGBoost的SHAP可解释回归模型(敏感性分析方法)
【MATLAB第116期】基于MATLAB的NBRO-XGBoost的SHAP可解释回归模型(敏感性分析方法) 引言 该文章实现了一个可解释的回归模型,使用NBRO-XGBoost(方法可以替换,但是需要有一定的编程基础)来预测特征输出。该…...
【Spring】静态代理、动态代理
Java中,代理模式是一种设计模式,用于通过代理对象控制对目标对象的访问。代理可以分为静态代理和动态代理,其中动态代理又包括JDK动态代理和CGLIB动态代理。这些机制在Spring框架中广泛用于AOP(面向切面编程)、事务管理…...
关于el-table可展开行实现懒加载的方案
场景: 一个流程记录,以表格的形式展示。点击展开表格的某一行,可以看到该流程的详细记录。但是,详细记录数据独立于表格数据,在还没有展开这一行的时候就不去请求这一行的详细数据,以便加快网络请求的速度。…...
AutoJs相关学习
一、控件点击、模拟点击 如果一个控件的 clickablefalse,但它的父级控件是 clickabletrue,我们可以通过 向上查找父级控件 的方式找到可点击的父级,然后执行点击操作。以下是几种实现方法: 方法 1:使用 parent() 查找可…...
ISO15189认证有什么要求?ISO15189认证流程
ISO 15189 认证要求及流程详解 ISO 15189 是国际标准化组织(ISO)针对 医学实验室质量和能力 的认证标准,适用于医院检验科、第三方医学实验室、血站等机构。该认证确保实验室的技术能力和管理体系符合国际标准,提高检测结果的准确…...
【每天一个知识点】大模型的幻觉问题
“大模型的幻觉问题”是指大语言模型(如GPT系列、BERT衍生模型等)在生成内容时,产生不符合事实或逻辑的虚假信息,即所谓的“幻觉”(hallucination)。这在诸如问答、摘要、翻译、代码生成等任务中尤其常见。…...
光谱相机在肤质检测中的应用
光谱相机在肤质检测中具有独特优势,能够通过多波段光谱分析皮肤深层成分及生理状态,实现非侵入式、高精度、多维度的皮肤健康评估。以下是其核心应用与技术细节: 一、工作原理 光谱反射与吸收特性: 血红蛋白&a…...
【c语言】指针和数组笔试题解析
一维数组: //数组名a如果既不单独放在sizeof()中,也不与&结合,那么就表示数组首元素的大小 //a一般表示数组首元素地址,只有两种情况表示整个数组,sizeof(arr)表示整个数组的大小,&arr表示数组的地址 int a[]…...
【Spring】AutoConfigureOrder与Order注解的区别与使用方式
@AutoConfigureOrder与@Order都是Spring框架中用于控制组件优先级的注解,但它们有不同的应用场景和作用范围。 一、基本区别 1. 包和位置 @Order: 位于org.springframework.core.annotation包,是Spring核心包的一部分@AutoConfigureOrder: 位于org.springframework.boot.au…...
基于SpringBoot的校园赛事直播管理系统-项目分享
基于SpringBoot的校园赛事直播管理系统-项目分享 项目介绍项目摘要管理员功能图用户功能图项目预览首页总览个人中心礼物管理主播管理 最后 项目介绍 使用者:管理员、用户 开发技术:MySQLJavaSpringBootVue 项目摘要 随着互联网和移动技术的持续进步&…...
科研小白可以做哪些准备
断更五个月啦,这段时间一直忙于自己的研究课题。今天给大家分享我在这段时间对科研的一些认识和积累的经验,希望对大家有所帮助。 一、学术研究的认识与思考 什么是科研 什么是好的研究 首先,就是要回答“什么是科研?什么是好研…...
2025.4.22学习日记 JavaScript的常用事件
在 JavaScript 里,事件是在文档或者浏览器窗口中发生的特定交互瞬间,例如点击按钮、页面加载完成等等。下面是一些常用的事件以及案例: 1. click 事件 当用户点击元素时触发 const button document.createElement(button); button.textCo…...
TikTok X-Gnarly纯算分享
TK核心签名校验:X-Bougs 比较简单 X-Gnarly已经替代了_signature参数(不好校验数据) 主要围绕query body ua进行加密验证 伴随着时间戳 浏览器指纹 随机值 特征值 秘钥转换 自写算法 魔改base64编码 与X-bougs 长a-Bougs流程一致。 视频…...
CentOS7 环境配置
CentOS 7 环境配置 我的基础环境: Windows11 CentOS版本:CentOS Linux release 7.7.1908 (Core) Vmware版本:VMware Workstation 17 Pro 17.5.0 build-22583795 使用工具:MobaXterm 注意: 所有有关防火墙的操作都可以…...
缓存,内存,本地缓存等辨析
快速辨析缓存,内存,本地缓存,memcache,redis等 (个人临时记录) 缓存 泛指所有用于暂存数据以提升访问速度的技术,包括本地缓存、分布式缓存、CPU缓存等。核心目标是减少对慢速存储(…...
C++模板学习(进阶)
目录 一.非类型模板参数 二.模板的特化 一).函数模板特化 二).类模板特化 1.全特化 2.偏特化 三.模板分离编译 一).什么是分离编译 1. 问题描述 2. 模板的实例化机制 3. 分离编译的困境 二).解决方法 1. 头文件包含…...
【Git】fork 和 branch 的区别
在 Git 中,“fork” 和 “branch” 是两个不同的概念,它们用于不同的场景并且服务于不同的目的。理解这两者的区别对于有效地使用 Git 进行版本控制非常重要。 1. Fork(分叉) 定义 Fork 是指在 GitHub、GitLab 等代码托管平台上…...
STM32单片机入门学习——第45节: [13-2] 修改频主睡眠模式停止模式待机模式
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.22 STM32开发板学习——第45节: [13-2] 修改主频&睡眠模式&停止模式&待…...
Java中常见API的分类概述及示例
1. 集合框架(java.util 包) 核心接口与实现类 接口实现类特点示例代码ListArrayList, LinkedList有序、可重复List<String> list new ArrayList<>(); list.add("Java");SetHashSet, TreeSet无序、唯一Set<Integer> set …...
IOT项目——物联网 GPS
GeoLinker - 物联网 GPS 可视化工具 项目来源制作引导 项目来源 [视频链接] https://youtu.be/vi_cIuxDpcA?sigMaOKv681bAirQF8 想要在任何地方追踪任何东西吗?在本视频中,我们将向您展示如何使用 ESP32 和 Neo-6M GPS 模块构建 GPS 跟踪器——这是一…...
开源状态机引擎,在实战中可以放心使用
### Squirrel-Foundation 状态机开源项目介绍 **Squirrel-Foundation** 是一个轻量级、灵活、可扩展、易于使用且类型安全的 Java 状态机实现,适用于企业级应用。它提供了多种方式来定义状态机,包括注解声明和 Fluent API,并且支持状态转换、…...
TockOS,一种新安全软件架构的RTOS介绍
文章目录 1. TockOS介绍详细总结 2. TockOS开源项目的目录结构3. 胶囊(Capsules)胶囊的本质胶囊的特点胶囊的应用场景 4. 胶囊的实现模块化设计安全隔离事件驱动可复用性 1. TockOS介绍 Tock 是一款面向 Cortex-M 和 RISC-V 微控制器的安全嵌入式操作系…...
AGI大模型(12):向量检索之关键字搜索
1 检索的方式有那些 列举两种: 关键字搜索:通过用户输入的关键字来查找文本数据。语义搜索:不仅考虑关键词的匹配,还考虑词汇之间的语义关系,以提供更准确的搜索结果。2 关键字搜索 先看一个最基础的实现 安装模块 pip install redis 不会redis的去看我的redis专题 首…...