如何在 loss.backward() 之后立即获得梯度总和?

How can I get the sum of gradients immediately after loss.backward()?

我是Pytorch新手,正在尝试做一些重要性采样实验: 在评估时期,我计算每个训练样本的损失,并获得该训练样本的梯度总和。最后,我将根据他们引入的梯度对训练样本进行排序。例如,如果样本 A 显示出非常高的梯度和,则它一定是训练的重要样本。否则不是很重要的样本。

注意,这里计算的梯度不会用于更新参数。换句话说,它们仅用于选择重要样本。

我知道渐变会在 loss.backward() 之后的某处准备就绪。但是获取整个模型的梯度求和最简单的方法是什么?在我目前的实现中,我只被允许修改一个只有损失可用的小模块,所以我没有“输入”或“模型”。是否可以仅从“损失”中获得梯度?

反向后的梯度存储为需要梯度的张量的grad属性。你可以找到所有涉及的张量并总结它们的 grads。一种更简洁的方法可能是编写一个反向钩子,在反向传播时将梯度累积到某个全局变量。

一个例子是

import torch
import torch.nn as nn

model = nn.Linear(5, 3)
print(model.weight.grad)  # None, since the grads have not been computed yet
print(model.bias.grad)

x = torch.randn(5, 5)
y = model(x)
loss = y.sum()
loss.backward()

print(model.weight.grad)
print(model.bias.grad)

输出:

None
None
tensor([[-0.6164,  1.1585, -3.4117, -4.3192, -3.7273],
        [-0.6164,  1.1585, -3.4117, -4.3192, -3.7273],
        [-0.6164,  1.1585, -3.4117, -4.3192, -3.7273]])
tensor([5., 5., 5.])

如您所见,您可以通过 param.grad 访问渐变。如果 model 是一个 torch.nn.Module 对象,您可以使用 for param in model.parameters().

迭代它的参数

也许你也可以使用后向钩子,但我对它们不太熟悉,无法给出代码示例。