【问题标题】:Pytorch - How differentiate wrt two parametersPytorch - 如何区分两个参数
【发布时间】:2021-08-27 07:36:58
【问题描述】:

我对使用 Pytorch 的组合导数感兴趣:

在下面实现的代码中,我已经尝试过了,但是代码计算了两个偏导数(例如,它首先计算 d'f/d'x,然后计算 d'f/d'y)。是否有可能以某种方式修改代码,以便我们可以计算关于两个参数的这个导数?

import torch
def function(x,y):
    f = x**3+y**3
    return f

a =  torch.tensor([4., 5., 6.], requires_grad=True)
b =  torch.tensor([1., 2., 6.], requires_grad=True)
derivative = torch.autograd.functional.jacobian(function, (a,b))
print(derivative)

提前致谢!

【问题讨论】:

  • 你为什么复制你的question
  • 您好,非常感谢您的回答。因为出错@Ivan,我已经删除了上一个
  • 你所说的d'f/d'x,是w.r.t的一阶导数吗? x?
  • 是的,不幸的是我不能直接在stackoverflow上写公式@Ivan

标签: python pytorch gradient tensor derivative


【解决方案1】:

您可以使用torch.autograd.functional.hessian 获得组合导数。

>>> f = lambda x, y: (x**3 + y**3).mean()
>>> H = A.hessian(f, (a, b))

由于您有两个输入,因此结果将是一个 tuple,其中包含 2 个 tuples。

更准确地说,你将拥有

  • H[0][0] w.r.t 的二阶导数 x: d²z_i/dx_j*dx_j

  • H[0][1] xy 的组合导数:d²z_i/dx_j*dy_j

  • H[0][1] yx 的组合导数:d²z_i/dy_j*dx_j

  • H[1][1] w.r.t 的二阶导数 y: d²z_i/dy_j*dy_j


>>> H
((tensor([[ 8.,  0.,  0.],
          [ 0., 10.,  0.],
          [ 0.,  0., 12.]], 
  tensor([[ 0.,  0.,  0.],
          [ 0.,  0.,  0.],
          [ 0.,  0.,  0.]]),
 (tensor([[ 0.,  0.,  0.],
          [ 0.,  0.,  0.],
          [ 0.,  0.,  0.]]))
  tensor([[ 2.,  0.,  0.],
          [ 0.,  4.,  0.],
          [ 0.,  0., 12.]])

确实,如果您查看组合导数:d²(x³+y³)/dxdy = d(3x²)/dy = 0,因此H[0][1]H[1][0] 是零矩阵。

另一方面,我们有d²x³/d²x = 6x,因为f 是对这些值进行平均,所以它给出了6x/3 = 2x。同样,您会得到d²x³/d²y = 6y

因此,您会发现 H[0][0] = diag(2a)H[1][1] = diag(2b)

【讨论】:

  • 非常感谢,但是这个“hessian”只适用于用“lambda”定义的函数吗?如果我有一个函数,比如我的例子中的“def function(a,b)”呢?
  • 当然,您可以将您的函数定义为def ...。请记住,您需要为 f 返回一个标量值。
猜你喜欢
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多