Используя PyTorch, я хотел бы рассчитать векторное произведение Гессиана, где гессиан является матрицей второй производной функции потерь некоторой нейронной сети, а вектор будет вектором градиентов этой функции потерь.
Я знаю, как вычислить векторное произведение Гессе для обычной функции благодаря этому посту .Тем не менее, я сталкиваюсь с проблемами, когда функция является функцией потерь нейронной сети.Это связано с тем, что параметры упакованы в модуль, доступный через nn.parameters (), а не тензор факела.
Я хочу сделать что-то вроде этого (не работает):
### 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()
В этом посте рассматривается аналогичная (возможно, та же проблема?) Проблема, но я не понимаю ее решения.