python - PyTorch:仅针对参数子集计算 Hessian?
问题描述
我正在编写ElasticWeightConsolidation
方法,为此我需要计算 Fisher 矩阵。据我了解,Fisher 矩阵只是神经网络权重似然的 Hessian 矩阵。有很好的功能torch.autograd.functional.hessian(func, inputs, create_graph=False, strict=False)
所以我想计算hessian(loss,weights)
where 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
,但是在我的情况下,有什么方法可以确定目标是常数吗?
解决方案
您可以创建一个新的“包装器”函数,其中目标是固定的:
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)
由此产生的二阶偏导数将等效于该位置处的全 Hessian 积的类似偏导数(features_vals, fixed_targets)
。
推荐阅读
- javascript - 使用 queryselector 查找“:”会返回错误
- azure - 如何从 powershell 中的服务总线消息中获取消息正文?
- sql - 缩放 CASE WHEN 以检索非节假日日期
- wordpress - 如何在 YITH MULTI VENDOR 和 YITH AFFILIATE 中添加产品类别明智佣金
- asp.net-core-mvc - 在 .NET Core MVC 上创建模糊路由
- javascript - 如何使复选框用作多选选项?
- javascript - Typescript 属性 'property' 不存在于类型 'void | 示例
- go - 过滤具有与 GORM 的 has_many 关系的查询?
- asynchronous - 在 Flutter 中创建异步验证器
- python - 如何解决瓶鼻获取空对象的错误:预期的字符串或类似字节的对象