前言

研究CNN的可解释性,可以让我们知道为什么模型会做出这样的决定,因为我们很难用黑盒的模型去说服用户去做一个医疗上的或者军事上的一个重大决定。同时,通过可解释性的研究,我们可以知道为什么CNN做出这样的决定,从而更好地诊断我们地模型。

如何解释一个CNN模型?如果我们可以知道对应不同的物体,CNN模型在关注什么地方,这会是一个很好的解释。

要实现这个目标,目前的方法有:

  • Occulsion sentivity
  • Deconvolution
  • Guided Back-propagation
  • CAM
  • Grad-CAM
  • LIME

Occulsion sentivity

Occulsion sentivity的思想可以这样理解,假设有一张“一个男人正在吹号的图片”,如果我们想知道模型认为什么地方是圆号,那么可以对图片中的不同未知进行遮挡,如果遮挡后的图片让模型识别不出圆号,那么这就是模型认为这是圆号的地方。

img

参考:

Deconvolution

Deconvnet的使用和训练好的convnet同样的参数,但是使用相反的计算过程。

要想可视化一个convnet,可以在convnet的每一层附带上一层deconvnet。deconvnet输入一个feature map(比如输入最大响应的那个feature map),然后将其它层的激活值设为0。接着对输入的feature map连续进行unpooling,rectify和filter。deconvnet layer和unpool的图示如下:

1554562983905

参考:

Guided Back-propagation

反卷积和导向反向传播的基础都是反向传播,主要思想是对输入模型的内容进行求导。不同的是普通反向传播是将输入大于0的梯度传递回去,反卷积是将梯度大于0对应的梯度传递回去,导向反向传播是将输入和梯度均大于0的梯度传递回去。

虽然方法上差别不大,但是最终的结果却有很大差别:

img

参考:

CAM

对输入求导的方法虽然可以告诉我们模型在关注哪里,但是并不能拿来解释分类,因为我们不知道模型对不同类别的反应是什么样的。CAM提供了一个解决方法。它使用Global Average Pooling(GAP)替换掉全连接层将网络之前层学习的带有空间信息feature map降为低维的信号。最后一层全连接层学习到的参数可以作为feature maps对应不同类别的权重参数。通过将某一个类别的feature maps进行权重加和可以得到我们想要的Class Activation Map。

img

参考:

Grad-CAM

但是CAM有个实现的前提是需要更改模型结构,这在有的时候是致命的。于是Grad-CAM横空出世。Grad-CAM另辟蹊径,用梯度的全局平均来计算权重。事实上,经过严格的数学推导,Grad-CAM与CAM计算出来的权重是等价的。

除了直接生成热力图对分类结果进行解释,Grad-CAM还可以与其他经典的模型解释方法如导向反向传播相结合,得到更细致的解释。

img

参考:

LIME

LIME是KDD 2016上一篇非常漂亮的论文,思路简洁明了,适用性广,理论上可以解释任何分类器给出的结果。其核心思想是:对一个复杂的分类模型(黑盒),在局部拟合出一个简单的可解释模型,例如线性模型、决策树等等。

img

如图所示,红色和蓝色区域表示一个复杂的分类模型(黑盒),图中加粗的红色十字表示需要解释的样本,显然,我们很难从全局用一个可解释的模型(例如线性模型)去逼近拟合它。但是,当我们把关注点从全局放到局部时,可以看到在某些局部是可以用线性模型去拟合的。具体来说,我们从加粗的红色十字样本周围采样,所谓采样就是对原始样本的特征做一些扰动,将采样出的样本用分类模型分类并得到结果(红十字和蓝色点),同时根据采样样本与加粗红十字的距离赋予权重(权重以标志的大小表示)。虚线表示通过这些采样样本学到的局部可解释模型,在这个例子中就是一个简单的线性分类器。在此基础上,我们就可以依据这个局部的可解释模型对这个分类结果进行解释了。

一个看似复杂的模型通过我们巧妙的转换,就能够从局部上得到一个让人类理解的解释模型,光这样说还是显得有些空洞,具体来看看LIME在图像识别上的应用。我们希望LIME最好能生成和Grad-CAM一样的热力图解释。但是由于LIME不介入模型的内部,需要不断的扰动样本特征,这里所谓的样本特征就是指图片中一个一个的像素了。仔细一想就知道存在一个问题,LIME采样的特征空间太大的话,效率会非常低,而一张普通图片的像素少说也有上万个。若直接把每个像素视为一个特征,采样的空间过于庞大,严重影响效率;如果少采样一些,最终效果又会比较差。

所以针对图像任务使用LIME时还需要一些特别的技巧,也就是考虑图像的空间相关和连续的特性。不考虑一些极小特例的情况下,图片中的物体一般都是由一个或几个连续的像素块构成,所谓像素块是指具有相似纹理、颜色、亮度等特征的相邻像素构成的有一定视觉意义的不规则像素块,我们称之为超像素。相应的,将图片分割成一个个超像素的算法称为超像素分割算法,比较典型的有SLIC超像素分割算法还有quickshit等,这些算法在scikit-image库中都已经实现好了,quickshit分割后如图所示:

img

从特征的角度考虑,实际上就不再以单个像素为特征,而是以超像素为特征,整个图片的特征空间就小了很多,采样的过程也变的简单了许多。更具体的说,图像上的采样过程就是随机保留一部分超像素,隐藏另一部分超像素。

整体流程如图所示:

img

和Grad-CAM一样,LIME同样可以对其他可能的分类结果进行解释。

img

参考:

Reference

实现:

笔记: