目录
[一、什么是 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源码分析
的重要基础。