PyTorch:使用nn.parameters()计算Hessian向量积
使用PyTorch,我想计算Hessian向量积,其中Hessian是某个神经网络的损失函数的二阶导数矩阵,该向量将是该损失函数的梯度向量 我知道如何计算正则函数的Hessian向量积,这要归功于。然而,当函数是神经网络的损失函数时,我遇到了麻烦。这是因为参数被打包到一个模块中,可通过nn.parameters()访问,而不是torch张量 我想做这样的事情(行不通): 以此类推,这(确实有效):PyTorch:使用nn.parameters()计算Hessian向量积,pytorch,Pytorch,使用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()