96SEO 2026-02-20 08:50 6
PyTorch#xff0c;乃至其他大部分深度学习框架中的重…

了解自动求导背后的原理和规则对我们写出一个更干净整洁甚至更高效的
API我们在写一个自己的网络的时候可能几乎都不用去注意求导这些问题因为这些
已经在私底下处理好了这些事情。
现在我们往往只需要搭建个想要的模型处理好数据的载入调用现成的
属性。
要阻止张量跟踪历史记录可以调用.detach()方法将其与计算历史记录分离并禁止跟踪它将来的计算记录。
在评估模型时特别有用因为模型可能具有requires_grad
在自动梯度计算中还有另外一个重要的类Function.Tensor
Function互相连接并生成一个非循环图它表示和存储了完整的计算历史。
每个张量都有一个.grad_fn属性这个属性引用了一个创建了Tensor的Function除非这个张量是用户手动创建的即这个张量的
首先我们先简单地介绍一下什么是计算图Computational
Graphs以方便后边的讲解。
假设我们有一个复杂的神经网络模型我们把它想象成一个错综复杂的管道结构不同的管道之间通过节点连接起来我们有一个注水口一个出水口。
我们在入口注入数据的之后数据就沿着设定好的管道路线缓缓流动到出水口这时候我们就完成了一次正向传播。
指的是在计算图中某个节点node所进行的运算比如加减乘除卷积等等之类的Function
注意grad在反向传播过程中是累加的(accumulated)这意味着每一次运行反向传播梯度都会累加之前的梯度所以一般在反向传播之前需把梯度清零。
paramsdict(model.named_parameters()))
paramsdict(list(model.named_parameters())
mean(l4)这个例子比较简单涉及的最复杂的操作是求平均但是如果我们把其中的加法和乘法操作换成卷积那么其实和神经网络类似。
我们可以简单地画一下它的计算图
的值也为空。
接下来我们看一下如果要继续进行反向传播计算图应该是什么样子
这个变量开始通过链式法则依次计算出各部分的导数。
【深一点学习】BP网络结合数学推导的代码实现_羞儿的博客-CSDN博客
l1l2l3甚至其他的部分的求导结果都为空呢想要解答这个问题我们得明白什么是叶子张量。
来说我们约定俗成地把它们归为叶子张量。
但其实无论如何划分都没有影响因为张量的
print(input.is_leaf,w1.is_leaf,w2.is_leaf,w3.is_leaf,l1.is_leaf,l2.is_leaf,l3.is_leaf,l4.is_leaf,loss.is_leaf)True
为什么要搞出这么个叶子张量的概念出来原因是为了节省内存或显存。
我们来想一下那些非叶子结点是通过用户所定义的叶子节点的一系列运算生成的也就是这些非叶子节点都是中间变量一般情况下用户不会去使用这些中间变量的导数所以为了节省内存它们在用完之后就被释放了。
我们回头看一下之前的反向传播计算图在图中的叶子节点用绿色标出了。
可以看出来被叫做叶子可能是因为游离在主干之外没有子节点因为它们都是被用户创建的不是通过其他节点生成。
对于叶子节点来说它们的
属性都为空而对于非叶子结点来说因为它们是通过一些操作生成的所以它们的
print(input.requires_grad,input.is_leaf,input.grad)
print(l1.requires_grad,l1.is_leaf,l1.grad)
print(loss.requires_grad,loss.is_leaf,loss.grad)
print(input.requires_grad,input.is_leaf,input.grad)
print(l1.requires_grad,l1.is_leaf,l1.grad)
print(loss.requires_grad,loss.is_leaf,loss.grad)False
可以表示4个卷积层输出如果我们把节点上的加法乘法换成卷积操作的话。
实际上这个简单的模型很像我们平时的神经网络的简化版。
变成1了所以就会报错了。
但是还有一种特殊情况不会报错就是反向传播求导的时候如果没用到
torch.autograd.set_detect_anomaly(True).上边我们所说的情况是针对非叶子节点的对于
的叶子节点来说要求更加严格了甚至在叶子节点被使用之前修改它的值都不行。
这个意思通俗一点说就是你的一顿
操作把一个叶子节点变成了非叶子节点了。
我们知道非叶子节点的导数在默认情况下是不会被保存的这样就会出问题了。
举个小例子
都有了所以自然而然不是叶子节点了。
本来是该有导数值保留的变量现在成了导数会被自动释放的中间变量了所以
backward只要你对需要求导的叶子张量使用了这些操作马上就会报错。
那是不是需要求导的叶子节点一旦被初始化赋值之后就不能修改它们的值了呢我们如果在某种情况下需要重新对叶子变量赋值该怎么办呢有办法
tensor.detach()。
需要注意的是要在变量被使用之前修改不然等计算完之后再修改还会造成求导上的问题会报错的。
tricky。
比如有的时候在一个变量已经参与了正向传播的计算之后它的值被修改了在做反向传播的时候如果还需要这个变量的值的话我们肯定不能用那个后来修改的值吧但没修改之前的原始值已经被释放掉了我们怎么办
的时候每次都开辟一片空间储存当时输入变量的值这样无论之后它们怎么修改都不会影响了反正我们有备份在存着。
但这样有什么问题这样会导致内存或显存使用量大大增加。
因为我们不确定哪个变量可能之后会做
操作影响求导正确性的时候会采用报错的方式提醒。
但这句话反过来说就是因为只要有
所谓动态图就是每次当我们搭建完一个计算图然后在反向传播结束之后整个计算图就在内存中被释放了。
静态图每次都先设计好计算图需要的时候实例化这个图然后送入各种输入重复使用只有当会话结束的时候创建的图才会被释放。
静态图每次都先设计好计算图需要的时候实例化这个图然后送入各种输入重复使用只有当会话结束的时候创建的图才会被释放。
十分注重占用内存或显存大小没有用的空间释放很及时可以很有效地利用有限的内存。
十分注重占用内存或显存大小没有用的空间释放很及时可以很有效地利用有限的内存。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback