侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

PyTorch张量创建与自动求导基础

2025-12-14 / 0 评论 / 3 阅读

题目

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.]])

梯度计算原理:zx的偏导数等于zy的偏导乘以yx的偏导。

解析

原理说明

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)保留计算图