PyTorch:使用nn.parameters()计算Hessian向量积

PyTorch:使用nn.parameters()计算Hessian向量积,pytorch,Pytorch,使用PyTorch,我想计算Hessian向量积,其中Hessian是某个神经网络的损失函数的二阶导数矩阵,该向量将是该损失函数的梯度向量 我知道如何计算正则函数的Hessian向量积,这要归功于。然而,当函数是神经网络的损失函数时,我遇到了麻烦。这是因为参数被打包到一个模块中,可通过nn.parameters()访问,而不是torch张量 我想做这样的事情(行不通): 以此类推,这(确实有效): 解决了一个类似的(可能是相同的?)问题,但我不理解解决方案。您说的是它不起作用,但没有显示您遇到的

使用PyTorch,我想计算Hessian向量积,其中Hessian是某个神经网络的损失函数的二阶导数矩阵,该向量将是该损失函数的梯度向量

我知道如何计算正则函数的Hessian向量积,这要归功于。然而,当函数是神经网络的损失函数时,我遇到了麻烦。这是因为参数被打包到一个模块中,可通过nn.parameters()访问,而不是torch张量

我想做这样的事情(行不通):

以此类推,这(确实有效):


解决了一个类似的(可能是相同的?)问题,但我不理解解决方案。

您说的是
它不起作用
,但没有显示您遇到的错误,这就是为什么您没有得到任何答案

torch.autograd.grad(输出、输入、grad\u输出=无、保留\u图形=无、创建\u图形=假、仅\u输入=真、允许\u未使用=假)

输出和输入应为张量序列。但是你 仅使用张量作为输出


这意味着你应该传递一个序列,因此传递
[y]
而不是
y

为了澄清,你想为网络中的每组权重计算海森值吗?在这种情况下,您的模型有两组权重:权重矩阵
w
和偏差向量
b
。正确-我希望能够对w和b中参数的展开向量取导数wtf(称之为θ)。
### a simple neural network 
linear = nn.Linear(10, 20) 

x = torch.randn(1, 10) 

y = linear(x).sum()
### compute the gradient and make a copy that is detached from the graph 
grad = torch.autograd.grad(y, linear.parameters(),create_graph=True)

v = grad.clone().detach()
### compute the Hessian vector product 
z = grad @ v 
z.backward()
x = Variable(torch.Tensor([1, 1]), requires_grad=True)

f = 3*x[0]**2 + 4*x[0]*x[1] + x[1]**2

grad, = torch.autograd.grad(f, x, create_graph=True)

v = grad.clone().detach()

z = grad @ v

z.backward()