在神经网络训练中,梯度用于反向传播,优化模型参数。我们在使用pytorch中的torch.zeros()或者torch.tensor()函数时,会遇到一个入参:requires_grad。`requires_grad`是一个布尔值,决定张量是否需要计算梯度。如果设置为True,PyTorch会跟踪该张量的所有操作,以便后续计算梯度。这通常在模型参数中使用,因为它们需要通过梯度下降来更新。
当然,上面的说法比较官方,不够通俗,其实我们可以把整个深度学习想象成一个迷宫,自己是一个探险家,迷宫里藏着宝藏(目标)。你的任务是找到从入口到宝藏的路径,并记住每一步怎么走,下次就能更快找到宝藏。
但问题是——迷宫太大,你不可能记住所有路径。于是,你决定:只在关键路口放路标(比如分叉路口),其他普通直路直接忽略。
这里:
-
迷宫路径 ➔ 神经网络的运算过程(加减乘除、矩阵变换等)。
-
关键路口的路标 ➔ 需要计算梯度的张量(
requires_grad=True
)。 -
普通直路 ➔ 不需要梯度的张量(
requires_grad=False
)。
梯度(Gradient) 就是告诉你:“为了更快找到宝藏,每一步该往哪个方向调整”。
为什么要用 requires_grad
?
-
节省资源:
如果每个石头都要记录(比如requires_grad=True
),背包很快就满了(内存爆炸)。
只标记关键路口(比如模型参数),就能轻装上阵! -
明确目标:
你只想优化模型参数(比如迷宫的钥匙位置),而不是输入数据(比如入口位置)。
所以:-
参数张量 ➔
requires_grad=True
(需要梯度,方便反向传播调整)。 -
输入数据 ➔
requires_grad=False
(不需要调整输入)。
-
举个例子:
import torch
# 假设这是迷宫的钥匙(需要优化的参数)
key = torch.tensor([1.0, 2.0], requires_grad=True) # 关键路口,放路标!
# 这是迷宫的入口(输入数据,固定不变)
entrance = torch.tensor([3.0, 4.0], requires_grad=False) # 普通直路,不用记
# 探索路径:钥匙和入口相互作用
path = key * 2 + entrance # 这里会自动跟踪 key 的梯度!
# 计算损失(比如离宝藏的距离)
loss = path.sum()
# 反向传播:找出钥匙应该怎么调整!
loss.backward()
print("钥匙的梯度:", key.grad) # 输出:tensor([2., 2.])
print("入口的梯度:", entrance.grad) # 输出:None(没标记就不计算)
上面这段代码的含义就是:
key的梯度时[2.,2.],表示“钥匙往这个方向调整,能更快找到宝藏”
entrance:没有梯度,因为它只是起点,不需要优化。
那么什么时候需要将梯度置为true呢?有两点:
1.模型参数需要根据梯度调整
2.如果想研究某个中间步骤对结果的影响
什么时候置为false呢?
1.输入数据本身不需要被优化
2.省内存,加速等时候需要
总结:requires_grad=True
就是告诉 PyTorch:“这个张量很重要!请盯紧它,后面我要用它来反向传播,优化模型!