题目
PyTorch张量创建与自动求导基础
信息
- 类型:问答
- 难度:⭐
考点
张量创建,requires_grad属性,自动求导机制
快速回答
当设置requires_grad=True时,PyTorch会跟踪该张量的所有操作以计算梯度。题目中:
- 创建张量:
x = torch.ones(2, 3, requires_grad=True) - 计算过程:
y = x * 2; z = y.sum() - 调用
z.backward()后,x.grad的值为:tensor([[2., 2., 2.], [2., 2., 2.]])
梯度计算原理:z对x的偏导数等于z对y的偏导乘以y对x的偏导。
解析
原理说明
PyTorch的autograd模块通过计算图自动追踪张量操作:
- 当张量设置
requires_grad=True时,系统记录其运算历史 - 对最终标量结果调用
.backward()自动计算所有相关梯度 - 梯度计算遵循链式法则:
∂z/∂x = ∂z/∂y * ∂y/∂x
代码示例
import torch
# 1. 创建张量并启用梯度追踪
x = torch.ones(2, 3, requires_grad=True) # 初始值全1
# 2. 执行计算操作
y = x * 2 # 所有元素乘以2
z = y.sum() # 求和得到标量值
# 3. 反向传播计算梯度
z.backward()
# 4. 查看梯度
print(x.grad) # 输出梯度值梯度计算过程
- z = y.sum() →
∂z/∂y = 1(全1张量,形状同y) - y = x * 2 →
∂y/∂x = 2(常数) - 根据链式法则:
∂z/∂x = ∂z/∂y * ∂y/∂x = 1 * 2 = 2 - 因此
x.grad是形状为(2,3)、所有元素为2的张量
最佳实践
- 梯度计算前用
.zero_grad()清除历史梯度(本例未涉及优化器故不需要) - 非必要时不保留梯度:
with torch.no_grad():可禁用梯度追踪提升性能 - 模型推理时调用
model.eval()会自动禁用梯度
常见错误
- 忘记
requires_grad=True导致无法计算梯度 - 对非标量张量调用
.backward()(需传入梯度参数) - 未及时清除历史梯度导致梯度累加(训练循环中常见)
扩展知识
- 叶子张量:直接创建的张量(如本例
x),梯度存储在.grad属性 - 计算图:PyTorch动态构建计算图,调用
.backward()后自动释放 - 梯度累加:训练时可用
loss.backward(retain_graph=True)保留计算图