Shortcuts

NestedIOFunction

class torch.autograd.function.NestedIOFunction(*args, **kwargs)[源代码]

此类仅出于向后兼容的原因而存在。 对于任何新的用例,请使用 Function 代替此类。

backward(*gradients)[源代码]

共享的反向工具。

Return type

任意

backward_extended(*grad_output)[源代码]

用户定义的反向传播。

forward(*args)[源代码]

共享的前向实用程序。

Return type

任意

forward_extended(*input)[源代码]

用户定义的前向传播。

static jvp(ctx, *grad_inputs)

定义一个用于前向模式自动微分的操作的公式。

此函数应由所有子类重写。 它必须接受一个上下文 ctx 作为第一个参数,后面跟随与 forward() 接收的输入数量相同的输入(对于 forward 函数中的非张量输入,将传递 None), 并且它应返回与 forward() 输出数量相同的张量。每个参数是相对于给定输入的梯度, 并且每个返回值应是相对于相应输出的梯度。如果某个输出不是张量或函数对该输出不可微,您可以为该输入传递 None 作为梯度。

您可以使用 ctx 对象将任何值从 forward 传递到此函数。

Return type

任意

mark_dirty(*args, **kwargs)[源代码]

参见 Function.mark_dirty()

mark_non_differentiable(*args, **kwargs)[源代码]

参见 Function.mark_non_differentiable()

save_for_backward(*args)[源代码]

参见 Function.save_for_backward()

save_for_forward(*tensors)

保存给定的张量以供将来调用 jvp()

save_for_forward 应该只在 forward() 方法内部调用一次,并且只能与张量一起调用。

jvp() 中,可以通过 saved_tensors 属性访问保存的对象。

参数也可以是 None。这是一个空操作。

有关如何使用此方法的更多详细信息,请参阅扩展 torch.autograd

Example::
>>> class Func(torch.autograd.Function):
>>>     @staticmethod
>>>     def forward(ctx, x: torch.Tensor, y: torch.Tensor, z: int):
>>>         ctx.save_for_backward(x, y)
>>>         ctx.save_for_forward(x, y)
>>>         ctx.z = z
>>>         return x * y * z
>>>
>>>     @staticmethod
>>>     def jvp(ctx, x_t, y_t, _):
>>>         x, y = ctx.saved_tensors
>>>         z = ctx.z
>>>         return z * (y * x_t + x * y_t)
>>>
>>>     @staticmethod
>>>     def vjp(ctx, grad_out):
>>>         x, y = ctx.saved_tensors
>>>         z = ctx.z
>>>         return z * grad_out * y, z * grad_out * x, None
>>>
>>>     a = torch.tensor(1., requires_grad=True, dtype=torch.double)
>>>     t = torch.tensor(1., dtype=torch.double)
>>>     b = torch.tensor(2., requires_grad=True, dtype=torch.double)
>>>     c = 4
>>>
>>>     with fwAD.dual_level():
>>>         a_dual = fwAD.make_dual(a, t)
>>>         d = Func.apply(a_dual, b, c)
property saved_tensors

参见 Function.saved_tensors()

set_materialize_grads(value)

设置是否具体化梯度张量。默认是 True

这应该仅在 forward() 方法内部调用

如果True,在调用backward()jvp()方法之前,未定义的梯度张量将被扩展为全零张量。

Example::
>>> class SimpleFunc(Function):
>>>     @staticmethod
>>>     def forward(ctx, x):
>>>         return x.clone(), x.clone()
>>>
>>>     @staticmethod
>>>     @once_differentiable
>>>     def backward(ctx, g1, g2):
>>>         return g1 + g2  # 不需要检查None
>>>
>>> # 我们修改SimpleFunc以处理非具体化的梯度输出
>>> class Func(Function):
>>>     @staticmethod
>>>     def forward(ctx, x):
>>>         ctx.set_materialize_grads(False)
>>>         ctx.save_for_backward(x)
>>>         return x.clone(), x.clone()
>>>
>>>     @staticmethod
>>>     @once_differentiable
>>>     def backward(ctx, g1, g2):
>>>         x, = ctx.saved_tensors
>>>         grad_input = torch.zeros_like(x)
>>>         if g1 is not None:  # 现在我们必须检查None
>>>             grad_input += g1
>>>         if g2 is not None:
>>>             grad_input += g2
>>>         return grad_input
>>>
>>> a = torch.tensor(1., requires_grad=True)
>>> b, _ = Func.apply(a)  # 导致g2未定义
static setup_context(ctx, inputs, output)

定义 autograd.Function 的前向传播有两种方法。

要么:

  1. 使用签名 forward(ctx, *args, **kwargs) 覆盖 forward。 setup_context 未被覆盖。为反向传播设置 ctx 的操作发生在 forward 内部。

  2. 使用签名 forward(*args, **kwargs) 重写 forward,并重写 setup_context。设置用于反向传播的 ctx 发生在 setup_context 内部(而不是在 forward 内部)

参见 torch.autograd.Function.forward()扩展 torch.autograd 了解更多详情。

Return type

任意

static vjp(ctx, *grad_outputs)

定义一个用于反向模式自动微分的操作的微分公式。

此函数应由所有子类重写。 (定义此函数等同于定义 vjp 函数。)

它必须接受一个上下文 ctx 作为第一个参数,后面跟着与 forward() 返回的输出数量相同的参数(对于 forward 函数中的非张量输出,将传递 None),并且它应该返回与 forward() 的输入数量相同的张量。每个参数是关于给定输出的梯度,每个返回值应该是关于相应输入的梯度。如果输入不是张量或是不需要梯度的张量,你可以直接为该输入传递 None 作为梯度。

上下文可以用于检索在前向传递过程中保存的张量。它还具有一个属性 ctx.needs_input_grad,作为布尔值的元组,表示每个输入是否需要梯度。例如, backward() 将具有 ctx.needs_input_grad[0] = True,如果 forward() 的第一个输入需要相对于输出的梯度计算。

Return type

任意

static vmap(info, in_dims, *args)

在此处定义此 autograd.Function 的行为 torch.vmap()

对于支持torch.autograd.Function()torch.vmap(),你必须重写此静态方法,或者将generate_vmap_rule设置为True(你不能同时执行这两者)。

如果你选择覆盖这个静态方法:它必须接受

  • 一个 info 对象作为第一个参数。info.batch_size 指定了被 vmapped 的维度的尺寸, 而 info.randomness 是传递给 torch.vmap() 的随机性选项。

  • 作为第二个参数的 in_dims 元组。 对于 args 中的每个参数,in_dims 都有一个对应的 Optional[int]。如果参数不是张量或参数不被 vmapped 覆盖,则为 None,否则,它是一个整数 指定张量的哪个维度被 vmapped 覆盖。

  • *args,这与传递给 forward() 的参数相同。

vmap静态方法的返回值是一个包含(output, out_dims)的元组。 类似于in_dimsout_dims应该与 output具有相同的结构,并且为每个输出包含一个out_dim,用于指定输出是否具有vmapped维度以及其索引位置。

请参阅使用 autograd.Function 扩展 torch.func了解更多详情。

优云智算