IntegratedGradients源码阅读---基于深度学习可解释性框架Captum
首先,来到captum的github源码仓库
地址是:https://github.com/pytorch/captum
captum是一个用pytorch写的,实现了很多深度学习可解释性方法的库。包括IntegratedGradients、Deeplift、GradientShap等。
阅读源码可以使用git clone命令将代码仓库下载到本地,使用pycharm打开。进入文件夹执行pip命令,如下图所示。
可能会出现一些异常状况,要善用google解决。
接下来,就通过一个小例子开启对源码的阅读
首先引入必要的库,并设计一个小模型。
接下来,初始化模型的输入和IntegratedGradients方法所需要的baseline。
之后,使用两行代码完成解释,我们要做的,就是搞清楚这两行代码里面干了什么。
直接点进ig.attribute看看里面干了什么
首先从函数的参数说起
inputs不用说,要放入模型的输入
baselines:ig模型需要的baseline
target:对于分类模型来说,有很多类别,最终的解释是针对某一个类别对输入进行归因,所以这里是指定要对哪一个类别进行归因
additional_forward_args:顾名思义,是神经网络模型中,除了基本的输入,其他一些也需要放进模型中的参数
n_steps:
在ig中,是使用累加划分的方式来近似模拟积分的计算,而n_steps,就是将积分的起点到终点这段划分成多少份
method:这里的方法指的是近似积分的方法,涉及到数学上的知识,我们其实只需要直到这些方法的目的就是为了在起点到终点之间,生成n_steps个点,并为这些点分配权重,所有点的权重之和在1左右,然后我们就可以通过这些点来近似积分。
internal_batch_size:略过,不是很重要
return_convergence_delta:是否返回delta,这个delta其实跟论文中提到的Completeness性质有关,这个性质就是说样本点和基准点之间的差应该等于输入的各个特征的归因之和,用公式来描述如下图所示
这个delta就是用等式左边减去等式右边所得到的值,应该是尽量接近于0
接下来,通过这个函数得到归因值
进到这个函数里面
首先是计算得到step_sizes和alphas
这两个参数是用来模拟积分计算的,积分的计算是划分成许多份,对每一份计算再求合,step_sizes就是分配给每一份的权重,这些权重之和应该在1左右
alphas是n_steps个从0到1的点,用来计算从起点到终点不同位置的点
这个scaled_features_tpl就是将n_steps个点拼接到一起
接下来这一步进行梯度的计算
这个函数里面可以简单理解为就做了两步操作
先进行前向传播,再反向计算梯度
这个_run_forward函数里面就是进行前向传播,只不过它封装了一下,加了一些额外处理,所以稍显复杂,注意这里的output是跟target_ind有关的,并不是全部的输入,只会
返回target_ind那一列的输出
接下来,就是调用torch.autograd.grad函数进行反向传播,得到梯度。没有什么技巧,就是这么朴实无华
接下来,回到_attribute函数,scaled_grads就是对上一步得到的梯度乘以权重得到的
接下来,再把权重相加,把step_size那一维给去掉
比如本来得到的grads是50*2*3维度的,现在要进行sum操作,将50这个维度消去,将梯度变成2*3的
最后,再将梯度乘以一个(input-baseline)就计算完成了
如果选择计算delta的话,则最后还有一步计算delta的操作
源码阅读就到这里啦。