Градиент потери DistilBERT для измерения важности токена - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь получить доступ к градиенту потерь в 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

Аналогичный вопрос для той же цели был задан следующий вопрос, но это не моя проблема: Проблема измерения важности маркера BERT. Град нет

1 Ответ

1 голос
/ 21 апреля 2020

По умолчанию градиенты сохраняются только для параметров, в основном только для экономии памяти. Если вам нужны градиенты внутренних узлов графа вычислений, вам нужно иметь соответствующий тензор перед вызовом 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 избавляется от них в самом графике.

...