首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测量令牌重要性的DistilBERT损耗梯度

测量令牌重要性的DistilBERT损耗梯度
EN

Stack Overflow用户
提问于 2020-04-20 16:04:42
回答 1查看 654关注 0票数 0

我试图访问DistilBERT中关于第一层中每个注意权重的损失梯度。当requires_grad=True时,我可以通过以下代码访问输出权重矩阵的计算梯度值

代码语言:javascript
复制
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

为了同样的目的,一个类似的问题在以下几个方面被问到,但这不是我的问题:伯特象征性的重要性衡量问题。毕业生都不是

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-21 08:26:26

默认情况下,只为参数保留梯度,基本上只是为了节省内存。如果您需要计算图的内部节点的梯度,则在调用backward()之前需要有相应的张量,并添加将在向后传递时执行的钩子。

PyTorch论坛的最小解

代码语言:javascript
复制
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在图本身中去掉它们之后,它们就会持续存在。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61326892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档