PyTorch:仅针对参数子集计算 Hessian?

Posted

技术标签:

【中文标题】PyTorch:仅针对参数子集计算 Hessian?【英文标题】:PyTorch: Calculate Hessian only for a subset of parameters? 【发布时间】:2021-02-18 02:40:12 【问题描述】:

我正在编写ElasticWeightConsolidation 方法,为此我需要计算Fisher 矩阵。据我了解,Fisher 矩阵只是神经网络权重似然的 Hessian 矩阵。 torch.autograd.functional.hessian(func, inputs, create_graph=False, strict=False)有很好的功能

所以我想计算hessian(loss,weights),其中loss = torch.nn.CrossEntropyLoss()。我还准备了网络的权重,使其具有长的一维张量,以便有可能像这样简单地采用粗麻布的对角线元素:

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) 但问题是损失也需要目标,但我不想计算它们的粗麻布。任务是mnist分类,因此目标是整数0,...,9 如果我将y_train 添加到hessian(loss,inputs = (ans,y_train_01) 之类的参数中

它因“不能从整数中获取梯度”而崩溃。我也尝试制作y_train_01.requires_grad = False,但没有帮助。我知道损失也取决于y_train_01,但是在我的情况下,有什么方法可以确定目标是常量吗?

【问题讨论】:

【参考方案1】:

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

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 积的类似导数。

【讨论】:

以上是关于PyTorch:仅针对参数子集计算 Hessian?的主要内容,如果未能解决你的问题,请参考以下文章

定义一个函数以仅应用于作为参数传递的对象的属性子集[重复]

获取 pytorch 数据集的子集

如何在 PyTorch 中对子集使用不同的数据增强

-pytorch实现深度神经网络与训练

Hessian使用

pyTorch入门