Pytorch学习笔记(一)——自动求导和叶子节点

article/2025/8/26 15:19:47

一、什么是叶子节点

PyTorch中的张量tensor有一个属性是is_leaf,当is_leaf为True时,改tensor是叶子张量,也叫叶子节点。

二、叶子节点的作用

PyTorch有自动求导的功能,
当requires_grad=True时,PyTorch会自动记录运算过程,缓存运算中的中间参数,为自动求导做准备。
但是只有is_leaf=True和requires_grad=True同时满足时,才可以获得该节点的导数值。

三、什么样的节点为叶子节点

按照惯例:
1、所有requires_grad为False的张量(Tensor) 都为叶张量( leaf Tensor);
2、requires_grad为True的张量(Tensor),如果他们是由用户创建的,则它们是叶张量(leaf Tensor)。这意味着它们不是运算的结果,因此grad_fn为None。

>>> a = torch.rand(10, requires_grad=True)
>>> a.is_leaf
True
#a was created by user
>>> b = torch.rand(10, requires_grad=False)
>>> b.is_leaf
True
>>> c = torch.rand(10, requires_grad=True) + 2
>>> c.is_leaf
False
# c was created by the addition operation

四、自动求导的机理

每个方框代表一个tensor,其中列出一些属性(还有其他很多属性):

  • .data: 存了tensor的data,即保存着张量的数值;
  • .grad: 当计算梯度的时候,会在此保存该张量对应情况下的梯度值;
  • .grad_fn:指向用于backward的函数的节点;
  • .is_leaf 判断是否是叶节点;
  • .requires_grad:如果是设为True,那么在做backward时候将作为反馈的一部分参与backwards运算,如果为False则不参加backwards运算。

例一:

a = torch.tensor(2.0)
b = torch.tensor(3.0)
c = a*b 

因为a,b的requires_grad都是False,所以没有记录其运算过程,也不需要求导数。
在这里插入图片描述
例二:

a = torch.tensor(2.0,requires_grad = True)
b = torch.tensor(3.0)
c = a*b 
c.backward()

1、tensor a的 requires_grad 为True,因为输入自变量的属性为有一个为True,所以输出变量的属性自动改变成 requires_grad 为True。
这说明只要自变量中有一个requires_grad 为True, 进一步通过运算生成的变量也为True。因为 c 的 requires_grad 为True, c 又是运算产生的,所以其不是叶子节点。
2、当我们调用tensor的乘法函数时,同时调用了隐性变量 ctx (context)变量的save_for_backward(),此函数保存了forward运算时的一些参数,ctx起到了缓存相关参数的作用,在做 backfard 运算时, ctx中的值将会被对应的函数读取。
3、c的grad_fn中存了做backwards时候对应的函数— “MulBackward”,这个函数是PyTorch自动生成的。
4、当进行 c 的 backwards 的时候,其实也就相当于求解 c = a*b 这个函数分别对 a 与 b 做的偏导. 那么理应对应两组backwards的函数,这两组backwards的函数打包存在 MulBackward 的 next_functions 中. nex_function为一个 tuple list, AccumulateGrad 将会把相应得到的结果送到 a.grad中.
5、于是在进行 c.backward() 后, c进行关于a以及关于b的求导,由于b设requires_grad为False,因此b项不参与backwards运算(自然的,next_function中list的第二个tuple即为None),c关于a的梯度为3,因此3将传递给AccumulaGrad进一步传给a.grad 因此 a.grad 的结果为3。
在这里插入图片描述
可以看出,其实pytorch在定义这些变量的运算函数时,其实也定义了函数对应的backwards的函数.如果想使用自定义的函数,那么自己也必须要定义backwards函数.

例三:

a = torch.tensor(2.0,requires_grad = True)
b = torch.tensor(3.0,requires_grad = True)
c = a*b 
d = torch.tensor(4.0,requires_grad = True)
e = c*d
e.backward()

1、e的grad_fn 指向节点 MulBackward, c的grad_fn指向另一个节点 MulBackward
2、c 为中间值is_leaf 为False,因此并不包含 grad值,在backward计算中,并不需要再重新获取c.grad的值, backward的运算直接走相应的backward node 即可
3、MulBackward 从 ctx.saved_tensor中调用有用信息, e= c+d中 e关于c的梯度通过MulBackward 获取得4. 根据链式规则, 4再和上一阶段的 c关于 a和c关于b的两个梯度值3和2相乘,最终得到了相应的值12 和8
4、a.grad 中存入12, b.grad中存入 8
在这里插入图片描述
本文为学习PyTorch时的学习笔记,主要参考博文https://blog.csdn.net/wangweiwells/article/details/101174330和https://blog.csdn.net/wangweiwells/article/details/101223420


http://chatgpt.dhexx.cn/article/ZxgANqVL.shtml

相关文章

数据结构-树:根节点、子节点、叶子节点是什么?

前言:这个属于数据结构:树。 下面给个例子图解释(根节点、子节点、叶子节点)。 上图数字 1、3、7是叶子节点;(因为他们下面没有分叉出子节点,所以称为:叶子节点)【度为0】…

数据结构 - 树

树 (1)相关概念 兄弟节点:节点的父节点是同一个节点,所以它们之间互称为兄弟节点。 根节点:没有父节点的节点叫作根节点 叶子节点:没有子节点的节点叫作叶子节点或者叶节点。 节点的高度:节…

根节点、子节点、叶子节点是什么?

前言:这个属于数据结构:树。 下面给个例子图解释(根节点、子节点、叶子节点)。 上图数字 1、3、7是叶子节点;(因为他们下面没有分叉出子节点,所以称为:叶子节点)【度为0】…

弱网、2G、3G、4G测试

1.各项指标 教程指引:弱网测试教程 2.概念介绍 Bandwidth(带宽)、Utilistation(利用百分比)、Round-trip(往返延迟)、MTU(最大传输单元) 3G:300k-2Mbps左…

简单实用Chrome 日常开发功能详解,帮助你上班摸鱼

chrome是目前开发过程中一骑绝尘的浏览器,占有绝对领导地位。其强大的功能和生态圈,让很多开发者爱不释手。但很多的开发者使用chrome还是停留在F12打开控制台查看log、检查元素或者debug打断点阶段,其实chrome的强大的功能远远超过我们的想象…

小米路由器3G如何解决USB3.0 5G WiFi速度慢的问题

经常玩电脑,希望家里有个轻 nas,小米路由器是一个不错的选择,tbw买了一个小米路由器3G看重的是快速的速度(usb3.0 5G Wifi),及小米的可拓展性,使用usb3.0的usb接口,且使用5gb网速&am…

浏览器通过f12来限制网速

浏览器可以使用F12开发者工具来模拟网速的快慢。 打开需要测试的网站,点击F12,再点击选项里的network-no throttling,展示的有几种,offline,快3g,慢3g,或者自定义 点击add可以自定义网速&#…

移动网速测试软件,网速测试大师APP

网速测试大师APP是一款专业的手机网络测试应用,支持一键测速,精准快速,还能全方位分析网速,Wifi和移动网络全检测,30秒测速当前网络状况,做随时随地的测速专家。 该软件整个测速过程精准又快速,…

android 显示网速,随着掌握联网状态 Android手机如何显示实时网速

很多时候手机信号栏明明显示正在联网而且图标也显示正在下载上传中,但就是打不开网页。实际上,此时可能正处于4G→3G切换状态而出现了短暂的断网。那么,如何才能准确掌握手机当前的联网状态呢? 答案很简单,就是通过手机…

Fiddler工具的弱网模拟2G/3G/4G

日常测试工作中,C端用户会因信号和设备网络原因,出现一些恶劣网络的状态,然后出现奇奇怪怪的丢包、重传、UI空白、UI绘制异常等问题,就需要测试人员去模拟这类弱网环境去重现用户反馈的问题,以方便开发同学解决和调优加…

网速测试大师的软件怎么回事,网速测试大师

手机网速测试大师是一款手机网络测试软件,通过手机网速测试大师你可以直接测试你手机的网络速度,无论是WIFI还是手机移动网络都可以检测,让你更加了解你的手机网络。 软件介绍 网速测试大师是一款热度仅次于Ookla Speedtest. net的网速测试工…

限制浏览器网速

需求:限制浏览器网速,拉长请求时间,方便验证请求loading状态是否添加成功。 ps:一般建议给弹窗/按钮增加loading状态,防止重复点击之后多次请求 解决方案:控制台(f12)-网络(Network) No throttling 无限制…

使用chrome进行慢网速测试

前言 在开发的时候,有这么一种情况,点击一个按钮调用一个接口生成数据,之后刷新页面,但是由于网络慢的原因,能够多次点击,但是自己的网络模拟不了很慢的情况,怎么办呢? 使用chrome…

Vue Chrome浏览器手动调节模拟网速

Chrome浏览器手动调节网速 1.首先打开chrome浏览器,按下键盘上的f12键,弹出开发者调试工具 2.点击network——>No throtting弹出选择项 3.选择需要模拟的选项就行了 Fast 3G:表示快的3g网速 Slow 3G:表示慢的3g网速 Offline…

3g显卡测试软件,3G网速测试细则

3G网速测试细则 3G网速测试细则 测试机型:小米手机2、小米手机2电信版、vivo X1st 测试机型 测试软件:speedtest 爱奇艺高清影视 测试软件 测试方法: ① 在同一时间段、同一地点使用Speedtest测试三台手机3G网络条件下的速度 ② 分别使用装有…

国内三大制式3G网络简介及比较

比比谁最快 随着中国电信近期3G网络试商用的开始,越来越多的用户开始关注国内3G网络上网速度,“传说”中的3G网络速度到底有多快呢?据最新的数据显示,中国电信的试商用测试信号可以达到近200KB/s的下载速度。这是怎样的一个概念&a…

python自动化介绍

首先我们得了解一下什么是自动化测试? Python自动化就是使用python语言来编写的脚本或者平台(自动化运维平台、自动化测试平台-->devops),实现公司中重复业务的自动化流程。大体的方向分为 python自动化测试 python自动化运维 …

【Python自动化测试32】App自动化环境搭建

文章目录 一、前言二、安装与环境搭建教学2.1 环境依赖2.2 appium程序安装2.3 appium-python-client2.4 模拟器安装2.5 java jdk安装2.6 Android SDK环境 一、前言 本文章主要讲解App自动化测试的环境搭建,在App自动化测试环境搭建中,有非常多的坑&#…

Python自动化--1.Python环境安装-linux

python自动化更贴近运维自动化 Python自动化–1.Python环境安装-linux Python自动化–2.Python变量 Python自动化–3.Python数据类型 Python自动化–4. python类型转换 Python自动化–5. if判断语句 Python自动化–6. 写一个python程序 Python自动化–7. 函数的定义和调…