写在前面:
在腾讯安全的产品团队,随着产品的不断丰富,算法工程师面临越来越多的算法解释性问题。例如我们做流量侧的异常检测,不仅要给出算法判定的异常流量对,还要给出异常指标、给出大盘数据分布情况、要能够拉出原始流量,还要给出友好的解释语言,例如http流量中,某个通信对用了较多不常见的UA,且一直返回失败等。更复杂的情况,面对深度模型、集成模型等,我们也需要给用户提供有指导意义的、准确的样本解释。
起初在面对解释复杂模型的问题时,我曾一度认为这件事情是不可行的,起码不应该由工业界的人来做,因为当时理所当然的认为这是机器学习的理论研究范畴,而像深度模型的理论研究,众所周知的没有什么进展。而后,有一次跟别人讨论模型可解释性的问题,有同事简单介绍了模型无关的解释方法的思想,当时还认为“模型无关的解释”没有逻辑。但是后来,事实证明“模型无关的解释”完全可行,并且在一些产品中,该类解释方法更有实际价值。之后,为了扫除这个知识盲区,系统的了解了一下对这个问题的研究与成果,在这里尝试概括性的输出一下,正文如下:
引言:
无论是对于使用机器学习服务的用户,还是研发机器学习模型的算法工程师,机器学习的可解释性都是十分重要的。对于用户而言,由于许多关键的系统、服务都逐渐开始使用机器学习技术,例如人脸识别认证、信贷业务评审、视频内容审核、智能语音服务、智能医疗等,用户尤其是被“拒绝”的用户十分需要充足的理由来帮助他们理解自己为什么被拒绝。“如果我认为我是一个良好公民,而某一天突然被高铁站的人脸识别拒绝而导致我乘不了高铁,并且不附带任何解释,那么无论如何都是不可接受的,这对整个社会来说都将会是个灾难。”而对于算法工程师而言,理解模型更是一种基本素养,它可以帮助优化模型、控制模型,从而避免模型不可控的情况“在一些关键的服务中,模型不可控是非常可怕的”。
本文主要基于“interpretable machine learning”的内容,结合实际的产品研发,做了新的梳理,希望能帮助机器学习在产品中的良好落地。本文将内容组织为:(1)确定解释的程度;(2)选用合适的解释方法;(3)具有代表性的解释方法;(4)解释中用到的可视化手段;四个主要部分。
一、确定需要解释到哪种程度
当要解释模型的时候,首先需要考虑的是对“谁”解释,解释什么问题。这个决定了我们需要对模型解释到哪种程度,也会很大程度上影响我们选用的解释方法。明显的,当我们面对关键的服务,例如银行、医疗、安防、交通等,与面对一般的服务,例如推荐、匹配等,其需要解释的程度是不一样的。关键服务对可解释性的要求较高,而一般服务则没有那么强。另外,当给算法工程师做模型解释服务时,需要在特征及特征交互、联合概率等极细粒度的尺度上去做,以保证严谨和灵活性。
二、选用怎样的解释方法
目前的模型解释方法已经有一些成果,不过他们在解释类别、解释效果、计算量等方面大有不同。在介绍具体的解释方法之前,首先总结现有的研究结论,将这些方法做一个分类梳理,如下:
分类依据
类别1
类别2
(1)是否本质上可解释
本质上可解释
本质上难解释(事后解释)
(2)是否针对特定模型
基于特定模型的解释
模型无关的解释
(3)是否针对全局样本
针对局部样本的解释
全局样本的解释
(1)本质上是否可解释:
A:本质上可解释:
它指的是在应用中,由于使用了结构简单、容易理解和分解的模型,而使得对结果的解释可以基于模型本身的结构构成、计算逻辑进行解释。例如线性模型一类方法的预测结果可以简单视为多个特征的加权和,而树模型一类的方法可以视为多条规则的组合等。在实际中,如果对模型可解释性要求比较高,则可以直接选用较为简单的模型进行开发。
B:本质上难解释(事后解释):
由于模型复杂度和模型能力是息息相关,所以实际应用中,为了得到更好的性能,我们很多情况下不得不用一些复杂的模型,这也导致了模型结果缺乏可解释性。
事后解释指的是针对这些较复杂的、本质上不可解释的模型,例如深度模型、广义非线性模型等,进行样本解释的一类方法。它的思路是,既然原模型不可解释,那就先忽略掉原模型,仅仅基于它的输出,进行基于样本或利用代理模型进行解释。由于实际中大部分的模型都是难解释的模型,因为该类方法也是使用的最为广泛的一类方法。
(2)是否是针对特定模型的解释:
A:基于特定模型的解释:
它指的是针对某种特定类型的模型进行解释,从而针对性的解决特定模型输出结果的解释方法,该模型一般适用于本质上可解释的模型,并且通用性较低。
B:模型无关的解释:
它指的是不管训练过程用了哪种模型,都可以对结果进行解释,与事后解释的方法类似,使用的较为广泛。
(3)是否支持对全局样本的解释:
A:针对局部样本的解释:
它指的是针对某些样本,进行单独的解释,该类方法一般会依赖目标样本及其邻域进行解释,例如利用代理模型、数据原型等方法解释目标样本,但该类方法由于仅仅依赖部分样本,也导致它不能通用到每一个样本身上,需要对每一个样本进行单独的解释训练。如经典的LIME方法就是针对局部样本的解释。
B:全局样本的解释:
该类解释方法能够适用于面对的所有样本,具有通用性。本质上可解释的模型,一般可以进行全局样本的解释。
(之前理解固执的认为解释模型只能从本质上进行解释才叫解释,经过了解之后,发现模型无关的解释才比较值得期待。之前可能还是太算法思维了。)
三、具有代表性的解释方法
以下简单介绍下几种代表性的解释方法的核心思想,不涉及细节。
(1)针对线性模型的解释
这里指的线性模型是g=f(a0+a1*x1+a2*x2+...+a9*x9),其中f为一个单调映射函数。特别的,当f为x-》x的映射时,g是一个线性回归模型,而f是一个概率映射时,g是一个逻辑回归模型。
由于线性模型具有“输出与特征的加权和相关”的特点,所以线性模型中可以很方便的拆解各个特征。针对线性模型,一种普遍的研究思路是“将单独一个特征的取值增加一个单位,而保持其他特征的取值不变,以观察输出的变化”。类似于一个偏导的概念。该偏导数能够说明某个特征对输出的影响,从而解释样本。
但线性模型也有问题,它要求“单独增加一个特征的值,而保持其他的特征取值不变”,这个要求会使得产生一些不合理的数据样本,从而使得解释具有一定的偏差。
(2)树模型
树模型的工作模式为根据特征的取值进行样本划分,最后使得每个区域的样本满足截止条件。树模型的工作模式比较简单,因此针对树模型的解释只需要简单的将样本划分过程可视化出来即可得到不错的效果。(线性模型和树模型常用作其他黑盒的代理模型)
(3)反事实解释
反事实解释的表述模式为“如果发生X,那么Y就会发生。”它寻找到Y结果的边界,并基于已有的数据样本,做最小的特征改动,越过边界,以生成反事实来进行解释,并且为了解释的效果,通常会选择一些符合常识、明显的特征生成反事实。例如解释银行贷款的场景时,可以使用该解释方式,“如果小明年龄大于25岁,那么他会申请到贷款。”反事实解释比较重视样本间的对比性,解释通俗易懂,比较友好。
(4)原型与批判
原型解释是面向算法工程师的一种解释方法,它能够帮助算法工程师了解数据分布。它的思路是在密度较高的区域寻找到原型,距离原型较远的数据点为批判。由此可见,原型与批判是一种基于密度的方法,它将质心当作原型,离群点当作批判。将该思路用到可解释性上时,算法工程师可以直接将原型和批判样本点分别打印出来,以理解数据分布。例如在做性别分类的时候,查看原型是否分别是两个性别的代表,而批判则可以帮助算法工程师理解,是什么样的badcase。(数据分布本身就是决定机器学习性能的因素,因此基于原型与批判的方法虽然看上去不是直接解释模型的方法,但实际却是很实用的方法,因为直接把正例和反例拉出来做对比很直观)
(5)基于相似度的解释
推荐系统中经常使用该类方法做推荐解释,例如购买A的人也购买了B,你的朋友小明点评了这个电影等。基于相似度的解释是非常友好的一类方法,但它比较依赖用户对参照实体的理解,例如假如没有朋友小明,就无法根据参照物做出解释。
(6)LIME方法
LIME是一种基于模型代理的局部样本解释方法,思路是针对要解释的样本点,重新在样本点处建立一个本质上可解释的模型。在建立代理模型的时候,使用的是原模型的输入和输出,将待解释样本点附近的点赋予较大的权重,并将拟合原模型的输出作为代理模型的优化目标。得到代理模型之后,再基于代理模型进行样本的解释。需要注意的是,LIME方法是基于特定样本的解释,这意味着,在某个样本点训练的代理模型,不能使用到其他样本点上。对于所有待解释的样本,LIME方法都需要重新训练代理模型,这在实际中导致了较大的计算量。
(7)Shapley值
Shapley值是另一种比较经典的解释方法,并且它是唯一具有扎实理论的解释方法。它使用全部的特征作为输入,并将特征之间的所有可能组合作为联盟。一个联盟指的是特征之间的一种组合。Shapley值指的是所有可能的联盟中特征值的平均边际贡献。对于这些联盟中的每个联盟,我们都计算带有或不带有某个特征取值的预测值,并取其差值,以获得边际贡献。Shapley值是边际贡献的(加权)平均值。例如,如果用X1,X2,X3,X4共同预测Y。某个样本的观测为X1=0,X2=2,X3=0,X4=1, 针对这个样本,度量X1=0对于预测的贡献Shapley值,(假设X1是一个二分类特征,取值0/1)。首先利用X2, X3, X4得到【‘’,‘X2=2’,‘X3=0’,‘X4=1’,‘X2=2 ,X3=0’, ‘X2=2 ,X4=1’,’ X3 =0,X4=1’, ‘X2=2 ,X3=0,X4=1’】的联盟,然后针对每一个联盟,将X1的取值替换(X1=1),计算预测值Y,并与将忽略X1(X1=0或X1=1,类似于边缘概率的概念)特征值时,联盟的预测值取差值,将该差值当作边际贡献。最终X1某个特征值的贡献为所有边际贡献的加权平均值。Shapley值可以估计某个特征的取值对预测的贡献大小,并且在估计的过程中,考虑到了特征之间可能的交互。缺点是,计算量可能会略大,尤其是特征维度较高的时候。不过,现在有一种TreeSHAP方法,它可以计算精确的Shapley值,并且速度很快。
四、解释中用到的可视化手段
以下列举了部分具有代表性的可视化手段,用于专业的模型解释可视化。个人觉得很有参考价值,但不太适用于面对普通用户的解释,门槛比较高。针对用户的解释,还是要尽量接地气,如一辆自动驾驶汽车,报告其突然停车的原因(“孩子越过马路的概率为70%”);信用违约程序,向银行员工解释为何拒绝信用申请(“申请人的信用卡过多,并且从事不稳定的工作。”);一个机械臂,解释了为什么它把物品从传送带上搬到垃圾桶里(“物品底部有裂缝。”)。
(1) SHAP解释力图:针对单个样本的解释,蓝色表示增加效应,红色表示减少效应,长条的长短表示Shapley值。
(2)特征重要性可视化:特征重要性可以由多种特征重要性计算方法得到。
(3)特征概要图:如下图,图中每个点为一个样本,点的颜色和位置与Shapley解释力图类似。
(4)SHAP特征依赖图:横轴是特征取值,纵轴为Shapley值。是将特征概要图中某个特征拉出来展示。
(5)个体条件期望(ICE,Individual Conditional Expectation)图:横轴是特征取值,纵轴。每个实例显示一条线,该线显示了特征更改时实例的预测如何改变。
(6)局部累积效应图(ALE,Accumulated Local Effects Plot)图:下图为一个二阶局部累积效应图,它能够展示具有强相关性的两个变量对目标的联合效应。
结语:
解释模型这个问题,考虑好面对谁解释真的挺重要。之前偏执的认为就应该从本质上解释,就是因为没考虑到“面对的受众需不需要我这么严谨的去跟他解释”。这个问题的回答,大部分都应该是否定的吧。因此,产品中,完全可以把它当成一个产品问题解决掉。但抛开面对普通用户的解释,面对我们算法工程师自己,可能我们需要往数据探索上做,去可视化特征及特征之间的交互效应,有点像探索模型边界,让它变的可控,不过这个暂时还没有那么多精力,只能闲时学习了。
最后摘抄两段话分享出来,表达对这个方向的期待吧:
“当它与底层的机器学习模型分离时,使可解释性自动化变得容易得多。与模型无关的可解释性的优点在于其模块化。我们可以轻松地替换底层的机器学习模型。我们可以轻松地替换解释方法。”
“模型训练的自动化已经是一个显而易见的趋势。这包括自动工程和特征选择,自动超参数优化,不同模型的比较以及模型的集成或堆叠。结果是最佳可能的预测模型。当我们使用与模型无关的解释方法时,我们可以将它们自动应用于自动机器学习过程中出现的任何模型。在某种程度上,我们也可以使第二步自动化:自动计算特征重要性、绘制部分依赖关系、训练代理模型等等。没有人会阻止你自动计算所有这些模型解释。实际的解释仍然需要人类。想象一下:你上传了一个数据集,指定了预测目标,并且只需按一下按钮,就可以训练出最佳的预测模型,并且程序会吐出对该模型的所有解释。”