PyTorch 与它的自动微分工具:Autograd

目录

前言

[一、什么是 Autograd](#一、什么是 Autograd)

[二、Autograd 的核心思想](#二、Autograd 的核心思想)

[三、requires_grad 的作用](#三、requires_grad 的作用)

四、计算图是如何构建的

五、叶子节点与非叶子节点

叶子节点

非叶子节点

[六、backward() 的工作过程](#六、backward() 的工作过程)

七、梯度累加机制

[八、Autograd 与神经网络](#八、Autograd 与神经网络)

九、关闭自动微分

[十、Autograd 常见调试技巧](#十、Autograd 常见调试技巧)

[十一、Autograd 为什么如此重要](#十一、Autograd 为什么如此重要)

总结


前言

在深度学习领域,PyTorch 之所以能够成为最受欢迎的框架之一,一个非常重要的原因就是:

复制代码
Autograd
自动微分系统

如果没有 Autograd,我们在训练神经网络时,需要手工推导并编写大量梯度计算代码。

例如:

复制代码
线性层梯度

卷积层梯度

激活函数梯度

损失函数梯度

这些计算不仅复杂,而且容易出错。

而 PyTorch 的 Autograd 系统能够自动构建计算图,并利用链式法则自动完成反向传播。

开发者只需要关注:

复制代码
前向传播

梯度计算则交给框架完成。

本文将深入理解:

  • 什么是 Autograd

  • Autograd 的工作原理

  • requires_grad 的作用

  • grad 与 grad_fn

  • backward() 的执行过程

  • Autograd 在神经网络中的应用


一、什么是 Autograd

Autograd 是 PyTorch 的自动微分引擎。

它能够自动完成:

复制代码
梯度计算

计算图构建

反向传播

例如:

python 复制代码
import torch

x = torch.tensor(
    2.0,
    requires_grad=True
)

y = x ** 2

此时:

复制代码
PyTorch不仅计算了y

还记录了计算过程

形成计算图。


继续执行:

复制代码
y.backward()

即可自动得到:

复制代码
print(x.grad)

输出:

复制代码
tensor(4.)

因为:

python 复制代码
y = x²

dy/dx = 2x

x = 2

dy/dx = 4

整个过程无需手工求导。


二、Autograd 的核心思想

Autograd 的核心思想非常简单:

复制代码
记录前向传播过程
↓
构建计算图
↓
反向传播计算梯度

例如:

python 复制代码
x = torch.tensor(
    2.0,
    requires_grad=True
)

y = x * 3

z = y + 5

实际上对应:

复制代码
x
↓
乘法
↓
y
↓
加法
↓
z

PyTorch 会自动记录:

复制代码
乘法节点

加法节点

输入输出关系

这就是计算图。


三、requires_grad 的作用

想让 Tensor 参与自动求导。

必须开启:

复制代码
requires_grad=True

例如:

python 复制代码
x = torch.tensor(
    2.0,
    requires_grad=True
)

此时:

复制代码
PyTorch开始追踪该变量

后续所有运算都会被记录。


如果:

python 复制代码
x = torch.tensor(2.0)

默认:

python 复制代码
requires_grad=False

则不会参与自动微分。


查看状态:

复制代码
print(x.requires_grad)

输出:

复制代码
True

四、计算图是如何构建的

假设:

python 复制代码
x = torch.tensor(
    2.0,
    requires_grad=True
)

y = x * 3

z = y + 2

执行后:

复制代码
x
↓
Mul
↓
y
↓
Add
↓
z

PyTorch 自动构建计算图。


查看节点:

python 复制代码
print(y.grad_fn)

输出:

复制代码
<MulBackward0>

说明:

复制代码
y来自乘法节点

查看:

复制代码
print(z.grad_fn)

输出:

复制代码
<AddBackward0>

说明:

复制代码
z来自加法节点

grad_fn 表示:

复制代码
当前Tensor由哪个运算产生

五、叶子节点与非叶子节点

Autograd 中有两个重要概念。

叶子节点

用户创建:

python 复制代码
x = torch.tensor(
    2.0,
    requires_grad=True
)

属于:

复制代码
Leaf Tensor
叶子节点

判断:

复制代码
print(x.is_leaf)

输出:

复制代码
True

非叶子节点

例如:

复制代码
y = x * 3

属于:

复制代码
计算结果

不是用户创建。

因此:

复制代码
print(y.is_leaf)

输出:

复制代码
False

一般情况下:

复制代码
梯度默认保存在叶子节点

因此:

复制代码
print(x.grad)

有值。

而:

复制代码
print(y.grad)

通常为:

复制代码
None

六、backward() 的工作过程

例如:

python 复制代码
x = torch.tensor(
    2.0,
    requires_grad=True
)

y = x ** 2

y.backward()

发生了什么?


第一步:

复制代码
找到输出节点y

第二步:

复制代码
沿计算图反向遍历

第三步:

复制代码
利用链式法则计算梯度

第四步:

复制代码
将结果保存到x.grad

查看:

复制代码
print(x.grad)

输出:

复制代码
tensor(4.)

七、梯度累加机制

很多初学者容易踩坑。

例如:

python 复制代码
x = torch.tensor(
    2.0,
    requires_grad=True
)

y = x ** 2

y.backward()

print(x.grad)

输出:

复制代码
4

再次执行:

python 复制代码
y = x ** 2

y.backward()

查看:

python 复制代码
print(x.grad)

输出:

复制代码
8

而不是:

复制代码
4

原因:

复制代码
PyTorch默认梯度累加

即:

复制代码
4 + 4 = 8

因此训练时必须:

python 复制代码
optimizer.zero_grad()

或者:

复制代码
x.grad.zero_()

清空梯度。


八、Autograd 与神经网络

神经网络训练过程:

复制代码
前向传播

计算损失

反向传播

更新参数

其中:

复制代码
反向传播

完全由 Autograd 完成。


示例:

python 复制代码
import torch
import torch.nn as nn

model = nn.Linear(
    4,
    3
)

x = torch.randn(
    5,
    4
)

target = torch.tensor(
    [0,1,2,1,0]
)

criterion = nn.CrossEntropyLoss()

output = model(x)

loss = criterion(
    output,
    target
)

执行:

复制代码
loss.backward()

PyTorch 自动完成:

复制代码
权重梯度计算

偏置梯度计算

链式法则传播

查看梯度:

python 复制代码
print(
    model.weight.grad
)

输出:

复制代码
Tensor(...)

说明梯度已经计算完成。


九、关闭自动微分

推理阶段:

复制代码
不需要梯度

此时建议关闭 Autograd。


方式一:

python 复制代码
with torch.no_grad():

    output = model(x)

方式二:

复制代码
tensor.detach()

例如:

复制代码
y = x.detach()

得到:

复制代码
不参与计算图的新Tensor

这样能够:

复制代码
减少显存占用

提高推理速度

十、Autograd 常见调试技巧

查看是否开启梯度:

python 复制代码
print(
    tensor.requires_grad
)

查看计算节点:

python 复制代码
print(
    tensor.grad_fn
)

查看梯度:

python 复制代码
print(
    tensor.grad
)

查看是否叶子节点:

python 复制代码
print(
    tensor.is_leaf
)

这些属性是调试 Autograd 的利器。


十一、Autograd 为什么如此重要

现代深度学习模型:

复制代码
ResNet

Transformer

BERT

GPT

DeepSeek

都包含数百万甚至数千亿参数。


如果手工推导梯度:

复制代码
几乎不可能完成

Autograd 的价值在于:

复制代码
自动构建计算图

自动执行链式法则

自动完成梯度计算

开发者只需关注:

复制代码
模型结构

损失函数

训练逻辑

即可完成复杂模型训练。


总结

Autograd 是 PyTorch 最核心的组成部分之一。

它的工作流程可以概括为:

复制代码
Tensor开启梯度跟踪
↓
前向传播构建计算图
↓
loss.backward()
↓
链式法则反向传播
↓
梯度保存到.grad
↓
优化器更新参数

在日常开发中,我们最常接触的几个关键概念包括:

复制代码
requires_grad

grad

grad_fn

backward()

no_grad()

理解这些内容之后,你不仅能够熟练使用 PyTorch,还能够真正理解深度学习框架底层的自动微分机制。

而这也是进一步学习:

复制代码
神经网络训练

Transformer原理

大模型微调

PyTorch源码分析

的重要基础。

相关推荐
如烟花的信页1 小时前
加速乐cookie逆向分析
javascript·爬虫·python·js逆向
unique1 小时前
AI Agent记忆系统调研报告:MAGMA 与 AgentMemory 对比分析
人工智能
2601_954971131 小时前
2026财务岗位个人能力提升计划
机器学习
代码有点萌1 小时前
新手入门 ComfyUI:从零理解 AI 绘图工作流
人工智能
大模型真好玩1 小时前
别拿Claude Code当对话框:这6个GitHub项目让你吃透代码智能体
人工智能·agent·deepseek
cd988801 小时前
2026年,电销机器人哪家技术强?
python
weixin199701080161 小时前
[特殊字符] 1688开放平台API Sign签名算法详解(Java / Python / PHP 实现)
java·python·算法
Ajie'Blog1 小时前
AI 周报 | Claude Opus 4.8、Copilot Agent 和 Codex 工作流加速
前端·人工智能·gpt·ai·copilot·ai编程
网安蟹佬霸1 小时前
国产4B认知模型新程Alpha落地:李笛带队复刻卡帕西预言,4B参数等效GPT-5.4
人工智能