HeptaAI的回答
泻药。之前做了有关vanilla gradient和integrated gradient这两个可解释性方法的tutorial,总结起来都是用输出对输入的各个特征做梯度,然后求出这个特征对于输出的影响。这一族方法因为都是基于梯度的,所以被称为基于梯度的方法。这个tutorial我们来介绍一下另一族可解释性方法:扰动法。
扰动,顾名思义,就是对输入中的某个特征做一些改变 ,然后重新跑一遍模型,观察输出的变化 ,然后根据这里的
做计算来得出模型的工作原理。因此,基于扰动的方法只要做一遍前向过程即可。改变导致对输出的变化更大的特征,在计算上就是重要性更大的特征。
比较常用的扰动法attribution是遮挡法(occlusion)。这个方法其实之前在很多ML模型上已经用过了,方法很简单,就是将输入像素的一部分 zero掉(遮挡掉),观察输出的变化
。输出的变化越大,那么这一部分的重要性就越强。
具体这一部分怎么选,文章做了多种尝试,主要是有关用于遮挡的mask的window_size的。从下图可以看出,当size为15*15的时候获得了最好的效果。
遮挡法的优势是不需要反向传播,所以实现起来比较简单,运行速度也比较快。但是这个mask size的选取很是问题,造成鲁棒性比较差,需要大量engineering work。
如果对文本做Occlusion,方法也是类似的,一个word作为一个特征。在遮挡的时候把一个word的一整条embedding都置0,然后对每一个word都做一次,根据 就能获得相对重要性。
有关LIME,很多网上的教程说的非常隐晦,例子也举的一塌糊涂,我在这里仔细讲一下。其实看paper里面的一张图就能理解地差不多了。我们拿下面这张图解释这个算法:
这张图显然是一个二维的分类问题,横纵轴为 和
,红色代表正值点,蓝色代表负值点。这里的红色和蓝色组成的就是一个黑盒分类器
,交界就是决策边界。红色高亮的+号为LIME算法选择的采样点
,LIME希望获得在这个采样点附近
的决策边界。为了解释特征,LIME会选取
个需要解释的interpretable components作为伴随模型
的变量,这个
是可以调的。interpretable component就是解释特征用的变量,可以理解成特征的另一种表示。然后LIME会在要解释的采样点
附近选取
个扰动点
,在图中就是红色加号(值为正)和蓝色圆圈(值为负)。红色加号或蓝色圆圈越大,说明离采样点越近;越小表示离采样点越远(由于越近的扰动点越能代表采样点附近的局部行为,所以越近的点的样本权重越大,画的符号也更大)。最后,只要把这几个扰动点在黑盒分类器
上跑,然后把获得的结果集合
当成训练集去训练可解释的伴随模型
即可。
换句话说,给出一个二维黑盒分类器 ,LIME在尝试学习一个伴随模型
,使得这个伴随模型能够在采样点
附近局部强拟合黑盒分类器
的行为。由于这个伴随模型可以解释interpretable components,而interpretable component可以解释特征重要性,所以一个伴随模型可以局部解释黑盒
的行为。在日常使用中,我们也往往是对某一个sample进行分析来看看模型有没有问题的,所以局部可解释性其实已经满足了大部分需求。
现在大家肯定理解了,伴随模型的训练集为什么要叫“扰动点”?因为对于一组采样点 ,我们可以获得一些这个点附近的点
来获得黑盒模型
的扰动输出
来让伴随模型
学习。这些扰动点是通过扰动interpretable components推出来的。
现在还有最后一个,也是最重要的一个问题,如何获得特征重要性?这里要注意, 的输入不是采样点
,而是某个特征是否被更改的表示
,每一个
都代表一个“可解释组件”。如果
,则这个可解释组件对应的那几个特征会变成一个baseline值(例如采样数据集中这个特征的正态分布);反之不变。因为
是一个足够可解释的简单模型(例如查找表、树模型、岭回归等),所以通过
表达式中各个可解释组件的系数(重要性),就能很轻松地求出原来的特征重要性。
我自己做了一个总体的流程图如下:
其实比较一下Occlusion和LIME会发现这俩非常相似,本质上思路是共用的,都是对某一个特定的输入样本,计算某些特征改变(扰动)后输出的变化,从而挖掘这个特征对于输出的重要性。