【问题标题】:PyTorch: Higher order derivates of bivariate functionPyTorch:双变量函数的高阶导数
【发布时间】:2021-04-27 21:54:20
【问题描述】:

假设我有一个二元函数f(x,y) 和域R^d x R^d,我有两组输入X = [x1,x2,...,xm] Y = [y1,y2,...,yn],其中每个xiyjd 维向量和我想用i,jth 元素[f(xi,yj)]_ij 计算矩阵。我可以在 PyTorch 中通过广播和执行f(X.unsqueeze(1),Y) 之类的操作来做到这一点。

我真正想要计算的是以下矩阵: [d/dx d/dy f(xi,yj)]_ij,我假设每个 xiyi 都是标量值。我将如何在 PyTorch 中做到这一点?

我知道对于单输入函数和一阶导数,我可以执行类似的操作(使用 PyTorch 的 autograd.grad):

def derivative(x,f):
    return grad(f(x).sum(), x, create_graph=True)[0]

或者:

def derivative(x, f):
    return grad(f(x), x, grad_outputs=torch.ones(x.shape),create_graph=True)

但是,我无法推广到二维和更高导数的输出情况!任何帮助将不胜感激。

【问题讨论】:

  • 你能提供一个示例函数及其输入吗?顺便说一句,你需要一个雅可比矩阵。
  • @kmario23 jacobian 是一阶的,OP 想了解高阶导数(例如,如下所示的 hessian),至少我是从:However, I am unable to generalise to the two-dimensional and higher derivative output case 得到的,如果不是你是对的。

标签: python pytorch gradient mathematical-optimization autograd


【解决方案1】:

PyTorch's autograd docs 所示,您可以计算函数的hessian(二阶偏导数),其输入与您所做的类似:

import torch


def pow_reducer(x):
    return x.pow(3).sum()


inputs = torch.rand(2, 2)
hessian = torch.autograd.functional.hessian(pow_reducer, inputs)

这里是documentation for Hessian specifically

【讨论】:

  • 谢谢!除非我弄错了,否则我不需要 Hessian 的原因有很多:1)我只需要 x_i 和 y_j 点的交叉导数 d/dx d/dy f(x,y)。 2)在更高的维度上,我需要高于二阶导数,例如在二维中,我需要 d/dx_1 d/dx_2 d/dy_1 d/dy_2 f([x_1,x_2],[y_1,y_2])。
  • @TimothyHedgeworth 您可以为 Hessian 使用多个 inputs(变量),我认为没有其他方法(如果我错了,请有人纠正我)。不确定高阶导数(除了链接grad 用于逐点Nth 阶导数)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
相关资源
最近更新 更多