我试图访问DistilBERT中关于第一层中每个注意权重的损失梯度。当requires_grad=True时,我可以通过以下代码访问输出权重矩阵的计算梯度值
loss.backward()
for name, param in model.named_parameters():
if name == 'transformer.layer.0.attention.out_lin.weight':
print(param.grad) #shape is [768,768]其中model是加载的蒸馏器模型。我的问题是,如何获得有关SEP或CLS或其他标记的注意的梯度?我需要它在下面的链接中重现关于“基于梯度的特性重要性估计以引起对SEP的注意”的图形:https://medium.com/analytics-vidhya/explainability-of-bert-through-attention-7dbbab8a7062。
为了同样的目的,一个类似的问题在以下几个方面被问到,但这不是我的问题:伯特象征性的重要性衡量问题。毕业生都不是
发布于 2020-04-21 08:26:26
默认情况下,只为参数保留梯度,基本上只是为了节省内存。如果您需要计算图的内部节点的梯度,则在调用backward()之前需要有相应的张量,并添加将在向后传递时执行的钩子。
PyTorch论坛的最小解
yGrad = torch.zeros(1,1)
def extract(xVar):
global yGrad
yGrad = xVar
xx = Variable(torch.randn(1,1), requires_grad=True)
yy = 3*xx
zz = yy**2
yy.register_hook(extract)
#### Run the backprop:
print (yGrad) # Shows 0.
zz.backward()
print (yGrad) # Show the correct dzdy在这种情况下,梯度被存储在一个全局变量中,在PyTorch在图本身中去掉它们之后,它们就会持续存在。
https://stackoverflow.com/questions/61326892
复制相似问题