如何使用PyTorch计算偏导数?

时间:2018-07-24 13:34:15

标签: python machine-learning pytorch

我想使用PyTorch来获取输出和输入之间的偏导数。假设我有一个函数Y = 5*x1^4 + 3*x2^3 + 7*x1^2 + 9*x2 - 5,并且训练了一个网络来替换此函数,然后我使用autograd来计算dYdx1, dYdx2

net = torch.load('net_723.pkl')
x = torch.tensor([[1,-1]],requires_grad=True).type(torch.FloatTensor)
y = net(x)
grad_c = torch.autograd.grad(y,x,create_graph=True,retain_graph=True)[0] 

然后我得到一个错误的导数,例如:

>>>tensor([[ 7.5583, -5.3173]])

但是当我使用函数进行计算时,我得到了正确的答案:

Y = 5*x[0,0]**4 + 3*x[0,1]**3 + 7*x[0,0]**2 + 9*x[0,1] - 5
grad_c = torch.autograd.grad(Y,x,create_graph=True,retain_graph=True)[0]
>>>tensor([[ 34.,  18.]])

为什么会这样?

1 个答案:

答案 0 :(得分:2)

神经网络是universal function approximator。这意味着,对于足够的计算资源,训练时间,节点等,您可以近似 任何函数
在第一个示例中,如果没有关于如何培训网络的更多信息,我怀疑您的网络根本无法完全适合基础功能,这意味着网络的内部表示实际上是对< strong>功能不同!

对于第二个代码段,自动微分确实为您提供了 exact 偏导数。它是通过另一种方法来完成此操作的,具体请参见another one of my answers on SO,有关AutoDiff / Autograd的主题。