社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

万字长文概览深度学习的可解释性研究

机器学习研究组订阅号 • 5 年前 • 771 次点击  

作者:知乎—王小贱

地址:https://www.zhihu.com/people/wang-xiao-jian-38-81


《深度学习的可解释性研究概览》包含3篇内容,作者将用尽可能浅显的语言带领大家了解可解释性的概念与方法以及关于深度学习可解释性工作的研究成果。

深度学习的可解释性研究(一)—— 让模型具备说人话的能力
深度学习的可解释性研究(二)——不如打开箱子看一看
深度学习的可解释性研究(三)——是谁在撩动琴弦


深度学习的可解释性研究(一)—— 让模型具备说人话的能力


1. 可解释性是什么?


广义上的可解释性指在我们需要了解或解决一件事情的时候,我们可以获得我们所需要的足够的可以理解的信息。比如我们在调试bug的时候,需要通过变量审查和日志信息定位到问题出在哪里。比如在科学研究中面临一个新问题的研究时,我们需要查阅一些资料来了解这个新问题的基本概念和研究现状,以获得对研究方向的正确认识。反过来理解,如果在一些情境中我们无法得到相应的足够的信息,那么这些事情对我们来说都是不可解释的。比如刘慈欣的短篇《朝闻道》中霍金提出的“宇宙的目的是什么”这个问题一下子把无所不知的排险者卡住了,因为再高等的文明都没办法理解和掌握造物主创造宇宙时的全部信息,这些终极问题对我们来说永远都是不可解释的。
而具体到机器学习领域来说,以最用户友好的决策树模型为例,模型每作出一个决策都会通过一个决策序列来向我们展示模型的决策依据:比如男性&未婚&博士&秃头的条件对应“不感兴趣”这个决策,而且决策树模型自带的基于信息理论的筛选变量标准也有助于帮助我们理解在模型决策产生的过程中哪些变量起到了显著的作用。所以在一定程度上,我们认为决策树模型是一个具有比较好的可解释性的模型,在以后的介绍中我们也会讲到,以决策树为代表的规则模型在可解释性研究方面起到了非常关键的作用。再以用户最不友好的多层神经网络模型为例,模型产生决策的依据是什么呢?大概是以比如 1/(e^-(2*1/(e^(-(2*x+y))+1) + 3*1/(e^(-(8*x+5*y))+1))+1) 是否大于0.5为标准(这已经是最简单的模型结构了),这一连串的非线性函数的叠加公式让人难以直接理解神经网络的“脑回路”,所以深度神经网络习惯性被大家认为是黑箱模型
17年ICML的Tutorial中给出的一个关于可解释性的定义是:
Interpretation is the process of giving explanations to Human.
总结一下就是“说人话”,“说人话”,“说人话”,不以人类可以理解的方式给出的解释都叫耍流氓,记住这三个字,你就差不多把握了可解释性的精髓所在。


2. 我们为什么需要可解释性?


广义上来说我们对可解释性的需求主要来源于对问题和任务了解得还不够充分。具体到深度学习/机器学习领域,就像我们上文提到的多层神经网络存在的问题,尽管高度的非线性赋予了多层神经网络极高的模型表示能力,配合一些堪称现代炼丹术的调参技术可以在很多问题上达到非常喜人的表现,大家如果经常关注AI的头条新闻,那些机器学习和神经网络不可思议的最新突破甚至经常会让人产生AI马上要取代人类的恐惧和幻觉。但正如近日贝叶斯网络的创始人Pearl所指出的,“几乎所有的深度学习突破性的本质上来说都只是些曲线拟合罢了”,他认为今天人工智能领域的技术水平只不过是上一代机器已有功能的增强版。虽然我们造出了准确度极高的机器,但最后只能得到一堆看上去毫无意义的模型参数和拟合度非常高的判定结果,但实际上模型本身也意味着知识,我们希望知道模型究竟从数据中学到了哪些知识(以人类可以理解的方式表达的)从而产生了最终的决策。从中是不是可以帮助我们发现一些潜在的关联,比如我想基于深度学习模型开发一个帮助医生判定病人风险的应用,除了最终的判定结果之外,我可能还需要了解模型产生这样的判定是基于病人哪些因素的考虑。如果一个模型完全不可解释,那么在很多领域的应用就会因为没办法给出更多可靠的信息而受到限制。这也是为什么在深度学习准确率这么高的情况下,仍然有一大部分人倾向于应用可解释性高的传统统计学模型的原因。
不可解释同样也意味着危险,事实上很多领域对深度学习模型应用的顾虑除了模型本身无法给出足够的信息之外,也有或多或少关于安全性的考虑。比如,下面一个非常经典的关于对抗样本的例子,对于一个CNN模型,在熊猫的图片中添加了一些噪声之后却以99.3%的概率被判定为长臂猿。
在熊猫图片中加入噪声,模型以99.3%的概率将图片识别为长臂猿
事实上其他一些可解释性较好的模型面对的对抗样本问题可能甚至比深度学习模型更多,但具备可解释性的模型在面对这些问题的时候是可以对异常产生的原因进行追踪和定位的,比如线性回归模型中我们可以发现某个输入参数过大/过小导致了最后判别失常。但深度学习模型很难说上面这两幅图到底是因为哪些区别导致了判定结果出现了如此大的偏差。尽管关于对抗样本的研究最近也非常火热,但依然缺乏具备可解释性的关于这类问题的解释。
当然很多学者对可解释性的必要性也存有疑惑,在NIPS 2017会场上,曾进行了一场非常激烈火爆的主题为“可解释性在机器学习中是否必要”的辩论,大家对可解释性的呼声还是非常高的。但人工智能三巨头之一的Yann LeCun却认为:人类大脑是非常有限的,我们没有那么多脑容量去研究所有东西的可解释性。有些东西是需要解释的,比如法律,但大多数情况下,它们并没有你想象中那么重要。比如世界上有那么多应用、网站,你每天用Facebook、Google的时候,你也没想着要寻求它们背后的可解释性。LeCun也举了一个例子:他多年前和一群经济学家也做了一个模型来预测房价。第一个用的简单的线性于猜测模型,经济学家也能解释清楚其中的原理;第二个用的是复杂的神经网络,但效果比第一个好上不少。结果,这群经济学家想要开公司做了。你说他们会选哪个?LeCun表示,任何时候在这两种里面选择都会选效果好的。就像很多年里虽然我们不知道药物里的成分但一直在用一样。
但是不可否认的是,可解释性始终是一个非常好的性质,如果我们能兼顾效率、准确度、说人话这三个方面,具备可解释性模型将在很多应用场景中具有不可替代的优势。


3. 有哪些可解释性方法?


我们之前也提到机器学习的目的是从数据中发现知识或解决问题,那么在这个过程中只要是能够提供给我们关于数据或模型的可以理解的信息,有助于我们更充分地发现知识、理解和解决问题的方法,那么都可以归类为可解释性方法。如果按照可解释性方法进行的过程进行划分的话,大概可以划分为三个大类:
1. 在建模之前的可解释性方法
2. 建立本身具备可解释性的模型
3. 在建模之后使用可解释性方法对模型作出解释


4. 在建模之前的可解释性方法


这一类方法其实主要涉及一些数据预处理或数据展示的方法。机器学习解决的是从数据中发现知识和规律的问题,如果我们对想要处理的数据特征所知甚少,指望对所要解决的问题本身有很好的理解是不现实的,在建模之前的可解释性方法的关键在于帮助我们迅速而全面地了解数据分布的特征,从而帮助我们考虑在建模过程中可能面临的问题并选择一种最合理的模型来逼近问题所能达到的最优解。
数据可视化方法 就是一类非常重要的建模前可解释性方法。很多对数据挖掘稍微有些了解的人可能会认为数据可视化是数据挖掘工作的最后一步,大概就是通过设计一些好看又唬人的图表或来展示你的分析挖掘成果。但大多数时候,我们在真正要研究一个数据问题之前,通过建立一系列方方面面的可视化方法来建立我们对数据的直观理解是非常必须的,特别是当数据量非常大或者数据维度非常高的时候,比如一些时空高维数据,如果可以建立一些一些交互式的可视化方法将会极大地帮助我们从各个层次角度理解数据的分布,在这个方面我们实验室也做过一些非常不错的工作。
还有一类比较重要的方法是探索性质的数据分析,可以帮助我们更好地理解数据的分布情况。比如一种称为MMD-critic方法中,可以帮助我们找到数据中一些具有代表性或者不具代表性的样本。
使用MMD-critic从Imagenet数据集中学到的代表性样本和非代表性样本(以两种狗为例)


5. 建立本身具备可解释性的模型


建立本身具备可解释性的模型是我个人觉得是最关键的一类可解释性方法,同样也是一类要求和限定很高的方法,具备“说人话”能力的可解释性模型大概可以分为以下几种:
1. 基于规则的方法(Rule-based)
2. 基于单个特征的方法(Per-feature-based)
3. 基于实例的方法(Case-based)
4. 稀疏性方法(Sparsity)
5. 单调性方法(Monotonicity)
基于规则的方法比如我们提到的非常经典的决策树模型。这类模型中任何的一个决策都可以对应到一个逻辑规则表示。但当规则表示过多或者原始的特征本身就不是特别好解释的时候,基于规则的方法有时候也不太适用。
基于单个特征的方法主要是一些非常经典的线性模型,比如线性回归、逻辑回归、广义线性回归、广义加性模型等,这类模型可以说是现在可解释性最高的方法,可能学习机器学习或计算机相关专业的朋友会认为线性回归是最基本最低级的模型,但如果大家学过计量经济学,就会发现大半本书都在讨论线性模型,包括经济学及相关领域的论文其实大多数也都是使用线性回归作为方法来进行研究。这种非常经典的模型全世界每秒都会被用到大概800多万次。为什么大家这么青睐这个模型呢?除了模型的结构比较简单之外,更重要的是线性回归模型及其一些变种拥有非常solid的统计学基础,统计学可以说是最看重可解释性的一门学科了,上百年来无数数学家统计学家探讨了在各种不同情况下的模型的参数估计、参数修正、假设检验、边界条件等等问题,目的就是为了使得在各种不同情况下都能使模型具有有非常好的可解释性,如果大家有时间有兴趣的话,除了学习机器学习深度模型模型之外还可以尽量多了解一些统计学的知识,可能对一些问题会获得完全不一样的思考和理解。
基于实例的方法主要是通过一些代表性的样本来解释聚类/分类结果的方法。比如下图所展示的贝叶斯实例模型(Bayesian Case Model,BCM),我们将样本分成三个组团,可以分别找出每个组团中具有的代表性样例和重要的子空间。比如对于下面第一类聚类来说,绿脸是具有代表性的样本,而绿色、方块是具有代表性的特征子空间。
使用BCM学到的分类及其对应的代表性样本和代表性特征子空间
基于实例的方法的一些局限在于可能挑出来的样本不具有代表性或者人们可能会有过度泛化的倾向。
基于稀疏性的方法主要是利用信息的稀疏性特质,将模型尽可能地简化表示。比如如下图的一种图稀疏性的LDA方法,根据层次性的单词信息形成了层次性的主题表达,这样一些小的主题就可以被更泛化的主题所概括,从而可以使我们更容易理解特定主题所代表的含义。
Graph-based LDA 中的主题层次结构
基于单调性的方法:在很多机器学习问题中,有一些输入和输出之间存在正相关/负相关关系,如果在模型训练中我们可以找出这种单调性的关系就可以让模型具有更高的可解释性。比如医生对患特定疾病的概率的估计主要由一些跟该疾病相关联的高风险因素决定,找出单调性关系就可以帮助我们识别这些高风险因素。


6. 在建模之后使用可解释性性方法作出解释


建模后的可解释性方法主要是针对具有黑箱性质的深度学习模型而言的,主要分为以下几类的工作:
1. 隐层分析方法
2. 模拟/代理模型
3. 敏感性分析方法
这部分是我们接下来介绍和研究的重点,因此主要放在后续的文章中进行讲解,在本篇中不作过多介绍。
除了对深度学习模型本身进行解释的方法之外,也有一部分工作旨在建立本身具有可解释性的深度学习模型,这和我们前面介绍通用的可解释性模型有区别也有联系,也放到后面的文章中进行介绍。


参考文献


[1] Google Brain, Interpretable Machine Learning: The fuss, the concrete and the questions.
[2] Kim B, Koyejo O, Khanna R, et al. Examples are not enough, learn to criticize! Criticism for Interpretability[C]. neural information processing systems, 2016: 2280-2288.
[3] Kim B, Rudin C, Shah J. The Bayesian Case Model: A Generative Approach for Case-Based Reasoning and Prototype Classification[J]. Computer Science, 2015, 3:1952-1960.
[4] Doshi-Velez F, Wallace B C, Adams R. Graph-sparse LDA: a topic model with structured sparsity[J]. Computer Science, 2014.

深度学习的可解释性研究(二)——不如打开箱子看一看

在上一节中我们介绍了深度学习可解释性的三种方法:1. 隐层分析法,2. 敏感性分析法 3. 代理/替代模型法。在这一节中我们主要介绍第一种方法:隐层分析法


1. 黑箱真的是黑箱吗?——深度学习的物质组成视角


通过上一节的介绍我们也了解到,深度学习的黑箱性主要来源于其高度非线性性质,每个神经元都是由上一层的线性组合再加上一个非线性函数的得到,我们无法像理解线性回归的参数那样通过非常solid的统计学基础假设来理解神经网络中的参数含义及其重要程度、波动范围。但实际上我们是知道这些参数的具体值以及整个训练过程的,所以神经网络模型本身其实并不是一个黑箱,其黑箱性在于我们没办法用人类可以理解的方式理解模型的具体含义和行为,而神经网络的一个非常好的性质在于神经元的分层组合形式,这让我们可以用物质组成的视角来理解神经网络的运作方式。比如如下图所示,人体的组成过程是从分子-细胞-组织-器官-系统-人体:
人体的组成结构示意
而通过一些对神经网络隐层的可视化我们也发现:比如下图的一个人脸识别的例子,神经网络在这个过程中先学到了边角的概念,之后学到了五官,最后学到了整个面部的特征。
(以上内容参考了@YJango在如何简单形象又有趣地讲解神经网络是什么?中的回答,侵删)
如果我们能够用一些方法来帮助我们理解这个从低级概念到高级概念的生成过程,那么就离理解神经网络的具体结构就近了很多。而这也可以逐渐帮助我们完成一个“祛魅”的过程,将调参的魔法真正变成一项可控、可解释的过程。
要理解这个概念的生成过程很重要的一点就是要研究隐层的概念表示,在接下来的部分中我将给大家介绍业界关于隐层分析方法的几个研究工作。


2. 模型学到了哪些概念?


要理解神经网络中每层都学到了哪些概念一个非常直观的方法就是通过对隐层运用一些可视化方法来将其转化成人类可以理解的有实际含义的图像,这方面一个非常具有代表性的一个工作就是14年ECCV的一篇经典之作:《Visualizing and Understanding Convolutional Networks》,这篇文章主要利用了反卷积的相关思想实现了特征可视化来帮助我们理解CNN的每一层究竟学到了什么东西。我们都知道典型的CNN模型的一个完整卷积过程是由卷积-激活-池化(pooling)三个步骤组成的。而如果想把一个CNN的中间层转化成原始输入空间呢?我们就需要经过反池化-反激活-反卷积这样的一个逆过程。整个模型的结构如下图所示:


3. 反池化:


反池化其实很好理解,以下面的图片为例,左图可以表示是池化(pooling)过程,右图表示反池化(unpooling)过程,池化过程中我们将3*3的一个pooling块中的最大值取出,而反池化则是将pooling后的值恢复成3*3的像素单元,由于我们现在只有一个激活值, 所以只将该激活值对应原pooling块中位置的值还原回去,其他的值设定成0。所以在max-pooling的时候,我们不光要知道pooling值,同时也要记录下pooling值的对应位置,比如下图pooling值的位置就是(0,1)。
反池化过程
反激活:
在典型的CNN模型中,我们一般使用Relu作为激活函数,而反激活的值和实际的激活值没有任何区别:只保留正数,其余值为0即可。


4. 反卷积:


反卷积的过程其实非常有意思,其实反卷积这个名字多多少少有些误人子弟,和真正的反卷积并没有多大关系,真实的含义应该是转置卷积(Transposed Convolution),CNN模型的卷积过程本质上来讲和一般的神经网络没有任何区别(只不过将一些共用参数组合成了一个滤波器的形式),都可以转变成一个矩阵乘法的操作(只不过对CNN模型来说是一个参数重复度很高的稀疏矩阵),我们不妨将这个稀疏矩阵表示为  ,那么后一层和前一层的关系就可以表示为:



而在反向传播的过程中,   往往可以表示为卷积层对输入层的梯度,也就是说通过对卷积层进行适当的补0操作,再用原始的卷积核转置之后的卷积核进行卷积操作,就可以得到相应的梯度矩阵与当前卷积层的乘积,而我们在这里使用反池化-反激活之后的特征(其中包含了大部分为0的数值)进行该操作其实表征了原始输入对池化之后的特征的影响,因为在反激活过程中保证了所有值非负因此反卷积的过程中符号不会发生改变。
反卷积是个上采样过程
通过上面的介绍我们其实可以明白,这个反卷积的方法之所以能够成功地将CNN的隐层可视化出来,一个关键就在于通过反激活-反池化的过程,我们屏蔽掉了很多对当前层的激活值没有实际作用的输入层的影响将其归为0,通过反卷积操作就得到了仅对当前层有实际贡献的输入层的数值——将其作为该层的特征表示。因为我们最后得到的这个特征表示和原输入空间的大小是一致的,其数值表示也对应着原始空间的像素点,所以在一定程度上,这是我们可以理解的一个特征表示。
从实验结果可以看出来,第二层对应着一些边角或色彩特征,第三层对应着纹理特征,第四层对应着一些如狗脸、车轮这样的局部部位,第五层则对整体的物体有较强的识别能力。
通过上面这篇论文的工作,我们可以大致地用肉眼来判断神经网络学到的概念类型,但如果能识别一些语义概念的话对我们来说可能更有意义,在这方面一个非常有代表性的工作是在CVPR 2017上发表《Network Dissection: Quantifying Interpretability of Deep Visual Representations》,这篇文章提出了一种网络切割(Network Dissection)的方法来提取CNN的概念表示。
所谓的网络切割(Network Dissection)方法其实分为三个步骤:
1. 识别一个范围很广的人工标注的视觉语义概念数据集
2. 将隐层变量对应到这些概念表示上
3. 量化这些隐层-概念对的匹配程度
为了获得大量的视觉语义概念数据,研究人员收集了来自不同数据源的分层语义标注数据(包括颜色、材质、材料、部分、物体、场景这几个层次),如下图所示
而如何将隐层变量对应到这些概念表示上并获得隐层-概念对的匹配程度呢,本文提出了如下的方法:
对于每个输入图像x,获取每个隐层k的activation map  (其实也就是feature map),这样就可以得到隐层k激活值的分布,对于每个隐层k,我们都可以找到一个   使得  ,这个  可以作为接下来判断区域是否激活的一个标准。
为了方便对比低分辨率的卷积层和输入层的概念激活热图  (其实就是标注出了相关概念在图像中的代表区域),我们将低分辨率的卷积层的特征图  通过插值的方法扩展为和原始图片尺寸一样大的图像  。
之后再建立一个二元分割  ,这样就得到了所有被激活的区域,而我们通过将  和输入层的概念激活热图  作对比,这样就可以获得隐层-概念对的匹配程度:
可以发现如果匹配度高的话,那么分子就比较大(交叉范围大),分母就比较小(合并范围小),我们通过和颜色、材质、材料、部分、物体、场景不同层次的概念作匹配就能得到隐层学到的概念层次了,这个模型的结构如下图所示:
Network Dissection的模型结构
模型在AlexNet上的实验结果
从实验结果中我们也可以发现随着层数的增加,神经网络学到的概念类型也逐渐变得高级,比如在AlexNet中,前面的卷积层对颜色、材质的识别力较强,后面的卷积层对物体、场景的识别力较强。特别是对物体的识别上,后面的卷积层有突出的优势。


5. 低级到高级=泛化到特化?


当然从低级概念到高级概念的一个过程中总是会伴随着一个非常有意思的现象:泛化性逐渐降低,特化性逐渐升高。比如在细胞层次上,人类和其他动物的区别比较小,这个层次的泛化性就高,但到组织器官层次区别就比较大,这个层次的特化性就高。Bengio团队在2014年发表的一篇工作《How transferable are features in deep neural networks》就是通过研究特征的可迁移性来对这个从泛化的特化的过程进行评估。
特征在迁移任务上的表现往往是评价特征泛化性能的一个非常好的依据。在迁移学习中,我们首先基于基础数据训练一个基础网络,然后将特征改换到另一个任务上,如果特征是具备泛化性的,那么其在迁移任务中应该也是适用的。在这个工作中,作者将1000个ImageNet的分类分成了两个组,每个组个包含大约500个分类和645000个样本。然后利用这两组数据各训练一个八层的卷积网络baseA和baseB,然后分别取第1到第7个卷积层训练几个新的网络,以第3层为例:
自我复制网络(selffer network)B3B,前三层从baseB上复制并冻结。剩余的5个卷积层随机初始化并在数据集B上训练,这个网络作为控制组
一个迁移网络(transfer network)A3B:前三层从baseA上复制并冻结。剩余的5个卷积层随机初始化并在数据集B上训练。如果A3B的任务表现和baseB一样好,那么就说明第三层的特征至少对于B任务来讲是泛化的,如果不如baseB,那么说明第三层特征就是特化的。
一个自我复制网络B3B+,网络结构和B3B一样,但所有层都是可学习的
一个迁移网络A3B+,网络结构和A3B一样,但所有层都是可学习的
这些网络的结构图如下图所示:
而从实验结果来看,transferAnB的随着层数的增加性能在不断下降(泛化降低,特化提升,这印证了我们对泛化特化性质随层数变化的基本判断),而控制组的selfferBnB的性能出现了先下降后上升的现象(泛化和特化都不足够的中间层既缺乏可学习性,特征的描述性又不够强,因而出现了性能下降的现象),transferBnB+和transferAnB+一直维持着比较好的性能,但其中transferAnB+的性能确是最好的,特征在迁移任务上表现出来的优势其实也对应了我们在上一节中讲的模型本身也意味着知识


6. 真的需要那么多层吗?


对于神经网络来说,隐层的数量永远都是一个玄学,我们如何理解隐层的数量和模型性能之间的关系呢?Bengio在2016年还做过一个工作《Understanding intermediate layers using linear classifier probes》。这篇文章的思路非常简单,就是通过在每个隐层中添加一个线性探针来测试隐层的表征性能。什么是线性探针呢?也很简单,就是以每个隐藏层为输入,判别的label为输出建立一个逻辑回归模型,通过评估模型的准确率我们就能得到隐层在整个训练过程中以及训练结束之后表征性能的变化。
通过32个隐层在二分数据上的实验我们可以发现随着隐层的增加表征性能不断提高,但提高的比率也逐渐趋于缓慢。
在基于Minist数据训练的CNN模型上,经过10个周期的训练,第一个卷积层的表征性能提升非常明显,但之后的卷积层并没有很明显的提升。


小结


本文中我们主要介绍了四个在隐层分析上有代表性的工作,这类方法在神经网络可解释性的研究中向我们揭示了隐层性质的变化和概念生成的过程,在之后要讲到的敏感性分析方法中,也会不可避免地涉及对隐层的分析。如果大家对这几个工作感兴趣,可以找到相关的文献做更深入的阅读。


参考文献


[1] Matthew D. Zeiler, Rob Fergus. Visualizing and Understanding Convolutional Networks[J]. 2013, 8689:818-833.
[2] David Bau, Bolei Zhou, Aditya Khosla, et al. Network Dissection: Quantifying Interpretability of Deep Visual Representations[J]. 2017:3319-3327.
[3] Yosinski J, Clune J, Bengio Y, et al. How transferable are features in deep neural networks?[J]. Eprint Arxiv, 2014, 27:3320-3328.
[4] Alain G, Bengio Y. Understanding intermediate layers using linear classifier probes[J]. 2016.

深度学习的可解释性研究(三)——是谁在撩动琴弦

在上一节中我们介绍了建模后深度学习可解释性方法之一:隐层分析法,但我们也会发现隐层分析法的一个问题在于,通过端到端训练的隐层很多时候并没有什么特定的含义,多数依赖我们的主观判断。但是深度学习模型中往往只有输入层对我们来说才是有意义的,所以了解深度学习模型的一个更直观的方法是通过研究输入层的变化对结果的影响来判断输入变量或输入样本的重要性,这也是通常所说的敏感性分析方法
敏感性分析(Sensitivity Analysis)是一类非常重要的,用于定量描述模型输入变量对输出变量的重要性程度的方法,在经济、生态、化学、控制等领域都已经有了非常成熟的应用。假设模型表示为  ,敏感性分析就是令每个属性在可能的范围变动,研究和预测这些属性的变化对模型输出值的影响程度。我们将影响程度的大小称为该属性的敏感性系数,敏感性系数越大,就说明属性对模型输出的影响越大。一般来讲对于神经网络的敏感性分析方法可以分为变量敏感性分析、样本敏感性分析两种,变量敏感性分析用来检验输入属性变量对模型的影响程度,样本敏感性分析用来研究具体样本对模型的重要程度,也是敏感性分析研究的一个新方向。


1. 变量敏感性分析


神经网络中的变量敏感性分析方法大概有以下几种:基于连接权的敏感性方法,基于偏导的敏感性分析方法、通过改变输入变量观察其影响的方法和与统计方法结合的敏感性分析方法。
基于连接权的敏感性分析方法
基于连接权的方法中比较有代表性的工作是Garson等人1991年在《Interpreting neural network connection weights》提出的方法,这种来自于“远古时期”的智慧相对来说就要简单粗暴一点。输入变量  对输出变量  的影响程度为:
但是由于这种方法中  的正负性导致我们可能没办法得到真实的敏感性系数,所以后来就对这个公式进行了改造,改为用绝对值来评估影响力。



下图就通过一个例子描述了Garson方法对变量重要性的评估过程。
当然这种方法存在的问题就不用我多说了,放到一个两个隐层的网络可能还适用,放到深度网络中由于忽略了非线性激活函数误差会一步一步积累,所以慢慢也就被大家抛弃了。
基于统计方法的敏感性分析方法
基于统计方法的敏感性分析方法中一个比较有代表性的工作是Olden等人2002年在Elsevier上发表的《Illuminating the “black box”: a randomization approach for understanding variable contributions in artificial neural networks》,虽然也是来自于“远古时期”的智慧,却是我个人非常欣赏的一个工作,现在看来依然觉得非常牛逼。这个工作的步骤如下:
1. 使用随机初始的权重构建一组神经网络
2. 从中选出预测性能最好的神经网络,记录下该网络的初始权重,计算并记录:
(1) 输入神经元对输出神经值经过某个隐层神经元的连接权重:也就是上面Garson算法图中的 
(2) 全局的连接权重,也就是每个变量输入层到输出层连接权的总和,也就是上面Garson算法图中的 
(3) 根据前面所提到Garson算法计算每个变量的相对重要性
3. 随机打乱输出值(  )
4. 使用  和初始的随机权重构建一个神经网络
5. 大量重复步骤3和4,每次都记录步骤2中的值
这个方法牛逼的地方在于通过大量的重复采样(bootstrap)使得对神经网络的统计检验成为了可能,随机打乱了输出值使我们能够得到基于给定初始值随机训练网络的权重和重要性分布,这样就可以通过统计检验的方法来(如果pvalue非常小,那么我们可以认为这个值不是随机选的,是显著的),就像下图所示,表示了表面积对生物多样性的影响(三个图分别表示在步骤2中所记录的经过隐层神经元B的连接权、总连接权、相对重要性),在概率分布图中基本P值都比较小,因此可以认为这些影响都是显著的。
基于偏导的敏感性分析方法
基于偏导的敏感性分析方法主要是利用偏导数来评估输入变量对输出的影响,比如Dimoponlos等人在《Use of some sensitivity criteria for choosing networks with good generalization ability》中提出的敏感性方法,除了考虑偏导以外,作者也考虑了曲率(也就是二阶导数)的影响,因为神经网络在激活函数处的非线性导致了虽然导数绝对值较小,但有可能因为曲率较大导致敏感性高的情况,某个变量j的敏感性可以由所有样本在变量j处的导数和曲率乘积的平方和度量:
基于输入变量扰动的敏感性分析方法
基于输入变量扰动的敏感性分析方法是在前向网络中最为常用的一种敏感性分析方法,可以用于评估变量的重要性从而达到变量筛选的目的,比如Dombi等人提出的平均影响值(MIV,Mean Impact Value)方法就是一种被广泛应用的评估方法,MIV方法的计算过程如下:


  1. 在网络训练终止后,将训练样本P中每一自变量特征在原值的基础上分别加/减10%后成两个训练样本P1和P2
  2. 将P1和P2分别作为仿真样本利用已建成的网络进行仿真,得到两个仿真结果A1和A2
  3. 求出A1和A2的差值,即为变动该自变量后对输出产生的影响变化值
  4. 最后将IV按观测样本数平均得到该自变量对应变量——网络输出的MIV。


按照MIV的绝对值排序即可得到各个自变量对网络输出影响的重要性排序,从而完成变量筛选的目的。


2. 样本敏感性分析


样本敏感性分析中比较有代表性的工作是 Pang Wei Koh 2017年在ICML上发表的
Understanding Black-box Predictions via Influence Functions》,这篇文章也是去年ICML的best paper,通过影响力函数来理解深度学习黑盒模型的预测效果。什么是影响力函数呢?这个其实就涉及到统计学的相关概念了,大家都知道一般来说我们训练神经网络模型也好还是别的SVM之类的什么模型都是通过SGD等方法训练的,找到一个目标损失函数然后让它不断收敛得到最终的参数。在理想状况下最后收敛的点应该都是导数为0的点,那么我们如何评估某个样本的敏感度呢?有个办法就是将样本做微小的改变  ,这样最后收敛的参数也会发生改变,然后得到参数的改变对  的导数就是这个样本的影响力函数。
这里如果假设  是每个样本的损失函数,那么总的损失函数可以写成:
 的二阶偏导矩阵   可以写成下面的形式,这里我们假设  是正定的,这样可以保证在后续推导中  的逆存在
在这里我们给z样本添加一个微小的扰动  ,这个时候可以得到一个新的收敛参数 
定义参数的改变量为  ,则我们要计算的可以表示为:
由于导数为0的条件可以得到:
由于当 趋近于0,  ,可以应用泰勒展开得到下面的式子
由于  ,只保留  项
可以得到:
最后我们可以得到下面的表达式:
这个也就是影响力函数的表达式,根据这个定义,作者推导出了提升某个训练样本的权重或者对训练样本施加轻微扰动之后对特定测试样本损失函数的影响:
当然由于在影响力的计算中涉及到Hessian矩阵的求逆问题,作者也提出了一种简便计算的方法来迅速计算影响力函数的近似值,具体在这里就不介绍了,想了解的可以阅读原文以备参考。
通过影响力函数的计算可以发现,对下图的测试样本7来说,右边的训练样本的存在对该样本的判定是有害的。
而由于计算出了对训练样本施加轻微扰动之后对特定测试样本损失函数的影响,所以这个方法也可以应用到对抗样本的生成中,只需要在一部分影响力函数较大的样本中添加一些肉眼不可见的扰动,就足以干扰其他样本的判定结果。


小结


在本节中我们介绍了建模后深度学习可解释性方法之一——敏感性分析方法,敏感性方法的主要用途是衡量变量/样本的重要性,优点是把解释性归于输入特征或样本使得更容易被理解。不过敏感性方法不如隐层分析法的一点在于基本上完全忽视了对隐层结构的研究,在接下来我们将介绍第三类方法:代理/替代模型方法,欢迎继续关注。


参考文献


[1] Garson G D. Interpreting neural-network connection weights[M]. Miller Freeman, Inc. 1991.
[2] Olden J D, Jackson D A. Illuminating the “black box”: a randomization approach for understanding variable contributions in artificial neural networks[J]. Ecological Modelling, 2002, 154(1–2):135-150.
[3] Dimopoulos Y, Bourret P, Lek S. Use of some sensitivity criteria for choosing networks with good generalization ability[J]. Neural Processing Letters, 1995, 2(6):1-4.
[4] Koh P W, Liang P. Understanding Black-box Predictions via Influence Functions[J]. 2017.


关于BIGSCity


北航智慧城市兴趣组BIGSCITY是隶属于北京航空航天大学计算机学院的一个学术研究小组,小组致力于研究机器学习与数据挖掘在城市科学、社会科学等领域的交叉应用技术。BIGSCITY的研究兴趣包括:城市计算,时空数据挖掘,机器学习可解释性,以及AI在交通、健康、金融等领域的应用等。本专栏将介绍BIGSCITY的一些研究成果,不定期更新与课题组研究相关的研究工作介绍,以及介绍与BIGSCITY相关的一切有趣的内容。
关于BIGSCITY的详细情况参见研究组主页:https://www.bigscity.com/



想要了解更多资讯,请扫描下方二维码,关注机器学习研究会

                                          


转自:人工智能学家

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/64332
 
771 次点击