引言:本篇笔记以介绍 pytorch 中的 autograd 模块功能为主,主要涉及 torch/autograd 下代码,不涉及底层的 C++ 实现。
- torch.autograd.function (函数的反向传播)
- torch.autograd.functional (计算图的反向传播)
- torch.autograd.gradcheck (数值梯度检查)
- torch.autograd.anomaly_mode (在自动求导时检测错误产生路径)
- torch.autograd.grad_mode (设置是否需要梯度)
- model.eval() 与 torch.no_grad()
- torch.autograd.profiler (提供 function 级别的统计信息)
torch.autograd.function(函数的反向传播)
我们在构建网络的时候,通常使用 pytorch 所提供的nn.Module
(例如nn.Conv2d
, nn.ReLU
等)作为基本单元。而这些 Module 通常是包裹 autograd function,以其作为真正实现的部分。例如nn.ReLU
实际使用torch.nn.functional.relu
(F.relu
):
1 | from torch.nn import functional as F |
这里的F.relu
类型为function
,若再剥开一层,其实际包裹的函数类型为builtin_function_or_method
,这也是真正完成运算的部分。这些部分通常使用 C++ 实现(如ATen
)。至此我们知道,一个模型的运算部分由 autograd functions 组成,这些 autograd functions 内部定义了 forward,backward 用以描述前向和梯度反传的过程,组合后可以实现整个模型的前向和梯度反传。以torch.autograd.function
中所定义的Function
类为基类,我们可以实现自定义的autograd function,所实现的 function 需包含forward
及backward
两个方法。以下以Exp
和GradCoeff
两个自定义 autograd function 为例进行讲解: