趋近智
requires_grad)backward()).grad)torch.nn 搭建模型torch.nn.Module 基类torch.nn 损失)torch.optim)torch.utils.data.Datasettorchvision.transforms)torch.utils.data.DataLoader训练神经网络包括迭代地调整模型参数(权重和偏置)以最小化损失函数。这种调整依赖于知晓每个参数的微小变化如何影响最终的损失值。从数学上讲,这种敏感性由损失函数对每个参数的梯度来体现。对于损失 L 和参数 w,我们需要计算 ∂w∂L。
对于非常简单的模型,手动使用微积分规则计算这些梯度是可行的,但对于当今常见的深度多层网络来说,这很快就会变得异常复杂且容易出错。想象一下为拥有数百万参数的模型推导导数!这时,**自动微分(AD)**就派上用场了。
AD 是一系列以数值方式评估由计算机程序定义的函数导数的方法。与符号微分(它操作数学表达式,常导致复杂且低效的公式)或数值微分(它使用有限差分近似导数,可能存在截断和舍入误差)不同,AD 通过在构成整体计算的基本运算(加法、乘法、三角函数等)层面系统地应用微积分的链式法则,高效地计算出精确的梯度。
其核心是,AD 依赖于链式法则。如果有一系列函数,例如 y=f(x) 和 z=g(y),链式法则告诉我们如何找到复合函数 z=g(f(x)) 对 x 的导数:
dxdz=dydz⋅dxdyAD 将复杂的计算分解为一系列基本运算。然后,它计算每个小步骤的局部导数,并使用链式法则将它们组合起来以得到整体梯度。
考虑一个简单例子:L=(w⋅x+b)2。令 y=w⋅x+b。则 L=y2。 要找到 ∂w∂L,链式法则给出:
∂w∂L=∂y∂L⋅∂w∂y我们知道 ∂y∂L=2y 和 ∂w∂y=x。将 y 代回,我们得到:
∂w∂L=(2(w⋅x+b))⋅xAD 自动完成这个过程,即使运算链非常长。
在 AD 中应用链式法则主要有两种方式:
PyTorch 的 Autograd 系统使用反向模式自动微分。
当您对 requires_grad 属性设置为 True 的 PyTorch 张量执行操作时,PyTorch 会在后台构建一个有向无环图(DAG)。这个图通常被称为计算图,它记录了操作序列(节点)和涉及的张量(边)。
让我们直观地看一下 L=(a⋅x+b)2 的简单计算图,假设 a、x 和 b 是输入张量(或之前计算的结果),并且我们想得到 ∂a∂L、∂x∂L 和 ∂b∂L。
L=(a⋅x+b)2 计算图的表示。实线表示正向传播,构建图。虚线表示反向传播期间梯度的流动,应用链式法则。
当您在最终输出张量(通常是标量损失 L)上调用 .backward() 时,Autograd 会从该输出开始并反向遍历图。在每个步骤(节点),它根据后续节点的梯度和当前节点执行运算的局部导数来计算梯度,有效地应用了链式法则。然后,对每个需要梯度的张量(如模型参数)计算出的梯度会累积到它们的 .grad 属性中。
这种机制使 PyTorch 能够自动计算由张量运算序列定义的任意复杂模型的梯度,让您摆脱手动推导的繁琐且容易出错的任务。接下来的章节将演示如何实际使用 Autograd 的功能:定义需要梯度的张量、隐式构建计算图、触发反向传播、访问梯度以及控制梯度计算。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造