作者 | 王小贱
来源 | BIGSCity知乎专栏
摘要:《深度学习的可解释性研究》系列文章希望能用尽可能浅显的语言带领大家了解可解释性的概念与方法,以及关于深度学习可解释性工作的研究成果。本文是该系列的第一部分。
01
深度学习的可解释性研究(一)
让模型具备说人话的能力
广义上的可解释性指在我们需要了解或解决一件事情的时候,我们可以获得我们所需要的足够的可以理解的信息。
比如我们在调试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.
总结一下就是“说人话”,“说人话”,“说人话”,不以人类可以理解的方式给出的解释都叫耍流氓,记住这三个字,你就差不多把握了可解释性的精髓所在。
广义上来说我们对可解释性的需求主要来源于对问题和任务了解得还不够充分。具体到深度学习/机器学习领域,就像我们上文提到的多层神经网络存在的问题,尽管高度的非线性赋予了多层神经网络极高的模型表示能力,配合一些堪称现代炼丹术的调参技术可以在很多问题上达到非常喜人的表现,大家如果经常关注AI的头条新闻,那些机器学习和神经网络不可思议的最新突破甚至经常会让人产生AI马上要取代人类的恐惧和幻觉。
但正如近日贝叶斯网络的创始人Pearl所指出的,“几乎所有的深度学习突破性的本质上来说都只是些曲线拟合罢了”,他认为今天人工智能领域的技术水平只不过是上一代机器已有功能的增强版。
虽然我们造出了准确度极高的机器,但最后只能得到一堆看上去毫无意义的模型参数和拟合度非常高的判定结果,但实际上模型本身也意味着知识,我们希望知道模型究竟从数据中学到了哪些知识(以人类可以理解的方式表达的)从而产生了最终的决策。从中是不是可以帮助我们发现一些潜在的关联,比如我想基于深度学习模型开发一个帮助医生判定病人风险的应用,除了最终的判定结果之外,我可能还需要了解模型产生这样的判定是基于病人哪些因素的考虑。如果一个模型完全不可解释,那么在很多领域的应用就会因为没办法给出更多可靠的信息而受到限制。这也是为什么在深度学习准确率这么高的情况下,仍然有一大部分人倾向于应用可解释性高的传统统计学模型的原因。
不可解释同样也意味着危险,事实上很多领域对深度学习模型应用的顾虑除了模型本身无法给出足够的信息之外,也有或多或少关于安全性的考虑。比如,下面一个非常经典的关于对抗样本的例子,对于一个CNN模型,在熊猫的图片中添加了一些噪声之后却以99.3%的概率被判定为长臂猿。
事实上其他一些可解释性较好的模型面对的对抗样本问题可能甚至比深度学习模型更多,但具备可解释性的模型在面对这些问题的时候是可以对异常产生的原因进行追踪和定位的,比如线性回归模型中我们可以发现某个输入参数过大/过小导致了最后判别失常。但深度学习模型很难说上面这两幅图到底是因为哪些区别导致了判定结果出现了如此大的偏差。尽管关于对抗样本的研究最近也非常火热,但依然缺乏具备可解释性的关于这类问题的解释。
当然很多学者对可解释性的必要性也存有疑惑,在NIPS 2017会场上,曾进行了一场非常激烈火爆的主题为“可解释性在机器学习中是否必要”的辩论,大家对可解释性的呼声还是非常高的。
但人工智能三巨头之一的Yann LeCun却认为:人类大脑是非常有限的,我们没有那么多脑容量去研究所有东西的可解释性。有些东西是需要解释的,比如法律,但大多数情况下,它们并没有你想象中那么重要。比如世界上有那么多应用、网站,你每天用Facebook、Google的时候,你也没想着要寻求它们背后的可解释性。
LeCun也举了一个例子:他多年前和一群经济学家也做了一个模型来预测房价。第一个用的简单的线性于猜测模型,经济学家也能解释清楚其中的原理;第二个用的是复杂的神经网络,但效果比第一个好上不少。结果,这群经济学家想要开公司做了。你说他们会选哪个?LeCun表示,任何时候在这两种里面选择都会选效果好的。就像很多年里虽然我们不知道药物里的成分但一直在用一样。
但是不可否认的是,可解释性始终是一个非常好的性质,如果我们能兼顾效率、准确度、说人话这三个方面,具备可解释性模型将在很多应用场景中具有不可替代的优势。
我们之前也提到机器学习的目的是从数据中发现知识或解决问题,那么在这个过程中只要是能够提供给我们关于数据或模型的可以理解的信息,有助于我们更充分地发现知识、理解和解决问题的方法,那么都可以归类为可解释性方法。如果按照可解释性方法进行的过程进行划分的话,大概可以划分为三个大类:
1. 在建模之前的可解释性方法
2. 建立本身具备可解释性的模型
3. 在建模之后使用可解释性方法对模型作出解释
这一类方法其实主要涉及一些数据预处理或数据展示的方法。机器学习解决的是从数据中发现知识和规律的问题,如果我们对想要处理的数据特征所知甚少,指望对所要解决的问题本身有很好的理解是不现实的,在建模之前的可解释性方法的关键在于帮助我们迅速而全面地了解数据分布的特征,从而帮助我们考虑在建模过程中可能面临的问题并选择一种最合理的模型来逼近问题所能达到的最优解。
数据可视化方法就是一类非常重要的建模前可解释性方法。很多对数据挖掘稍微有些了解的人可能会认为数据可视化是数据挖掘工作的最后一步,大概就是通过设计一些好看又唬人的图表或来展示你的分析挖掘成果。但大多数时候,我们在真正要研究一个数据问题之前,通过建立一系列方方面面的可视化方法来建立我们对数据的直观理解是非常必须的,特别是当数据量非常大或者数据维度非常高的时候,比如一些时空高维数据,如果可以建立一些一些交互式的可视化方法将会极大地帮助我们从各个层次角度理解数据的分布,在这个方面我们实验室也做过一些非常不错的工作。
还有一类比较重要的方法是探索性质的数据分析,可以帮助我们更好地理解数据的分布情况。比如一种称为MMD-critic方法中,可以帮助我们找到数据中一些具有代表性或者不具代表性的样本。
建立本身具备可解释性的模型是我个人觉得是最关键的一类可解释性方法,同样也是一类要求和限定很高的方法,具备“说人话”能力的可解释性模型大概可以分为以下几种:
1. 基于规则的方法(Rule-based)
2. 基于单个特征的方法(Per-feature-based)
3. 基于实例的方法(Case-based)
4. 稀疏性方法(Sparsity)
5. 单调性方法(Monotonicity)
基于规则的方法比如我们提到的非常经典的决策树模型。这类模型中任何的一个决策都可以对应到一个逻辑规则表示。但当规则表示过多或者原始的特征本身就不是特别好解释的时候,基于规则的方法有时候也不太适用。
基于单个特征的方法主要是一些非常经典的线性模型,比如线性回归、逻辑回归、广义线性回归、广义加性模型等,这类模型可以说是现在可解释性最高的方法,可能学习机器学习或计算机相关专业的朋友会认为线性回归是最基本最低级的模型,但如果大家学过计量经济学,就会发现大半本书都在讨论线性模型,包括经济学及相关领域的论文其实大多数也都是使用线性回归作为方法来进行研究。
这种非常经典的模型全世界每秒都会被用到大概800多万次。为什么大家这么青睐这个模型呢?除了模型的结构比较简单之外,更重要的是线性回归模型及其一些变种拥有非常solid的统计学基础,统计学可以说是最看重可解释性的一门学科了,上百年来无数数学家统计学家探讨了在各种不同情况下的模型的参数估计、参数修正、假设检验、边界条件等等问题,目的就是为了使得在各种不同情况下都能使模型具有有非常好的可解释性,如果大家有时间有兴趣的话,除了学习机器学习深度模型模型之外还可以尽量多了解一些统计学的知识,可能对一些问题会获得完全不一样的思考和理解。
基于实例的方法主要是通过一些代表性的样本来解释聚类/分类结果的方法。比如下图所展示的贝叶斯实例模型(Bayesian Case Model,BCM),我们将样本分成三个组团,可以分别找出每个组团中具有的代表性样例和重要的子空间。比如对于下面第一类聚类来说,绿脸是具有代表性的样本,而绿色、方块是具有代表性的特征子空间。
基于实例的方法的一些局限在于可能挑出来的样本不具有代表性或者人们可能会有过度泛化的倾向。
基于稀疏性的方法主要是利用信息的稀疏性特质,将模型尽可能地简化表示。比如如下图的一种图稀疏性的LDA方法,根据层次性的单词信息形成了层次性的主题表达,这样一些小的主题就可以被更泛化的主题所概括,从而可以使我们更容易理解特定主题所代表的含义。
基于单调性的方法:在很多机器学习问题中,有一些输入和输出之间存在正相关/负相关关系,如果在模型训练中我们可以找出这种单调性的关系就可以让模型具有更高的可解释性。比如医生对患特定疾病的概率的估计主要由一些跟该疾病相关联的高风险因素决定,找出单调性关系就可以帮助我们识别这些高风险因素。
建模后的可解释性方法主要是针对具有黑箱性质的深度学习模型而言的,主要分为以下几类的工作:
1. 隐层分析方法
2. 模拟/代理模型
3. 敏感性分析方法
这部分是我们接下来介绍和研究的重点,因此主要放在后续的文章中进行讲解,在本篇中不作过多介绍。
除了对深度学习模型本身进行解释的方法之外,也有一部分工作旨在建立本身具有可解释性的深度学习模型,这和我们前面介绍通用的可解释性模型有区别也有联系,也放到以后的文章中进行介绍。
02
深度学习的可解释性研究(二)
在上一节中我们介绍了深度学习可解释性的三种方法:1. 隐层分析法,2. 敏感性分析法 3. 代理/替代模型法。在这一节中我们主要介绍第一种方法:隐层分析法。
通过上一节的介绍我们也了解到,深度学习的黑箱性主要来源于其高度非线性性质,每个神经元都是由上一层的线性组合再加上一个非线性函数的得到,我们无法像理解线性回归的参数那样通过非常solid的统计学基础假设来理解神经网络中的参数含义及其重要程度、波动范围。
但实际上我们是知道这些参数的具体值以及整个训练过程的,所以神经网络模型本身其实并不是一个黑箱,其黑箱性在于我们没办法用人类可以理解的方式理解模型的具体含义和行为,而神经网络的一个非常好的性质在于神经元的分层组合形式,这让我们可以用物质组成的视角来理解神经网络的运作方式。比如如下图所示,人体的组成过程是从分子-细胞-组织-器官-系统-人体:
而通过一些对神经网络隐层的可视化我们也发现:比如下图的一个人脸识别的例子,神经网络在这个过程中先学到了边角的概念,之后学到了五官,最后学到了整个面部的特征。
(以上内容参考了@YJango在如何简单形象又有趣地讲解神经网络是什么?中的回答,侵删)
如果我们能够用一些方法来帮助我们理解这个从低级概念到高级概念的生成过程,那么就离理解神经网络的具体结构就近了很多。而这也可以逐渐帮助我们完成一个“祛魅”的过程,将调参的魔法真正变成一项可控、可解释的过程。
要理解这个概念的生成过程很重要的一点就是要研究隐层的概念表示,在接下来的部分中我将给大家介绍业界关于隐层分析方法的几个研究工作。
要理解神经网络中每层都学到了哪些概念一个非常直观的方法就是通过对隐层运用一些可视化方法来将其转化成人类可以理解的有实际含义的图像,这方面一个非常具有代表性的一个工作就是14年ECCV的一篇经典之作:《Visualizing and Understanding Convolutional Networks》,这篇文章主要利用了反卷积的相关思想实现了特征可视化来帮助我们理解CNN的每一层究竟学到了什么东西。我们都知道典型的CNN模型的一个完整卷积过程是由卷积-激活-池化(pooling)三个步骤组成的。而如果想把一个CNN的中间层转化成原始输入空间呢?我们就需要经过反池化-反激活-反卷积这样的一个逆过程。整个模型的结构如下图所示:
反池化其实很好理解,以下面的图片为例,左图可以表示是池化(pooling)过程,右图表示反池化(unpooling)过程,池化过程中我们将3*3的一个pooling块中的最大值取出,而反池化则是将pooling后的值恢复成3*3的像素单元,由于我们现在只有一个激活值, 所以只将该激活值对应原pooling块中位置的值还原回去,其他的值设定成0。所以在max-pooling的时候,我们不光要知道pooling值,同时也要记录下pooling值的对应位置,比如下图pooling值的位置就是(0,1)。
反激活:
在典型的CNN模型中,我们一般使用Relu作为激活函数,而反激活的值和实际的激活值没有任何区别:只保留正数,其余值为0即可。
反卷积的过程其实非常有意思,其实反卷积这个名字多多少少有些误人子弟,和真正的反卷积并没有多大关系,真实的含义应该是转置卷积(Transposed Convolution),CNN模型的卷积过程本质上来讲和一般的神经网络没有任何区别(只不过将一些共用参数组合成了一个滤波器的形式),都可以转变成一个矩阵乘法的操作(只不过对CNN模型来说是一个参数重复度很高的稀疏矩阵),我们不妨将这个稀疏矩阵表示为 C,那么后一层和前一层的关系就可以表示为:
而在反向传播的过程中, 往往可以表示为卷积层对输入层的梯度,也就是说通过对卷积层进行适当的补0操作,再用原始的卷积核转置之后的卷积核进行卷积操作,就可以得到相应的梯度矩阵与当前卷积层的乘积,而我们在这里使用反池化-反激活之后的特征(其中包含了大部分为0的数值)进行该操作其实表征了原始输入对池化之后的特征的影响,因为在反激活过程中保证了所有值非负因此反卷积的过程中符号不会发生改变。
通过上面的介绍我们其实可以明白,这个反卷积的方法之所以能够成功地将CNN的隐层可视化出来,一个关键就在于通过反激活-反池化的过程,我们屏蔽掉了很多对当前层的激活值没有实际作用的输入层的影响将其归为0,通过反卷积操作就得到了仅对当前层有实际贡献的输入层的数值——将其作为该层的特征表示。因为我们最后得到的这个特征表示和原输入空间的大小是一致的,其数值表示也对应着原始空间的像素点,所以在一定程度上,这是我们可以理解的一个特征表示。
从实验结果可以看出来,第二层对应着一些边角或色彩特征,第三层对应着纹理特征,第四层对应着一些如狗脸、车轮这样的局部部位,第五层则对整体的物体有较强的识别能力。
通过上面这篇论文的工作,我们可以大致地用肉眼来判断神经网络学到的概念类型,但如果能识别一些语义概念的话对我们来说可能更有意义,在这方面一个非常有代表性的工作是在CVPR 2017上发表《Network Dissection:Quantifying.Interpretability.of.Deep.VisualRepresentations》,这篇文章提出了一种网络切割(Network Dissection)的方法来提取CNN的概念表示。
所谓的网络切割(Network Dissection)方法其实分为三个步骤:
1. 识别一个范围很广的人工标注的视觉语义概念数据集
2. 将隐层变量对应到这些概念表示上
3. 量化这些隐层-概念对的匹配程度
为了获得大量的视觉语义概念数据,研究人员收集了来自不同数据源的分层语义标注数据(包括颜色、材质、材料、部分、物体、场景这几个层次),如下图所示
而如何将隐层变量对应到这些概念表示上并获得隐层-概念对的匹配程度呢,本文提出了如下的方法:
对于每个输入图像x,获取每个隐层k的activation map (其实也就是feature map),这样就可以得到隐层k激活值的分布,对于每个隐层k,我们都可以找到一个 使得 ,这个 可以作为接下来判断区域是否激活的一个标准。
为了方便对比低分辨率的卷积层和输入层的概念激活热图
(其实就是标注出了相关概念在图像中的代表区域),我们将低分辨率的卷积层的特征图 通过插值的方法扩展为和原始图片尺寸一样大的图像 。
之后再建立一个二元分割 ,这样就得到了所有被激活的区域,而我们通过将 和输入层的概念激活热图 作对比,这样就可以获得隐层-概念对的匹配程度:
可以发现如果匹配度高的话,那么分子就比较大(交叉范围大),分母就比较小(合并范围小),我们通过和颜色、材质、材料、部分、物体、场景不同层次的概念作匹配就能得到隐层学到的概念层次了,这个模型的结构如下图所示:
从实验结果中我们也可以发现随着层数的增加,神经网络学到的概念类型也逐渐变得高级,比如在AlexNet中,前面的卷积层对颜色、材质的识别力较强,后面的卷积层对物体、场景的识别力较强。特别是对物体的识别上,后面的卷积层有突出的优势。
当然从低级概念到高级概念的一个过程中总是会伴随着一个非常有意思的现象:泛化性逐渐降低,特化性逐渐升高。比如在细胞层次上,人类和其他动物的区别比较小,这个层次的泛化性就高,但到组织器官层次区别就比较大,这个层次的特化性就高。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+的性能确是最好的,特征在迁移任务上表现出来的优势其实也对应了我们在上一节中讲的模型本身也意味着知识。
对于神经网络来说,隐层的数量永远都是一个玄学,我们如何理解隐层的数量和模型性能之间的关系呢?Bengio在2016年还做过一个工作《Understanding intermediate layers using linear classifier probes》。这篇文章的思路非常简单,就是通过在每个隐层中添加一个线性探针来测试隐层的表征性能。什么是线性探针呢?也很简单,就是以每个隐藏层为输入,判别的label为输出建立一个逻辑回归模型,通过评估模型的准确率我们就能得到隐层在整个训练过程中以及训练结束之后表征性能的变化。
通过32个隐层在二分数据上的实验我们可以发现随着隐层的增加表征性能不断提高,但提高的比率也逐渐趋于缓慢。
在基于Minist数据训练的CNN模型上,经过10个周期的训练,第一个卷积层的表征性能提升非常明显,但之后的卷积层并没有很明显的提升。
本文中我们主要介绍了四个在隐层分析上有代表性的工作,这类方法在神经网络可解释性的研究中向我们揭示了隐层性质的变化和概念生成的过程,在之后要讲到的敏感性分析方法中,也会不可避免地涉及对隐层的分析。
参考文献
Matthew D. Zeiler, Rob Fergus. Visualizing and Understanding Convolutional Networks[J]. 2013, 8689:818-833.
David Bau, Bolei Zhou, Aditya Khosla, et al. Network Dissection: Quantifying Interpretability of Deep Visual Representations[J]. 2017:3319-3327.
Yosinski J, Clune J, Bengio Y, et al. How transferable are features in deep neural networks?[J]. Eprint Arxiv, 2014, 27:3320-3328.
Alain G, Bengio Y. Understanding intermediate layers using linear classifier probes[J]. 2016.
未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能,互联网和脑科学交叉研究机构。
未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联网(城市)云脑研究计划,构建互联网(城市)云脑技术和企业图谱,为提升企业,行业与城市的智能水平服务。
如果您对实验室的研究感兴趣,欢迎加入未来智能实验室线上平台。扫描以下二维码或点击本文左下角“阅读原文”