autograd-自动求导系统

article/2025/10/8 6:23:23

torch.autograd

权值的更新需要求解梯度,pytorch提供了自动求导系统,我们只需要搭建前向传播计算图,由autograd的方法就可以得到所有张量的梯度。

其中最常用的方法是backward

torch.autograd.backward()

在这里插入图片描述
功能:自动求取各个节点的梯度

  • tensors: 用于求导的张量,如 loss
  • retain_graph :保存计算图(由于pytorch采用动态图机制,在每一次反向传播之后计算图都会被释放,如果后面还需要使用计算图,该参数需要为True)
  • create_graph:创建导数计算图,用于高阶求导
  • grad_tensors:多梯度权重(计算多个loss时,需要设置各个loss的权重)
回顾计算图与梯度求导

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200606143640632.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NhZ2FjaXR5XzExMjU=,size_16,color_FFFFFF,t_70 在这里插入图片描述
通过构建前向传播计算图和自动求导系统,对y执行backward方法,即可得到所有节点的梯度。

retain_graph举例:

w = torch.tensor([1.],requires_grad=True)
x = torch.tensor([2.],requires_grad=True)a = torch.add(w,x)
b = torch.add(w,1)
y = torch.mul(a,b)y.backward()
print(w.grad)

结果:

tensor([5.])

张量中的y.backward() 实际上调用了torch.autograd.backward()

假设还需要执行一次反向传播:如果直接在上述代码后面加上y.backward()则会报错,
因为计算图已经被释放。
解决方案:在上一次反向传播中保存计算图则可以解决上述问题,即retain_graph=True

y.backward(retain_graph=True)
print(w.grad) #tensor([5.])
y.backward()

grad_tensors举例:

w = torch.tensor([1.],requires_grad=True)
x = torch.tensor([2.],requires_grad=True)a = torch.add(w,x)
b = torch.add(w,1)y0 = torch.mul(a,b) # y0 = (x+w) * (w+1)  dy0/dw = 5
y1 = torch.add(a,b) # y1 = (x+w) + (w+1)  dy1/dw = 2loss = torch.cat([y0,y1],dim=0) # tensor([6., 5.])
# print(loss)
grad_tensors = torch.tensor([1.,2.]) # 多个梯度的权重loss.backward(gradient=grad_tensors) # gradient 传入torch.autograd.backward()中的grad_tensorsprint(w.grad) # dy0/dw * 1.+ dy1/dw * 2. = 9
tensor([9.])
torch.autograd.grad()

在这里插入图片描述
功能:求取梯度

  • outputs: 用于求导的张量,如 loss
  • inputs : 需要求梯度的张量
  • create_graph : 创建导数计算图,用于高阶求导
  • retain_graph : 保存计算图
  • grad_outputs:多梯度权重
x = torch.tensor([3.],requires_grad=True)
y = torch.pow(x,2) #y = x**2, 二阶导数是2# 只有在一阶导数中对导数创建计算图,才可以对导数求导
grad_1 = torch.autograd.grad(y,x,create_graph=True) # grad_1 = dy/dx =2x =2*3 =6
print(grad_1)# 元组grad_2 = torch.autograd.grad(grad_1[0],x)# grad_2 = d(dy/dx)/dx = 2
print(grad_2)

结果:

(tensor([6.], grad_fn=<MulBackward0>),)
(tensor([2.]),)
autograd小贴士:
  1. 梯度不自动清零
  2. 依赖于叶子结点的结点, requires_grad默认为True
  3. 叶子结点不可执行in-place
  1. 梯度在每次反向传播之后会叠加
w = torch.tensor([1.],requires_grad=True)
x = torch.tensor([2.],requires_grad=True)for i in range(4):a = torch.add(w,x)b = torch.add(w,1)y = torch.mul(a,b)y.backward()print(w.grad)

结果:

tensor([5.])
tensor([10.])
tensor([15.])
tensor([20.])

为了避免梯度叠加,需要在代码最后加上w.grad.zero_()(_下划线操作叫做原位操作
这样每一次计算完都清零,梯度不会叠加
结果:

tensor([5.])
tensor([5.])
tensor([5.])
tensor([5.])
  1. 依赖于叶子结点的结点, requires_grad默认为True
    在这里插入图片描述
w = torch.tensor([1.],requires_grad=True)
x = torch.tensor([2.],requires_grad=True)a = torch.add(w,x)b = torch.add(w,1)y = torch.mul(a,b)# 默认都是Trueprint(a.requires_grad,b.requires_grad,y.requires_grad)
  1. 叶子结点不可执行in-place
w = torch.tensor([1.],requires_grad=True)
x = torch.tensor([2.],requires_grad=True)a = torch.add(w,x)
b = torch.add(w,1)
y = torch.mul(a,b)w.add_(1)
y.backward()

运行会报错:

RuntimeError: a leaf Variable that requires grad has been used in an in-place operation.

什么是in-place operation

a = torch.ones((1,))
print(id(a),a)a = a + torch.ones((1,))
print(id(a),a)# 内存地址和上面的a不同

结果:开辟了新的内存地址,不是原位操作

1086097577608 tensor([1.])
1086068988888 tensor([2.])

若改为:

a += torch.ones((1,))
print(id(a),a)# 内存地址不变,也就是原位操作

结果:内存地址不变,也就是原位操作

596027098760 tensor([1.])
596027098760 tensor([2.])

可从计算图的梯度求解过程来理解:
求y对w的梯度,需要先求y对a的梯度,y对a求导得w+1,在反向传播时与叶子张量w有关,而在前向传播时会记录w的地址,在反向传播时,会根据记录的w的地址来得到w的值;如果在反向传播之前改变了w地址中的数据,那么梯度求解则会出错


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

相关文章

导数与微分 — 高等数学

文章目录 考点一&#xff1a;导数的定义函数在一点处的导数单侧导数&#xff08;1&#xff09;左导数&#xff08;2&#xff09;右导数 充要条件笔记 考点二&#xff1a;可导与连续的关系知识点笔记 考点三&#xff1a;导数的几何意义知识点切线方程、法线方程笔记 考点四&…

05 指数函数求导

2^x的求导 前面我们探索了一些常见函数的导数&#xff0c;但是指数函数是非常重要的一种类型。 1. 从几何上探索 设t为天数&#xff0c;P(t)为人口数量。离散的图 要想图像连续就得转成质量&#xff0c;所以P(t)换成M(t)。dM/dt就是质量的微小变化率和天数的微小变化量的比例…

23微分方程和exp(At)

预备知识 1.1 一阶线性齐次微分方程的解 d y d x P ( x ) y 0 (1) \frac{dy}{dx}P(x)y0\tag{1} dxdy​P(x)y0(1) 其齐次通解为&#xff1a; y C e − ∫ P ( x ) d x (2) yCe^{-\int P(x)dx}\tag{2} yCe−∫P(x)dx(2) 令 P ( x ) − λ P(x)-\lambda P(x)−λ&#xff0c…

人工智能数学基础:无理数e的由来以及对数、指数函数的求导

一、e的由来 函数&#xff08;11/x&#xff09;x在x一>∞时的极限 由于数列{xn}&#xff08;11/n&#xff09;n在n一>∞时存在极限。 证明如下&#xff1a; 当将上述极限推广到n为实数x时也成立&#xff0c;因为任意一个实数都能找到一个n和n1&#xff0c;使得x∈[n,n…

x的1/x次方的导数是多少?怎么算?

方法一&#xff1a; 原式化为e的[1/x•ln(x)]次幂&#xff0c;再根据复合函数求导法则求解。 方法二&#xff1a;

c语言x的n次方导数,a的x次方的导数

a的x次方的导数2019-12-07 13:56:28文/董月 指数函数的求导公式&#xff1a;(a^x)(lna)(a^x)&#xff0c;实质上&#xff0c;求导就是一个求极限的过程&#xff0c;导数的四则运算法则也来源于极限的四则运算法则。反之&#xff0c;已知导函数也可以倒过来求原来的函数&#xf…

软件流程图及功能节点图

需求分析 根据产品原型图&#xff0c;为了弄清楚产品的业务流程以及确定项目中存在的功能点及其具体规则和要求&#xff0c;绘制出软件流程图以及功能节点图&#xff0c;本文以赞赞羊项目为例。 1.软件流程图&#xff1a;作用是弄清楚项目的业务流程。 流程图符号说明&#xff…

软件工程 -- 程序流程图

1.程序流程图&#xff1a;表示了程序的操作顺序&#xff0c;用于对控制流程的描述 1.1 符号 1.2 三种基本控制结构 1.2.1 顺序结构 1.2.2 分支结构 多分支结构 1.2.3 循环结构

QT案例 使用QGraphicsView和命令模式设计完成流程图功能软件,参考QT官方流程图案例【diagramscene】

之前总结资料时候&#xff0c;看到一个Qt实现流程的专栏&#xff0c;后面就想着参考这个项目和官方的【diagramscene】项目&#xff0c;自己再写一个流程图软件来总结学习下&#xff0c;于是就想到使用QGraphicsView来完成相关功能&#xff0c;再使用命令模式来优化使用过程&am…

软件工程-系统流程图

在软件工程可行性研究中需要建立新系统的高层逻辑模型&#xff0c;这个就需要系统流程图了。 作用 系统流程图时描述物理系统的工具 物理系统 所谓物理系统&#xff0c;就是一个具体实现的系统。 与程序流程图的区别 在系统流程图中某些符号与程序流程图中符号形式相同&#…

软件工程 可行性研究、系统流程图、数据流图。

第二章&#xff1a;可行性研究 1.1研究方案的可行性 &#xff08;1&#xff09;技术可行性 &#xff08;2&#xff09;操作可行性 &#xff08;3&#xff09;经济可行性 1.2系统流程图 系统流程图表达的是系统各部件间的流动情况&#xff0c;不是对信息进行加工处理的控制…

ipadpro画流程图_流程图制作软件,这款软件让你5分钟就能搞定流程图

流程图制作软件&#xff0c;这款软件让你5分钟就能搞定流程图 2019-08-05 16:34:24 3点赞 16收藏 0评论 流程图是用来表示算法、工作流的一种框图图示&#xff0c;其广泛应用于分析、设计和记录等领域。市面上绘制流程图的工具并不多&#xff0c;找到一款适合自己的软件变得尤其…

系统流程图

系统流程图 在进行可行性研究时需要理解和分析现有系统&#xff0c;并以概括的形式表达对现有系统的认识&#xff1b;进入设计阶段后应该把设想的新系统的逻辑模型变成物理模型&#xff0c;因此就需要描绘未来的物理系统的概貌。 系统流程图是概括地描绘物理系统的传统工具&…

软件工程系统流程图

对现行系统进行初步分析是可行性研究当中重要的一步&#xff0c;新系统的一些信息主要来源于现行系统同时要根据实际需求完成现行系统的部分功能&#xff0c;并在此基础上对现行系统中存在的问题进行改善和修复&#xff0c;分析现行系统的主要方法就是分析系统的各个部分功能模…

流程图培训

工具 wps 目前咱们在新建里面&#xff0c;可以新建流程图 构成流程图的图形符号及其作用 常用的流程图介绍 flowchart 和 BPMN 两种 flowchart: 最开始的全名是”Process Flow Charts”&#xff0c;即处理流程图表。 BPMN&#xff1a; 定义了业务流程图&#xff0c;其基…

SD软件流程图

SD软件流程图 SD软件流程图 Host configure ClockSD bus power controlchanging bus widthTimeout setting on data lineCard initialization and identificationTransaction Control Transaction Control without DataTransaction Control with DataAbort TransactionChange …

软件工程程序流程图

程序流程图 程序流程图&#xff08;Program Flow Chart&#xff09;是用统一规定的标准符号描述程序运行具体步骤的图形表示。程序框图的设计是在处理流程图的基础上&#xff0c;通过对输入输出数据和处理过程的详细分析&#xff0c;将计算机的主要运行步骤和内容标识出来。程…

软件开发流程及类型图

前记 今天接触到了软件开发流程&#xff0c;对其想进行进一步了解&#xff0c;于是网上搜索了软件开发流程的各种资料和信息&#xff0c;网上的资料真是多如牛毛&#xff0c;数不胜数&#xff0c;让人不觉眼前一亮&#xff0c;茅塞顿开&#xff0c;现把自己的想法和感受整理如…

软件工程-基本流程图

本文为转载文&#xff0c;原作者链接&#xff1a; http://www.cnblogs.com/skywang12345/p/3520840.html 概要 软件的基本流程图是我们在学习编程时的必修课&#xff0c;它很简单&#xff0c;却很实用。 需要说明的是&#xff0c;UML并不包括软件的基本流程图&#xff0c;但…