首页 > 解决方案 > 如何计算pytorch中的参数重要性?

问题描述

我想开发一个终身学习系统,所以我需要防止重要参数发生变化。我阅读了相关论文'Memory Aware Synapses: Learning what (not) to forget',提到了一种方法,我需要计算每个的梯度对应于每个输入图像的参数,那么我应该如何在 pytorch 中编写我的代码? “记忆感知突触:学习(不)忘记什么”

标签: pytorch

解决方案


您可以.backward()在损失函数上使用标准优化程序和方法来做到这一点。

首先,按照链接中的定义进行缩放:

class Scaler:
    def __init__(self, parameters, delta):
        self.parameters = parameters
        self.delta = delta

    def step(self):
        """Multiplies gradients in place."""
        for param in self.parameters:
            if param.grad is None:
                raise ValueError("backward() has to be called before running scaler")

            param.grad *= self.delta

可以像使用它一样使用它optimizer.step(),见下文(见评论):

model = torch.nn.Sequential(
    torch.nn.Linear(10, 100), torch.nn.ReLU(), torch.nn.Linear(100, 1)
)

scaler = Scaler(model.parameters(), delta=0.001)
optimizer = torch.optim.Adam(model.parameters())
criterion = torch.nn.MSELoss()

X, y = torch.randn(64, 10), torch.randn(64)

# Optimization loop
EPOCHS = 10
for _ in range(EPOCHS):
    output = model(X)
    loss = criterion(output, y)

    loss.backward()  # Now model has the gradients

    optimizer.step()  # Optimize model's parameters

    print(next(model.parameters()).grad)

    scaler.step()  # Scaler gradients

    optimizer.zero_grad()  # Zero gradient before next step 

scaler.step()param.grad为每个参数内部提供渐变缩放之后(就像在Scaler'sstep方法中访问的那些),因此您可以对它们做任何您想做的事情。


推荐阅读