本文共 1086 字,大约阅读时间需要 3 分钟。
在搭建神经网络模型时,PyTorch 提供了强大的工具来实现自动微分,简化了反向传播过程。通过继承 nn.Module 类,我们可以定义自定义的神经网络,而 torch.autograd 则负责计算梯度,实现链式法则。
计算图是 PyTorch 中的核心概念,用于描述数据流向和操作顺序。在定义网络时,张量通过函数构建计算图。函数不仅执行正向计算,还存储导数信息,以便反向传播时使用。每个张量都有一个 grad_fn 属性,指向其导数函数。
例如,在单层网络中,输入 x 经过权重 w 和偏置 b 进行计算,输出 z,再与 y 计算损失函数。通过设置 requires_grad=True,我们可以跟踪计算图中的叶节点(输入张量),使其梯度可用。
为了优化模型参数,我们需要计算损失函数对权重 w 和偏置 b 的梯度。在 PyTorch 中,只需调用 loss.backward(),就能将梯度累加到 w.grad 和 b.grad 属性中。需要注意的是,只有设置 requires_grad=True 的叶节点才有可用的梯度。
此外,为了提高性能,建议在多次反向传播时设置 retain_graph=True,避免重建计算图。
在某些情况下,我们不需要跟踪梯度信息。例如,只需执行正向计算时,可以使用 torch.no_grad() 包围计算代码,禁用梯度跟踪。这适用于预训练模型微调或仅进行推理任务。
另外,可以通过将张量 detach() 分离出来,来禁用梯度跟踪。这种方法在性能敏感的场景下尤为重要。
PyTorch 的计算图基于有向无环图(DAG),记录数据流向和操作顺序。正向传播时,autograd 同时执行操作并维护导数信息。反向传播时,通过 backward() 方法,autograd 从输出张量开始,沿着计算图向叶节点传播梯度,应用链式法则。
对于向量函数,PyTorch 提供了雅可比乘积的计算方式。通过指定输入向量 v,可以计算 v^T⋅J,而不是完整的雅可比矩阵。这在处理高维数据时尤为方便。
例如,对于输入 inp,输出函数为 (inp+1).pow(2),通过两次反向传播,我们可以观察梯度的变化。需要注意的是,多次反向传播时,梯度会累加,因此需要定期归零以确保准确性。
通过以上方法,PyTorch 提供了强大的工具来实现自动微分和反向传播,使得神经网络的训练和优化更加高效。
转载地址:http://srxfk.baihongyu.com/