Shortcuts

torch.autograd.functional.hessian

torch.autograd.functional.hessian(func, inputs, create_graph=False, strict=False, vectorize=False, outer_jacobian_strategy='reverse-mode')[源代码]

计算给定标量函数的Hessian矩阵。

Parameters
  • func (函数) – 一个接受张量输入并返回包含单个元素的张量的Python函数。

  • 输入 (元组张量张量) – 函数的输入 func

  • create_graph (bool, 可选) – 如果 True,Hessian 将以可微分的方式计算。请注意,当 strictFalse 时,结果不能需要梯度或与输入断开连接。 默认为 False

  • 严格 (布尔值, 可选) – 如果True,当我们检测到存在一个输入,使得所有输出都与它无关时,将引发错误。如果False,我们返回一个零张量作为这些输入的海森矩阵,这是预期的数学值。默认为False

  • 向量化 (布尔值, 可选) – 此功能是实验性的。 如果您正在寻找更稳定且性能更高的替代方案,请考虑使用 torch.func.hessian()。 在计算海森矩阵时,通常我们会对海森矩阵的每一行调用一次 autograd.grad。如果此标志为 True,我们将使用 vmap 原型功能作为后端来 向量化对 autograd.grad 的调用,因此我们只需调用一次 而不是每行调用一次。这应该会在许多用例中带来性能提升, 然而,由于此功能尚未完成,可能存在性能瓶颈。请 使用 torch._C._debug_only_display_vmap_fallback_warnings(True) 显示任何性能警告,并在您的用例中存在警告时向我们提交问题。默认为 False

  • outer_jacobian_strategy (str, 可选) – 海森矩阵是通过计算雅可比矩阵的雅可比矩阵来计算的。内层雅可比矩阵总是使用反向模式自动微分计算。将策略设置为 "forward-mode""reverse-mode" 决定了外层雅可比矩阵将使用前向模式还是反向模式自动微分计算。目前,使用 "forward-mode" 计算外层雅可比矩阵需要 vectorized=True。默认为 "reverse-mode"

Returns

如果只有一个输入,这将是一个包含输入Hessian的单个张量。如果它是一个元组,那么Hessian将是一个元组的元组,其中Hessian[i][j]将包含第i个输入和第j个输入的Hessian,大小为第i个输入的大小加上第j个输入的大小。Hessian[i][j]将与相应的第i个输入具有相同的dtype和设备。

Return type

Hessian(Tensortuple 的 Tensors)

示例

>>> def pow_reducer(x):
...     return x.pow(3).sum()
>>> inputs = torch.rand(2, 2)
>>> hessian(pow_reducer, inputs)
tensor([[[[5.2265, 0.0000],
          [0.0000, 0.0000]],
         [[0.0000, 4.8221],
          [0.0000, 0.0000]]],
        [[[0.0000, 0.0000],
          [1.9456, 0.0000]],
         [[0.0000, 0.0000],
          [0.0000, 3.2550]]]])
>>> hessian(pow_reducer, inputs, create_graph=True)
张量([[[[5.2265, 0.0000],
          [0.0000, 0.0000]],
         [[0.0000, 4.8221],
          [0.0000, 0.0000]]],
        [[[0.0000, 0.0000],
          [1.9456, 0.0000]],
         [[0.0000, 0.0000],
          [0.0000, 3.2550]]]], grad_fn=)
>>> def pow_adder_reducer(x, y):
...     return (2 * x.pow(2) + 3 * y.pow(2)).sum()
>>> inputs = (torch.rand(2), torch.rand(2))
>>> hessian(pow_adder_reducer, inputs)
((tensor([[4., 0.],
          [0., 4.]]),
  tensor([[0., 0.],
          [0., 0.]])),
 (tensor([[0., 0.],
          [0., 0.]]),
  tensor([[6., 0.],
          [0., 6.]])))
优云智算