PyTorch:仅为参数子集计算Hessian?

2024-05-29 08:03:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写ElasticWeightConsolidation方法,为此我需要计算Fisher矩阵。据我所知,Fisher矩阵只是通过神经网络的权值来表示可能性的Hessian矩阵。有很好的函数作为torch.autograd.functional.hessian(func, inputs, create_graph=False, strict=False)

所以我想计算hessian(loss,weights),其中loss = torch.nn.CrossEntropyLoss()。我还准备了网络的权重,这样它就有了长1D张量,可以简单地取hessian的对角元素,如下所示:

def flat_param(model_param = yann_lecun.parameters()):
  ans_data = []
  ans_data = torch.tensor(ans_data, requires_grad=True)
  ans_data = ans_data.to(device)
  for p in model_param:
    temp_data = p.data.flatten()
    ans_data = torch.cat((ans_data,temp_data))
  return ans_data

ans = flat_param(yann_lecun.parameters())

然后我试着这样做:hessian(loss, inputs = ans)但问题是损失也会占用目标,但我不想计算其中的hessian。任务是mnist分类,因此目标是整数0,...,9 如果我将y_train添加到参数中,比如hessian(loss,inputs = (ans,y_train_01)

它被“不能从整数中取梯度”这几个字弄得支离破碎。我也试着做了y_train_01.requires_grad = False,但没用。我知道损失也取决于y_train_01,但在我的例子中,有没有办法确定目标是常数


Tags: false目标datamodelparamtrain矩阵torch
1条回答
网友
1楼 · 发布于 2024-05-29 08:03:57

您可以创建一个新的“包装器”函数,其中目标是固定的:

def original_model(features, targets):
    ...
    return ...

def feature_differentiable_model(features):
    fixed_targets = ...
    return original_model(features, fixed_targets)

然后打电话:

hessian(feature_differentiable_model, features_vals)

由此得出的二阶偏导数将等效于(features_vals, fixed_targets)位置处全Hessian积的类似偏导数

相关问题 更多 >

    热门问题