评价此页

torch.autograd.backward#

torch.autograd.backward(tensors, grad_tensors=None, retain_graph=None, create_graph=False, grad_variables=None, inputs=None)[source]#

计算给定张量相对于图叶子的梯度之和。

图使用链式法则进行微分。如果 tensors 中的任何一个不是标量(即其数据包含多个元素)并且需要梯度,那么将计算 Jacobian-vector 乘积,在这种情况下,该函数还需要指定 grad_tensors。它应该是一个长度匹配的序列,其中包含 Jacobian-vector 乘积中的“向量”,通常是微分函数关于对应张量的梯度(对于所有不需要梯度张量的张量,None 是可接受的值)。

此函数累积叶子节点的梯度——您可能需要在调用它之前将 .grad 属性置零或设置为 None。有关累积梯度的内存布局的详细信息,请参阅 默认梯度布局

注意

使用 create_graph=True 调用此方法将会在参数及其梯度之间创建循环引用,这可能导致内存泄漏。我们建议在创建图时使用 autograd.grad 来避免这种情况。如果您必须使用此函数,请确保在使用后将参数的 .grad 字段重置为 None,以打破循环并避免泄漏。

注意

如果您在用户指定的 CUDA 流上下文(context)中运行任何前向操作,创建 grad_tensors,和/或调用 backward,请参阅 后向传递的流语义

注意

当提供了 inputs 并且给定的输入不是叶子节点时,当前实现将调用其 grad_fn(即使严格来说并不需要它来获取此梯度)。这是一个用户不应依赖的实现细节。有关更多详细信息,请参阅 pytorch/pytorch#60521

参数
  • tensors (Sequence[Tensor] or Tensor or Sequence[GradientEdge] or GradientEdge) – 将计算其导数的张量。

  • grad_tensors (Sequence[Tensor or None] or Tensor, optional) – Jacobian-vector 乘积中的“向量”,通常是每个对应张量元素的梯度。标量张量或不需要梯度的张量可以指定为 None。如果所有 grad_tensors 都可以接受 None 值,则此参数是可选的。

  • retain_graph (bool, optional) – 如果为 False,则用于计算梯度的图将被释放。请注意,在几乎所有情况下,将此选项设置为 True 都是不必要的,并且通常可以通过更有效的方式解决。默认为 create_graph 的值。

  • create_graph (bool, optional) – 如果为 True,则将构造导数的图,从而可以计算高阶导数乘积。默认为 False

  • inputs (Sequence[Tensor] or Tensor or Sequence[GradientEdge], optional) – 将把梯度累积到 .grad 中的输入。所有其他张量将被忽略。如果未提供,则梯度将累积到用于计算 tensors 的所有叶子张量中。