Python-pytorch-自动求导

发布时间:2026/8/18 5:16:42

Python-pytorch-自动求导
PyTorch 自动求导Autograd 什么是自动求导自动求导Autograd是 PyTorch 最核心的特性之一它自动计算神经网络中所有参数的梯度让你无需手动推导和实现反向传播。PyTorch 使用动态计算图——每次前向传播都构建一张新图这意味着你可以使用 Python 原生的控制流if/for/while模型结构可以在每次迭代中改变。 核心概念requires_gradimporttorch# 创建可求导的张量xtorch.tensor([1.0,2.0,3.0],requires_gradTrue)print(x.requires_grad)# True# 或者事后设置xtorch.tensor([1.0,2.0,3.0])x.requires_grad_(True)# 原地修改注意尾部 _requires_gradTrue告诉 PyTorch这个张量的所有运算都要被追踪以便后续计算梯度。 梯度计算基本流程# 1. 定义变量需要梯度xtorch.tensor([2.0,3.0],requires_gradTrue)# 2. 定义计算构建计算图yx**23*x1# y x² 3x 1# dy/dx 2x 3# 3. 调用 backward() 计算梯度y.sum().backward()# y 是向量需要转为标量# 4. 查看梯度print(x.grad)# tensor([7., 9.]) ← 2*237, 2*339 ✓为什么需要.sum()再backward()backward()只能对标量调用。如果y是向量/矩阵需要先将其转为标量求和、求均值等。xtorch.randn(3,requires_gradTrue)yx*2# ❌ y.backward() ← 报错y 是向量# ✅ y.sum().backward() ← 正确先转为标量# ✅ y.mean().backward() ← 也可以取均值 梯度计算原理xtorch.tensor([1.0,2.0,3.0],requires_gradTrue)wtorch.tensor([0.5,0.3,0.2],requires_gradTrue)btorch.tensor(0.1,requires_gradTrue)# 前向传播z(x*w).sum()b# 标量输出# 反向传播自动计算 dz/dx, dz/dw, dz/dbz.backward()print(fdz/dx:{x.grad})# w [0.5, 0.3, 0.2]print(fdz/dw:{w.grad})# x [1.0, 2.0, 3.0]print(fdz/db:{b.grad})# 1.0 梯度累积与清零 ⭐PyTorch 默认累加梯度而非覆盖这是为 RNN 等多步反向传播设计的。xtorch.tensor([2.0],requires_gradTrue)foriinrange(3):yx**2y.backward()print(fStep{i}: grad {x.grad})# Step 0: grad [4.] ← 2*2# Step 1: grad [8.] ← 累加4 4# Step 2: grad [12.] ← 再累加8 4# 正确做法每次迭代清空梯度xtorch.tensor([2.0],requires_gradTrue)foriinrange(3):yx**2y.backward()print(fStep{i}: grad {x.grad})x.grad.zero_()# ← 清零在实际训练中使用optimizer.zero_grad()一次性清空所有参数梯度。 禁用梯度追踪torch.no_grad()— 禁用梯度计算在推理、评估时使用减少内存占用、加速计算。xtorch.randn(10,requires_gradTrue)# 方式一: with 语句推荐withtorch.no_grad():yx*2print(y.requires_grad)# False# 方式二: 装饰器torch.no_grad()defevaluate(model,data):returnmodel(data).detach()— 从计算图中分离创建一个共享数据但不参与梯度计算的新张量。xtorch.tensor([2.0],requires_gradTrue)yx**2# y 4zy.detach()# z 是 4但不与 x 关联wz**2# 与 x 无关不会反向传播到 xset_grad_enabled()— 条件控制withtorch.set_grad_enabled(is_train):outputmodel(input)lossloss_fn(output,target)⛓️ 阻止对部分参数求导# 方式一: requires_gradFalsewtorch.randn(3,5,requires_gradFalse)# 不更新btorch.randn(5,requires_gradTrue)# 更新# 方式二: 冻结模型层forparaminmodel.features.parameters():param.requires_gradFalse# 冻结 backbone# 方式三: optimizer 只传部分参数optimizeroptim.Adam(filter(lambdap:p.requires_grad,model.parameters()),lr1e-4) 梯度信息查看与调试xtorch.tensor([[1.0,2.0],[3.0,4.0]],requires_gradTrue)y(x**2).sum()y.backward()print(x.grad)# tensor([[2., 4.], [6., 8.]])# 梯度相关属性print(x.grad_fn)# None叶子节点print(y.grad_fn)# SumBackward0 — y 是由 sum 得到的# 查看计算图print(x.is_leaf)# True用户直接创建的叶子节点leaf node用户直接创建而非运算结果的张量。只有叶子节点的.grad会在backward()后被填充。 retain_graph — 保留计算图默认backward()后计算图被释放。如果需要对同一个输出多次调用backward()xtorch.tensor([2.0],requires_gradTrue)yx**3# y 8y.backward(retain_graphTrue)print(x.grad)# 12 ← 3*2² 12y.backward(retain_graphTrue)print(x.grad)# 24 ← 累加到 1212 24注意梯度累加⚠️ 绝大多数情况下不需要retain_graphTrue。只在多任务学习、GAN 训练等少数场景用到。 高阶梯度PyTorch 支持计算梯度的梯度二阶导数。xtorch.tensor([2.0],requires_gradTrue)yx**3# y x³# 一阶导: dy/dx 3x² 12grad1torch.autograd.grad(y,x,create_graphTrue)[0]print(grad1)# tensor([12.])# 二阶导: d²y/dx² 6x 12grad2torch.autograd.grad(grad1,x)[0]print(grad2)# tensor([12.])使用create_graphTrue保留梯度计算图以便计算更高阶导数。⚠️ 常见错误与解决错误原因解决backward()报错输出不是标量先.sum()或.mean()grad为None没设requires_gradTrue创建时设置或调用.requires_grad_()grad值不对忘记清零梯度累加每次迭代前optimizer.zero_grad()内存不足保留了不必要的计算图用torch.no_grad()或.detach()inplace操作报错修改了需要梯度的叶子节点避免对需要梯度的张量做原地操作 速查表需求代码启用梯度x torch.tensor([1.], requires_gradTrue)反向传播loss.backward()查看梯度x.grad清零梯度x.grad.zero_()禁用梯度with torch.no_grad():分离张量x.detach()冻结参数param.requires_grad False获取梯度值torch.autograd.grad(loss, x)保留计算图loss.backward(retain_graphTrue)创建高阶图torch.autograd.grad(y, x, create_graphTrue)[[pytorch-总览|← 返回总览]]

相关新闻

手绘色彩基础:从色彩三属性到有限色练习的设计自学指南

手绘色彩基础:从色彩三属性到有限色练习的设计自学指南

2026/8/18 5:06:41

1. 项目概述:为什么“手绘色彩”是设计自学的第一道分水岭?如果你正在自学设计,无论是平面、UI、插画还是其他视觉领域,我敢打赌,你肯定不止一次被“色彩”这个问题卡住过。你可能看过很多配色理论,知道互补…

Spec-Superflow:解决AI编程“跑偏”的工程化方案

Spec-Superflow:解决AI编程“跑偏”的工程化方案

2026/8/18 5:06:41

1. 从“跑偏”到“对齐”:AI编程的痛点与Spec-Superflow的解法如果你最近也在用Cursor、Copilot或者Claude来写代码,大概率经历过这种场景:你给AI提了一个需求,比如“帮我写一个用户登录的API接口”,AI噼里啪啦给你生成…

手绘色彩入门:从理论到实践的色彩认知与运用指南

手绘色彩入门:从理论到实践的色彩认知与运用指南

2026/8/18 5:06:41

1. 项目概述:从零开始构建你的手绘色彩认知体系“手绘色彩”这四个字,听起来像是美术生的专属领域,离我们这些普通人很遥远。但事实上,无论是想记录生活的速写、为手账增添一抹亮色,还是单纯想通过绘画放松心情&#x…

上海车展前瞻:7款新势力车型深度解析与观展指南

上海车展前瞻:7款新势力车型深度解析与观展指南

2026/8/18 5:56:43

1. 车展前的“纸上谈兵”:为什么我们需要提前做功课?又到了一年一度的上海车展,对于汽车行业从业者、媒体人,或者像我这样深度关注汽车市场的普通爱好者来说,这绝对是一场不容错过的盛宴。但说实话,如果你只…

Agentic AI与多智能体强化学习在热带建筑节能与热舒适优化中的应用

Agentic AI与多智能体强化学习在热带建筑节能与热舒适优化中的应用

2026/8/18 5:56:43

1. 项目概述:当AI拥有“自主意识”,热带城市街区如何变得更舒适、更节能?如果你在东南亚或者我国华南地区生活过,一定对那种“出门五分钟,流汗两小时”的湿热天气记忆犹新。在这种典型的热带城市街区里,建筑…

PTCG-Bench:大语言模型智能体在复杂卡牌游戏中的能力评估新基准

PTCG-Bench:大语言模型智能体在复杂卡牌游戏中的能力评估新基准

2026/8/18 5:56:43

1. 项目缘起:当大语言模型智能体遇上宝可梦卡牌最近在AI智能体(LLM Agents)的圈子里,一个名为“PTCG-Bench”的新基准测试引起了我的注意。它的标题很有意思:“PTCG-Bench: Can LLM Agents Master Pokmon Trading Card…

MemReread:基于记忆引导与定向重读的长上下文智能推理新范式

MemReread:基于记忆引导与定向重读的长上下文智能推理新范式

2026/8/18 5:56:43

1. 从“读不完”到“读得懂”:长上下文推理的困境与Agentic新范式最近在折腾大模型应用落地的朋友,估计都绕不开一个头疼的问题:上下文长度。模型窗口是越来越大了,从4K、8K一路飙升到128K、200K甚至更长,但一个残酷的…

UniApp弹框进阶:从基础API到自定义组件的体验优化实战

UniApp弹框进阶:从基础API到自定义组件的体验优化实战

2026/8/18 5:56:43

1. 从“能用”到“好用”:提示弹框的进阶思考在UniApp开发中,提示弹框(Toast、Modal、ActionSheet等)大概是每个开发者最早接触、也最频繁使用的组件之一。乍一看,它们简单到几乎不需要思考:调用一个API&am…

路特斯Emira转型:超跑如何平衡驾驶乐趣与日常实用性

路特斯Emira转型:超跑如何平衡驾驶乐趣与日常实用性

2026/8/18 5:46:43

1. 从“空中楼阁”到“落地生根”:路特斯2020年转型宣言的深层解读“更注重实用性 路特斯2020年推全新跑车”——这个标题在当年发布时,对于熟悉路特斯(Lotus)这个品牌的老车迷而言,无异于一枚重磅炸弹。它传递的信号&…

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

2026/8/17 1:28:42

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

2026/8/18 1:03:22

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

2026/8/17 8:40:51

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

多智能体大模型辩论中的立场收敛:从伪共识到理性说服的评估方法

多智能体大模型辩论中的立场收敛:从伪共识到理性说服的评估方法

2026/8/18 0:06:29

1. 从一场“假辩论”说起:为什么大模型辩论会走向“伪共识”?最近在折腾多智能体大语言模型(Multi-Agent LLM)的辩论实验,发现一个挺有意思的现象。我让几个基于GPT-4的智能体就一个争议性话题(比如“远程办…

Frida动态代码插桩框架:从原理到实战的移动安全与逆向工程指南

Frida动态代码插桩框架:从原理到实战的移动安全与逆向工程指南

2026/8/18 0:06:29

1. 从“黑盒”到“白盒”:为什么我们需要Frida在移动安全、逆向工程甚至是一些自动化测试的场景里,我们经常会遇到一个让人头疼的问题:面对一个编译好的、没有源代码的应用程序,我们如何知道它在运行时内部发生了什么?…

ECharts饼图中心文字配置指南:从label与title区别到动态交互实现

ECharts饼图中心文字配置指南:从label与title区别到动态交互实现

2026/8/18 0:06:29

1. 从“空心”到“有魂”:为什么要在饼图中间加文字?如果你用过ECharts画饼图,大概率会注意到一个现象:默认生成的饼图中间是空心的。这个设计本身没问题,它清晰地展示了各个扇区的占比关系。但在很多实际的业务场景里…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/17 12:00:53

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/15 10:10:27

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/14 19:35:14

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…