Torch.autograd
torch.autograd
提供实现任意标量值函数自动微分的类和函数。只需要对现有代码进行最小的更改(声明张量,设置使用requires_grad=True关键字计算其梯度). 到目前为止,pytorch只支持浮点张量类型 ( half, float, double and bfloat16) 和复数张量类型 (cfloat, cdouble)的autograd。
计算给定张量相对于图叶节点的梯度之和。 | |
计算并返回输出相对于输入的梯度之和。 |
局部启用、禁用梯度计算
在torch部分已经进行了介绍,详情看这篇文章。
上下文管理器禁用梯度计算. | |
上下文管理器启用梯度计算. | |
上下文管理器将“梯度计算”设置为“开”或“关”。 | |
上下文管理器启用或禁用推理模式 |
默认梯度布局
当非稀疏参数在 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函数
| 这个属性值默认为 |
| 如果需要为此张量计算梯度,则为True, |
| 按惯例,所有具有requires_grad=False的张量都将是叶张量。 |
| 计算当前张量的梯度。 |
| 返回一个与当前图形分离的新张量。 |
| 将张量从创建它的图形中分离,使其成为一片叶子。 |
| 注册一个backward的钩子。 |
| 使得张量在 backward()过程中保留值 |
梯度函数Function
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)
定义一个公式,用于使用向后模式自动微分来区分操作。 | |
执行操作。 |
数值梯度检查
依照分析梯度来检查通过小的有限差分计算得到的梯度。 | |
依照分析梯度来检查通过小的有限差分计算的梯度的梯度 |