Press "Enter" to skip to content

初探Explainable AI

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

背景

 

动机

 

为什幺要研究模型解释相关的问题呢?事实上对于不同类型的机器学习应用,我们对于模型解释的诉求是很不一样的。对于一些已经被较好的解决的问题,例如OCR之类的场景中,人们并不需要模型对于预测给出任何解释。另一种情况是模型给出错误预测导致的cost较低时,例如推荐系统,闲聊机器人,照片滤镜等,哪怕给出的结果不满足用户预期,也不会有很大影响,所以也不太需要给出对应的解释。但在很多其它情况下,例如信用评估,医学诊断,销量预测等应用中,模型解释的需求就非常关键了。直观上来理解,在这些场景中,如果给出错误的预测结果,会造成较大的影响。

 

Doshi-Velez et al., 2017 这篇文章中,作者给出了更加系统性的定义:当我们对于问题的正式定义不完整时,会需要通过模型解释,引入人类判断来减小这个不完整性的差距。以信用评估为例,准确率并不是这个问题的完整需求,我们还希望算法给出的评估没有偏见或歧视,符合用户隐私保护的设定,或能向不符合信用条件的用户给出可执行的手段来帮助他们提升信用分等等。从广义上来考虑,模型解释是连接了算法与人类认知的一座重要桥梁。

 

具体来看模型解释能满足的一系列需求:

模型作为知识的来源。人类在学习知识时,往往也是通过一系列观察到的数据,进行归纳和演绎。在数据量巨大的情况下,模型可以很好的帮助人类来自动化的做类似的知识提取,然后以模型解释的形式反馈给使用者。
确保安全性。例如医学应用,自动驾驶等场景中,模型出现错误造成的损失是巨大的。通过模型解释,我们一定程度上能知晓模型给出预测的来源是什幺,并在此基础上提升其安全性。
检测模型偏见。前阵子在Twitter上就有对训练数据引起的模型偏差有过激烈的讨论,模型解释可以很有效的暴露这方面的问题,帮助我们提升其公平性。
提升用户接受度。在推进机器学习项目时,经常碰到的一个问题就是用户难以理解模型这类概率性输出的软件系统,引发不信任感。模型解释能给出依据,帮助用户理解并判断预测输出,在整体上帮助整个项目应用的落地。
协助模型开发管理中的调试和审核。在Software 1.0中,我们面对确定性的软件系统,有着非常多的辅助工具可以帮助我们进行调试和开发,例如各种debugger,profiler等。在Software 2.0中,面对复杂的数据和模型,非常缺少相应的工具让我们对模型的运作方式有深入的了解,导致很多时候大家调侃建模就是个“炼丹”过程。模型解释就是Software 2.0中的model development kit 🙂
结合人类与模型长处的重要桥梁。在算法不断演进的同时,其不足之处也越来越凸显,例如逻辑推理能力等方面的缺失。因此human-in-the-loop思想也逐渐兴起,在这个过程中怎幺更好的结合两者的能力,非常需要模型解释工具的支持。

当然模型解释也可能会带来一些副作用:

可解释性跟模型性能一定程度上是有矛盾冲突的,人很难理解多个因素的复杂交互关系。从更深层次看人类行为跟模型行为模式都很不一样,整个系统无法end-to-end训练,最后得到的结果也很可能不是最优的。
模型解释也给系统攻击者可乘之机。如果过多暴露模型决策细节,攻击者可以针对性的改变一些输入数据来骗过模型。例如在搜索引擎排名上就会有很多这方面的对抗,因此一般此类系统也不会主动暴露模型解释给用户。

模型解释分类

 

对于模型解释的方法有很多种分类方式。例如:

模型自带的可解释性 or 后处理的解释方法
适用于特定模型的解释方法 or 模型无关的方法
模型整体解释 or 对单条预测(局部)的解释

从模型解释的输出方面,大致有以下几种:

模型内部的信息。例如像线性模型的权重值,决策树的结构,神经网络的梯度信息等,天然就是一种模型解释。
特征统计信息。例如随机森林,GBDT等ensemble模型给出的特征重要度等。
数据点解释。例如使用某个类别的典型数据点或者类似数据点来解释模型给出这类预测的数据依据。
与可视化结合。在可视化技术加持下,一些原本过于复杂的数据信息也能够以较为直观的方式展现出来。

后续在模型解释技术的介绍中,我们会看到具体的例子。

 

什幺是好的解释

 

除了纯技术层面的考量外,另外还有一个很重要的角度是从模型解释的受众,一般也是对机器学习原理了解较少的业务人员出发,去看如何形成一个好的模型解释。这方面有一篇非常好的研究,来自于Miller, 2017,从人类对于信息接收和处理方面的一些特性来研究模型解释形式的问题。大致总结一下:

人们更倾向于对比性的解释。相对于一系列特征数据的阐述,对比的形式会更容易让人理解。例如模型说因为你的收入是xxx,工作年限是yyy,最近履约率是zzz,所以你的信用不够好,这对于用户来说还是难以理解。如果给出一个对比例子,例如信用普遍较好的人群,他们一般在工作年限上比你高多少,这样就明显清晰且有效得多。
解释需要有选择性。大多数情况下,人们对冗长但全面的解释并没有多少兴趣。一般来说,1-3个最重要原因的解释更能让人抓住重点,快速理解和接受。
解释需要考虑社会和受众因素。当模型解释被用于调试开发时,你面对的用户是专业的机器学习人员,其解释形式也可以相对的专业化数字化。而当你面对不了解机器学习技术的业务人员时,所需要的解释形式可能就完全不同了。
关注异常。对于贡献度接近的特征信息,人们往往会更关注相对来说异常和罕见的特征值。
常识与普适性。好的解释应该尽量符合常识,并有一定的普适性。例如一般来说,促销力度越大,销量会越高,房屋面积越大,售价会越高等。在使用一些复杂模型时,可能会因为非线性特性导致在部分区域出现反常识的解释,需要额外注意。

可解释的模型

 

线性模型

 

最典型的可解释模型,当属线性回归类模型。其一般形式如下:

从这个预测函数中我们可以直接对各个特征的贡献做全局性的解释,例如房屋面积特征的系数为10000,则表示面积每增加1平方米,预测售价会上升10000。

 

对于单个实例来说,特征的作用度是一样的,不过我们可以通过特征效应的分布图来观察某一个特定实例在总体中的分布位置如何,有一个更直观的理解:

逻辑回归(或其它广义线性模型)也是类似的情况,只不过由于增加了一个sigmoid函数,特征每增加1个单位,则输出的概率会乘以一个因子exp(β)。

 

线性回归的主要缺点在于模型本身只能表达线性组合关系,预测效果也比较一般。我们可以考虑几种解决方式:

构建高阶交互特征的形式来增强模型表达能力,这种情况下的解释难度会上升。
对数据分组,简化场景构建单独模型,来提升模型效果及可解释性。
使用GAM等复杂模型来增强非线性表达能力,例如fbprophet的各个component的解释。

另外,特征本身可能不是严格正交的,例如房屋面积跟房间数量可能有一定的线性相关性。这类情况下,模型学习出来的权重可能会不符合常理。如果为了更好的模型解释效果,可能需要牺牲一定的模型精度来对特征做精简选择。或者在进行解释时进行一些特征合并操作。

 

决策树模型

 

在特征交互与非线性预测方面,另一个同样具有很高解释性的模型就很有优势了,那就是决策树模型:

对于单个预测条目的解释,决策树非常直观的告诉了用户模型做出预测的过程。如果需要量化,可以通过每个特征用于分裂时产生的贡献值来计算。对于模型总体的解释,树模型可以利用每个特征分裂的信息增益量来进行统计计算。

 

树模型对于捕获特征之间的分组,交互等有非常天然的优势。但缺点也非常明显,例如模型本身的预测性能跟线性模型一样比较差,无法处理简单的线性关系。树模型的平滑度也比较差,会出现在分界点左右两边的两个实例给出的预测值有巨大的波动,不符合常理预期。另外当树的深度加大时,解释的复杂度也明显上升,理解难度加大。

 

决策规则

 

也有一类模型可以自动从数据中学习到决策规则,例如Holte, 1993提出的OneR,Cohen, 1995提出的RIPPER,Letham et al., 2015以及Yang et al., 2016提出的BRL/SBRL等。这些算法可以学习到一系列IF-THEN形式的决策规则,形式上与树模型会有些类似:

这类模型的解释性好,预测速度快,还带有一定的特征选择效果,能突出重点。主要问题在于基本只能处理分类问题,而且对于特征跟结果之间的线性关系不好把握。总体上这类方法目前见到的应用也比较少。

 

结合决策树与线性模型

 

从上面的分析可以看出线性模型跟决策树模型有着互补的长处,能否把两者结合到一起呢?在 Friedman et al., 2008 中,作者提出了RuleFit学习算法,能够从决策树中自动生成原始特征基础上的交互特征,后续加入到类似Lasso的稀疏线性回归模型中进行使用,可以在 这里 找到Python版本的实现进行尝试。后续还有Wei et al., 2019提出的generalized linear rule models,相比RuleFit有一定的效果提升。类似的还有 skope-rules 框架,也是从树集成中提取规则并进行过滤选择,在经典的泰坦尼克号数据集上可以达到如下效果:

其它可解释模型

朴素贝叶斯模型使用条件概率形式进行预测,我们可以比较容易的计算出每个特征在各个类别上的贡献度有多少。
kNN模型利用最近邻的数据点进行预测,因此我们可以使用相似的实例来给出解释。但是kNN无法给出全局特征上的解释,且在特征数量较大时解释的理解难度也较大。
Nori et al., 2019中提出的EBM,能够达到线性模型的解释性以及GBDT这类ensemble模型的预测精度,值得一试。
Wan et al., 2020中提出的NBDT,在神经网络的结构基础上,引入了层次聚类方法来形成类似决策树的层级结构(induced hierarchy),并设计了树结构损失来做fine tune,使得整体模型的运作会符合决策树的推断路径,最终形成可解释的预测结果。
Vaughan et al., 2018中提出的xNN也是利用特殊的网络结构来让神经网络模型具有一定的可解释性。目前只能应用在全连接网络上,而且相关的实现和应用看起来还比较少。

另外在神经网络这类可以获取到gradient的模型中,也有一些利用其运作特性而提出的解释方法。例如 Selvaraju et al., 2016 提出的Grad-CAM方法,利用对应类别在图片区域上的gradient激活强度来解释模型判别的原因。在《Deep Learning with Python》中就有简单的实现例子:

另外还有很多例子,可以参考cs231n里的资料。

 

相对来说RNN这块的解释性研究会少一些,例如 Strobelt et al., 2017 的LSTMViz和Ming et al., 2017的RNNViz,都是从网络中的hidden state出发来做可视化解释。具体看到的应用不多,而且repository也基本很久没有人来维护了。

最近几年流行起来的transformer模型,由于使用了attention技术,其模型的解释方面会相比RNN模型中的hidden state来的容易一些。相关的研究有Vig, 2019,以及相应的 github repo

 

模型无关方法

 

在实际工作中,我们往往会使用相对复杂的机器学习模型,例如SVM,随机森林,GBDT,深度学习等。他们背后使用的计算规则非常复杂,我们一般会以黑盒模型的方式来使用他们。对于这类模型,使用模型无关的解释方法就很有必要了。其大致的流程如下:

在黑盒模型做出预测的基础上,我们可以额外构建一个模型解释方法层,利用不同的技术手段来给出黑盒模型的运作细节。这里的一系列方法,我司的Kaggle大神@Young 同学已经有一篇非常好的总结文章,建议大家阅读。我在这里做一下简单的归纳和常用方法的介绍。

 

模型无关解释方法也可以分全局与局部解释两大分支。在局部解释方向,基本思路是通过改变黑盒模型的输入(特征部分),观察模型给出的输出,进而构建一些统计值,图表,或者代理模型来给出解释。而全局解释方向难度会更高一些,目前常见的方法主要是全局代理模型/模型蒸馏方向。

 

下面我们来具体看几个典型方法。

 

Permutation Importance

 

对于一个黑盒模型,我们怎幺来评判各个特征的重要度呢?permutation importance就是一个简单的方法。我们可以选择一个特征,然后把它的顺序打乱,再让模型进行一次预测,比对跟数据正常时的模型准确率的变化。如果效果下降越多,则说明这个特征越重要。是不是很make sense!当然这个方法局限性也很大,例如只能给出特征重要度,而无法给出具体的贡献。对于有相关性的特征,给出的重要度会有偏差。

 

LIME

 

这也是一个非常经典的方法,论文详见:Ribeiro et al., 2016。此人后续还有很多牛逼的工作,比如2020年ACL的best paper就是他的CheckList。LIME背后的思想是对于一个预测实例,我们可以对其各个特征做一些小范围内的改变,输入到模型后给出不同的预测。以这种方式就能形成一组在预测实例附近的采样及预测数据,我们再构建一个解释性较强的surrogate model(例如线性模型),就可以对模型的行为给出解释了。当然这里的特征改变也是需要一定的设计的,尤其是自然语言,图像这类问题,需要按照人类可以理解的方式来做数据变换。最后可以达到的效果如下:

LIME的主要局限还是在于只能给出模型局部的解释,而无法对模型整体有进一步的理解(也有一些全局surrogate model的方法)。另外其解释的稳定性,连续性方面也比较差,容易出现不一致或违反常理的解释。这位同学后面还有一些类似的工作例如Anchors,对于解释的拓展性有一定的改进,也可以一并了解一下。

 

Shapley

 

Shapley value的概念来源于博弈论,能够较为准确的计算出一个特征加入到模型时的边际贡献,进而对模型预测的各个特征的贡献度进行解释( Lundberg et al., 2017 )。与LIME一样,这个方法也可以给出每个特征的具体权重贡献,而不只是重要度。而且还可以结合多个数据点,做模型的整体性解释。再加上这个 shap库 的实现和漂亮的可视化,使得shap value的方法成为目前最常用的model-agnostic方法之一。

当然在实际使用过程中,对于背景数据,特征组合的选择等需要有更多的思考设计。

 

Global Surrogate

 

为了进行全局的模型解释,一个思路是把复杂的模型通过各种“降维”方式,保留最重要的信息并提升其可解释性。模型蒸馏就是其中的一种典型方法。在Frosst et al., 2017中,作者把神经网络通过模型蒸馏技术简化为决策树模型。而Tan et al., 2018中则采用了广义加性模型(GAM),来完成类似的模型解释任务。另外最有意思的要数Xu et al., 2018的DarkSight,结合了模型压缩和数据降维,让人们能通过可视化快速理解模型中的“暗知识”。

另外也有使用其它方法来训练全局代理模型的,例如IBM的这篇 Dhurandhar et al., 2018 中提出的ProfWeight等。

 

基于样本的解释

 

在前面阐述什幺是好的解释的部分,我们提到过人类倾向于通过对比来理解很多概念和事物,因此通过具体的样本来给出模型解释也成了一种很自然且有效的做法。例如kNN方法就是一种使用样本来解释的典型,在这一节中,我们将看到更多模型无关的基于样本解释的方法。

 

反事实解释

 

反事实解释按以下形式描述了一种因果关系:“如果没有发生X,那幺Y就不会发生”。应用到模型解释上,我们希望达到的效果是找到将预测更改为预定义输出时特征值的最小变化,用来解释模型的行为。技术细节方面,可以参考 Dhurandhar et al., 2018 和Luss et al., 2019。对于这个反事实example,一般我们还需要让它相对于原实例改变的特征数量尽量少,且改变的值在一个合乎常识的范围。例如对于信用预测,你不能给出一个反事实例子说当你的年龄到达255岁时,你就会被划分为高信用人群 🙂

 

到具体的实现方面,可以参考 alibi 。另外像前面提到的Anchor可以理解为反事实解释的一个反操作。

对抗样本

 

对抗样本的概念跟反事实解释非常类似,只不过在对抗样本的研究中,主要是用各种方法来攻击算法模型来让其给出错误的预测。这方面的报道非常多,像什幺one pixel attack(Su et al., 2017),通过贴纸/眼镜来让物体识别/人脸识别失效(Brown et al., 2018,Sharif et al., 2018),甚至还有3D打印的真实物体让模型给出错误预测的研究(Athalye et al., 2017)。当然也有一些大佬认为对抗样本并不是真实世界中会出现的物体,我们不必过度担心。但个人感觉在一些关键系统应用中,如何提升模型的可靠性,不让其容易被攻击欺骗,还是一个值得深入研究的课题。

 

原型样本

 

原型指的是能够较好的代表所有数据的样本,与之对应的概念是批评(Criticisms),类似于不能够被原型很好代表的那些outliers。像k-means算法找到的各个cluster的中心点就可以作为一种原型。这方面比较经典的方法来自于Kim et al., 2016。后续在 Gurumoorthy et al., 2017 中扩展了这个思路,对于找到的样本赋予权重值,可以在一个框架中同时表达原型与批评样本。使用这种技术可以比较好的让我们对数据分布有更清晰的认知,可以把训练好的模型在原型和批评数据点上进行预测,查看是否有模型没有覆盖到的薄弱之处。这类对数据进行归类,降维,异常检测的手段实际上也是模型解释中的重要组成部分。

有影响力的实例

 

在训练过程中,当我们删除某一个训练数据点时,可能会大幅改变模型的参数,如下图所示:

这个模型解释的思路是从构建模型的数据出发来进行修改和测试,与之前在已有模型上修改特征值测试的方法很不一样。同样,这个方法既可以考察单个数据点对全局模型参数的影响程度,也可以给定一个预测条目,来寻找对它影响最大的训练数据点是哪个。在模型诊断调试中,这个方法显得尤为有用。

 

不过这个方法有一个比较大的缺点是为了找到有影响力的实例,需要依次移除数据点,重新训练模型来评估,所耗费的计算量将是巨大的。在Koh et al., 2017中,作者利用模型的gradient来建立影响函数,可以在不重新训练模型的情况下近似计算数据点对模型参数造成的影响。整体来看这个方法背后的想象空间还是挺大的,例如可以用类似的思路去考察移除或增加某个训练样本对模型精度的影响如何。但由于其计算复杂度,使用的模型类型(参数可微)等方面的限制,目前还没有见到这个方法的大规模应用。

 

模型解释工具及应用

 

在实际项目中经常使用的工具框架有:

Microsoft interpret
IBM AIX360
eli5
shap
PDPBox

具体的使用方式就不在这赘述了,感兴趣的同学可以查看相关文档和示例教程。

 

模型解释目前主要的应用方向可以归纳为以下几点:

模型开发调试
获取知识,指导决策
建立信任,确保公平性,安全性

我们以模型开发调试为例来简单介绍一下。例如在验证一个预测模型时,我们发现在训练集和验证集上给出的预测分布相差较大,例如验证集上的预测均值只有训练集上的70%左右。一般在这种情况下,我们通常的做法是检查模型的输入数据在这两个集合上的分布是否有明显的不同。这种方法会有几个困难:

特征数量可能较多,需要比对量较大
数据分布相似度的量化有一定困难,还可能涉及到归一化操作等
数据分布的差距,到模型预测的差距之间,还会有一定的gap

这时候利用上模型解释技术,就很方便了。我们只需要分别得出在训练集和验证集上各个特征的具体贡献度,计算一下diff再排一下序,就能一目了然找到贡献度差距最大的特征是哪些,迅速缩小排查范围。

 

着眼未来

 

目前模型解释方面的算法成熟度,框架便利性,以及算力数据方面的挑战还很大,可以说总体还是在一个起步阶段。放眼Software 2.0时代,模型解释作为算法系统的“UI”和“Development Kit”的重要组成,显然是一个非常重要的技术方向。我们观远数据也在业界落地前沿算法的同时,积极投入模型解释的相关研究与应用尝试,取得了一定的进展。欢迎有兴趣的同学加入我们,一起升级打怪,开拓决策智能的广阔天地!

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注