02-自动求导搞不定nn_Module和autograd原理一次讲透 自动求导搞不定?nn.Module和autograd原理一次讲透我之前写训练循环的时候,遇到一个诡异的问题:loss在下降,但模型参数完全没更新。debug了半天,发现是requires_grad=False搞的鬼。更气人的是,这种bug不报错,你还得自己发现模型没学到东西。这篇把PyTorch自动求导和nn.Module的核心原理讲透。不是那种"autograd是自动微分引擎"的废话,而是真正搞清楚:梯度怎么算的、计算图怎么建的、nn.Module帮你管了什么。autograd到底在干什么一句话:autograd在前向传播时记录操作,构建计算图;反向传播时沿计算图自动求导。但"计算图"长什么样?我用一个具体例子拆给你看:importtorch x=torch.tensor(2.0,requires_grad=True)y=torch.tensor(3.0,requires_grad=True)z=x*y+x**2# z = xy + x²z.backward()print(x.grad)# dz/dx = y + 2x = 3 + 4 = 7print(y.grad)# dz/dy = x = 2前向传播时,PyTorch做的事:x * y→ 创建Mul节点,记录"z₁ = x * y"x ** 2→ 创建Pow节点,记录"z₂ = x²"z₁ + z₂→ 创建Add节点,记录"z = z₁ + z₂"反向传播时,从z开始,沿着Add→Mul/Pow→x/y的路径,用链式法则逐节点计算梯度。计算图的两种模式:模式原理PyTorch用的特点前向模式沿前向方向同时算值和导数否适合输入维度小于输出维度反向模式先算值,再反向算导数是适合输出维度小于输入维度(训练就是这种)深度学习几乎都是"很多参数→一个loss",反向模式效率更高。PyTorch选对了。requires_grad的门道requires_grad是控制梯度计算的总开关,但它的规则比你想的复杂。规则1:运算结果的requires_grad由输入决定a=torch.tensor([1.0,2.0],requires_grad=True)b=torch.tensor([3.0,4.0],requires_grad=False)c=a+b# c.requires_grad = True,因为有a参与d=b*2# d.requires_grad = False,全是不求梯度的输入只要有一个输入要梯度,输出就要梯度。这是合理的设计——否则梯度链断了,a的梯度算不出来。规则2:叶子张量和非叶子张量这是很多人搞混的概念:x=torch.tensor([1.0,2.0],requires_grad=True)# 叶子张量y=x*2# 非叶子张量z=y.sum()z.backward()print(x.grad)# tensor([2., 2.]) ← 叶子张量保留梯度print(y.grad)# None ← 非叶子张量的梯度被释放了叶子张量:直接创建的张量(不是通过运算得到的)。它们的.grad会被保留。非叶子张量:运算产生的中间结果。默认反向传播后梯度就释放了,省内存。如果你需要非叶子张量的梯度,用retain_grad():y=x*2y.retain_grad()# 告诉PyTorch:这个中间结果的梯度我也想看z=y.sum()z.backward()print(y.grad)# tensor([2., 2.]) ← 现在有了规则3:no_grad和inference_mode推理时不需要梯度,用这两种方式关闭:# 方式1:no_gradwithtorch.no_grad():output=model(input)# 不构建计算图,省内存# 方式2:inference_mode(更快,更严格)

相关新闻

最新新闻

Altium Designer差分对DRC间距报错排查与规则优先级解析

Altium Designer差分对DRC间距报错排查与规则优先级解析

1. 差分间距报错:一个看似简单却暗藏玄机的DRC问题在Altium Designer(简称AD)里画板子,Electrical规则检查(DRC)是每个工程师绕不开的环节。它就像一位严格的质检员,帮你揪出那些可能导致板子报…

2026/8/1 8:04:24
宁波热门的汽车遮阳帘企业推荐

宁波热门的汽车遮阳帘企业推荐

在宁波,有众多企业投身于汽车用品行业,而在汽车遮阳帘领域,坚途JUSTAUTO脱颖而出,成为备受瞩目的企业。下面将详细为你介绍这家企业的优势,让你深入了解它的魅力所在。一、丰富的产品品类和稳定的产能交付1. 品类覆盖广…

2026/8/1 8:04:24
游戏王黑暗大魔法师卡组:从检索到胜利的精密资源管理

游戏王黑暗大魔法师卡组:从检索到胜利的精密资源管理

1. 项目概述:从“口胡”到精准召唤在《游戏王》这个风靡全球的卡牌对战游戏中,“黑暗大魔法师”及其相关的“被封印”系列卡组,一直是无数决斗者心中的“白月光”。这套卡组以其独特的胜利方式——集齐五张“被封印的艾克佐迪亚”部件直接获胜…

2026/8/1 8:04:24
N_m3u8DL-RE:跨平台流媒体下载终极指南,轻松保存加密视频内容

N_m3u8DL-RE:跨平台流媒体下载终极指南,轻松保存加密视频内容

N_m3u8DL-RE:跨平台流媒体下载终极指南,轻松保存加密视频内容 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/…

2026/8/1 8:04:24
Linux存储管理实战:eMMC/SD卡分区、格式化与故障修复指南

Linux存储管理实战:eMMC/SD卡分区、格式化与故障修复指南

1. 项目概述:为什么需要掌握Linux下的存储介质管理在嵌入式开发、服务器运维甚至是日常的桌面使用中,我们经常会遇到需要对eMMC(嵌入式多媒体卡)或SD卡这类存储介质进行初始化和管理的场景。比如,拿到一块全新的RK3562…

2026/8/1 8:04:24
5分钟上手小熊猫Dev-C++:告别复杂配置,开启高效C++编程之旅

5分钟上手小熊猫Dev-C++:告别复杂配置,开启高效C++编程之旅

5分钟上手小熊猫Dev-C:告别复杂配置,开启高效C编程之旅 【免费下载链接】Dev-CPP A greatly improved Dev-Cpp 项目地址: https://gitcode.com/gh_mirrors/dev/Dev-CPP 还在为C开发环境配置而头疼吗?小熊猫Dev-C(Red Panda…

2026/8/1 7:59:24