torch.autograd.functional.hessian

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

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

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

  • inputs (元组 of TensorsTensor) – 传递给函数 func 的输入。

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

  • strict (bool, 可选) – 如果设置为True,当检测到某个输入对所有输出没有影响时会引发错误。如果设置为False,对于这样的输入将返回一个全零张量作为 hessian 矩阵,这是数学上的期望值。默认为False

  • vectorize (bool, 可选) – 此功能尚处于实验阶段。如果你需要更稳定且性能更好的方案,请考虑使用torch.func.hessian()。在计算 hessian 矩阵时,通常我们每行调用一次autograd.grad函数。如果设置此标志为 True,我们将使用 vmap 原型功能作为后端来对autograd.grad的调用进行向量化处理,从而只需调用一次而不是每行调用一次。这在许多应用场景中可以提高性能,但由于此功能尚不完整,可能存在性能瓶颈。请使用torch._C._debug_only_display_vmap_fallback_warnings(True)来显示任何性能警告,并在你的应用场景存在警告时向我们报告问题。默认值为 False

  • outer_jacobian_strategy (str, 可选) – 海森矩阵是通过计算雅可比矩阵的导数来得到的。内部雅可比矩阵始终使用反向模式自动微分(AD)进行计算。设置策略为"forward-mode""reverse-mode"可以确定外部雅可比矩阵是否使用正向或反向模式 AD 计算。目前,在"forward-mode"中计算外部雅可比矩阵需要vectorized=True。默认值为"reverse-mode"

返回值

如果有单一输入,它将是一个包含该输入海森矩阵的单张量。如果输入是元组,则海森矩阵将是元组的元组形式,其中Hessian[i][j] 包含第 i 个输入和第 j 个输入的海森矩阵,其大小等于第 i 个输入和第 j 个输入大小之和。Hessian[i][j] 的数据类型和设备将与相应的第 i 个输入相同。

返回类型

Hessian (张量元组 of 张量)

示例

>>> 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)
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]]]], grad_fn=<ViewBackward>)
>>> 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.]])))
本页目录