torch.autograd 提供实现任意标量值函数自动微分的类和函数。只需要对现有代码进行最小的更改(声明张量,设置使用requires_grad=True关键字计算其梯度). 到目前为止,pytorch只支持浮点张量类型 ( half, float, double and bfloat16) 和复数张量类型 (cfloat, cdouble)的autograd。
| backward | 计算给定张量相对于图叶节点的梯度之和。 |
| grad | 计算并返回输出相对于输入的梯度之和。 |
在torch部分已经进行了介绍,详情看这篇文章。
| no_grad | 上下文管理器禁用梯度计算. |
| enable_grad | 上下文管理器启用梯度计算. |
| set_grad_enabled | 上下文管理器将“梯度计算”设置为“开”或“关”。 |
| inference_mode | 上下文管理器启用或禁用推理模式 |
当非稀疏参数在 torch.autograd.backward() or torch.Tensor.backward() 过程中接受一个非稀疏梯度时,param.grad累积如下.
如果param.grad 初始化值为None:
-
1. 如果param的存储不重叠且密集, .grad 是以param步幅匹配的方式创建的 (因此匹配的是 param的layout布局).
-
2. 否则, .grad 是用连续的行创造的.
如果param已经有一个非稀疏的.grad属性值:
-
3. 如果create_graph=False, backward() 原位累加到 .grad, 同时保持步幅不变.
-
4. 如果create_graph=True, backward() 用一个新的张量值.grad + new grad 替换 .grad, 试图(但不保证)与先前存在的.grad步幅匹配.
建议使用默认行为(使.grads在第一个backward()之前为None,这样它们的布局根据1或2创建,并根据3或4随时间保留),以获得最佳性能。 调用model.zero_grad()或optimizer.zero_grad()不会影响.grad的layout布局。
事实上,在每个累积计算之前重置所有.grad的值为None, e.g.:
for iterations...
...
for param in model.parameters():
param.grad = None
loss.backward()
这样每次都会根据1或2重新创建它们,这是model.zero_grad()或optimizer.zero_grad()的有效替代方案,这可能会提高某些网络的性能。
手动梯度布局如果你需要手动控制.grad的步幅,指定param.grad为在第一次backward()之前具有所需步幅的归零张量,不将其重置为None。
3.只要create_graph=False,就可以保证布局得到保留。
4. 当create_graph=True时,布局也可能保留。
变量Variable (被弃用)WARNING
变量API已被弃用:变量不再需要与张量一起使用autograd. Autograd自动支持带有requires_grad=True的张量.
-
Variable(tensor) 和 Variable(tensor, requires_grad) 仍按预期工作,但它们返回的是张量而不是变量。
-
var.data和tensor.data是一样的。
-
var.backward(), var.detach(), var.register_hook() 方法现在可以通过张量函数名操作如tensor.backward(), tensor.detach(), tensor.register_hook().
现在可以直接创建requires_grad=True的张量, 例如torch.randn(), torch.zeros(), torch.ones()
autograd_tensor = torch.randn((2, 3, 4), requires_grad=True)张量autograd函数
| torch.Tensor.grad | 这个属性值默认为None,第一次使用backward()后变成一个张量. |
| torch.Tensor.requires_grad | 如果需要为此张量计算梯度,则为True, False 则不计算. |
| torch.Tensor.is_leaf | 按惯例,所有具有requires_grad=False的张量都将是叶张量。 |
| torch.Tensor.backward([gradient, …]) | 计算当前张量的梯度。 |
| torch.Tensor.detach | 返回一个与当前图形分离的新张量。 |
| torch.Tensor.detach_ | 将张量从创建它的图形中分离,使其成为一片叶子。 |
| torch.Tensor.register_hook(hook) | 注册一个backward的钩子。 |
| torch.Tensor.retain_grad() | 使得张量在 backward()过程中保留值 |
CLASStorch.autograd.Function(*args, **kwargs)[SOURCE]
用户自定义autograd.Function的基类
为了创建用户自定义的autograd.Function, 需要继承该类并且实现 forward() 和backward的静态类方法。然后,调用类函数apply来利用自定义op实现前向传播,不要直接调用forward()函数。
示例:
>>> class Exp(Function): >>> @staticmethod >>> def forward(ctx, i): >>> result = i.exp() >>> ctx.save_for_backward(result) >>> return result >>> >>> @staticmethod >>> def backward(ctx, grad_output): >>> result, = ctx.saved_tensors >>> return grad_output * result >>> >>> # Use it by calling the apply method: >>> output = Exp.apply(input)
| Function.backward | 定义一个公式,用于使用向后模式自动微分来区分操作。 |
| Function.forward | 执行操作。 |
| gradcheck | 依照分析梯度来检查通过小的有限差分计算得到的梯度。 |
| gradgradcheck | 依照分析梯度来检查通过小的有限差分计算的梯度的梯度 |



