推荐答案
在 PyTorch 中,backward()
方法用于自动计算梯度。以下是一个简单的示例:
-- -------------------- ---- ------- ------ ----- - --------- ------------------ ----- - - ----------------- ------------------- - ------- - - ---- - --- - - - -- ---------- ------ ------------ - ---- ------------- - --- ----------
在这个例子中,y
是 x
的函数,y.backward()
会计算 y
对 x
的梯度,并将结果存储在 x.grad
中。
本题详细解读
1. 创建张量并设置 requires_grad=True
在 PyTorch 中,张量的 requires_grad
属性用于指示是否需要计算该张量的梯度。默认情况下,requires_grad
是 False
。如果设置为 True
,PyTorch 会跟踪所有与该张量相关的操作,以便后续计算梯度。
x = torch.tensor(2.0, requires_grad=True)
2. 定义计算图
在 PyTorch 中,计算图是通过张量之间的操作动态构建的。在这个例子中,y
是 x
的函数,计算图如下:
y = x**2 + 3*x + 1
3. 使用 backward()
方法计算梯度
backward()
方法用于自动计算梯度。它会从调用该方法的张量(通常是损失函数)开始,沿着计算图反向传播,计算每个需要梯度的张量的梯度。
y.backward()
4. 访问梯度
计算完成后,梯度会存储在对应张量的 .grad
属性中。在这个例子中,x.grad
会存储 y
对 x
的梯度。
print(x.grad) # 输出: tensor(7.)
5. 梯度计算的具体过程
在这个例子中,y = x**2 + 3*x + 1
,所以 y
对 x
的导数是 2*x + 3
。当 x = 2.0
时,导数为 2*2 + 3 = 7
,因此 x.grad
的值为 7.0
。
6. 注意事项
backward()
方法通常用于标量张量。如果y
是一个向量或矩阵,需要传递一个与y
形状相同的张量作为gradient
参数。- 每次调用
backward()
后,梯度会累积在.grad
属性中。如果不需要累积梯度,可以在每次反向传播前调用x.grad.zero_()
来清零梯度。