计算前向传播函数
def squad_pos_forward_func(input_ids, attention_mask, position=0):
pred = model(input_ids, attention_mask) # 获取预测结果
pred = pred[position] # 当 position 为 0 时,取的是起始位置所在的分布,为 1 时,取的是结束位置所在的分布
return pred.max(1).values # 取分布的最大值,即预测结果
pred[0],pred[1]就是起始位置的分布,是一个矩阵
from captum.attr import LayerIntegratedGradients
lig = LayerIntegratedGradients(
squad_pos_forward_func, model.distilbert.embeddings) # 输入前向函数以及模型中的某一层
# 对于输出答案初始位置,词向量层的贡献计算
attributions_start, delta_start = lig.attribute(inputs=input_ids, baselines=input_base,
additional_forward_args=(
attention_mask, 0),
return_convergence_delta=True)
# 对于输出答案结束位置,词向量层的贡献计算
attributions_end, delta_end = lig.attribute(