torch.autograd.grad#
- torch.autograd.grad(outputs, inputs, grad_outputs=None, retain_graph=None, create_graph=False, only_inputs=True, allow_unused=None, is_grads_batched=False, materialize_grads=False)[source]#
计算并返回outputs相对于inputs的梯度之和。
grad_outputs
应为一个长度与output
匹配的序列,其中包含向量-雅可比乘积中的“向量”,通常是针对每个输出预先计算的梯度。如果某个输出不需要梯度,则其梯度可以为None
。注意
如果您在用户指定的 CUDA 流上下文中执行任何前向操作、创建
grad_outputs
或调用grad
,请参阅 后向 CUDA 流语义。注意
only_inputs
参数已弃用,现在被忽略(默认为True
)。要累积图中其他部分的梯度,请使用torch.autograd.backward
。- 参数
outputs (序列 of Tensor or GradientEdge) – 待微分函数的输出。
inputs (序列 of Tensor or GradientEdge) – 将返回其梯度的输入(而不是累积到
.grad
中)。grad_outputs (序列 of Tensor) – 向量-雅可比乘积中的“向量”。通常是针对每个输出的梯度。标量张量或不需要梯度的张量可以指定 None 值。如果所有
grad_tensors
都可以接受 None 值,则此参数是可选的。默认值:None。retain_graph (bool, optional) – 如果为
False
,则用于计算梯度的图将被释放。请注意,在几乎所有情况下,将此选项设置为True
都是不必要的,并且通常可以通过更有效的方式来规避。默认为create_graph
的值。create_graph (bool, optional) – 如果为
True
,则将构建导数的图,允许计算更高阶的导数乘积。默认值:False
。allow_unused (Optional[bool], optional) – 如果为
False
,则指定在计算输出时未使用的输入(因此其梯度始终为零)将引发错误。默认为materialize_grads
的值。is_grads_batched (bool, optional) – 如果为
True
,则grad_outputs
中的每个张量的第一个维度将被解释为批次维度。而不是计算单个向量-雅可比乘积,我们将为批次中的每个“向量”计算一批向量-雅可比乘积。我们使用 vmap 原型功能作为后端来向量化对自动微分引擎的调用,以便此计算可以一次性完成。这应该会带来比手动循环和多次执行后向更好的性能。请注意,由于此功能仍处于实验阶段,可能存在性能瓶颈。请使用torch._C._debug_only_display_vmap_fallback_warnings(True)
来显示任何性能警告,并在您的用例存在警告时在 github 上提交 issue。默认为False
。materialize_grads (bool, optional) – 如果为
True
,则将未使用的输入的梯度设置为零而不是 None。这对于计算高阶导数很有用。如果materialize_grads
为True
且allow_unused
为False
,则会引发错误。默认为False
。
- 返回类型
tuple[torch.Tensor, …]