Grad-CAM:Visual Explanations from Deep Networks via Gradient-based Localization

1.Abstract

我们提供了一种方法(Grad-CAM)高亮图片中对预测产生影响的重要区域:

1.在CNN的模型家族里适用范围广:image classfication,image captioning,VOA。

2.提供对CNN失败样例的观察(显示看似不合理的预测的合理解释)。

3.在 ILSVRC-15弱监督定位任务上比以往的方法表现更好。

4.更忠实于底层模型。

5.通过辨认数据集的偏移来实现模型泛化。

6.帮助未经训练的用户成功地区分“更强”的网络和“更弱”的网络,即使两者做出的预测完全相同。

2.Introduction

  • 卷积神经网络在很多的任务中以及取得了重大突破,但是对于解释它们为什么这么预测,预测了什么是必须的是很有必要的。Consequently, when today’s intelligent systems fail, they fail spectacularly dis-gracefully, without warning or explanation, leaving a user staring at an incoherent output, wondering why. 摘选自原论文。

  • Class Activation Mapping(CAM)这个方法提供了一种在图像分类任务上识别 discriminative regions的方法(我的理解是将图片中对分类发挥作用的区域找出来),但是这个方法移除了CNN网络的全连接层( Section Approach会介绍这个方法)。论文中提出的方法Grad-CAM并没有修改模型结构,是CAM的泛化,并且能够应用在更大范围的CNN模型家族(mage classfication,image captioning,VOA)。

  • 进行了几种可视化方法的优缺点介绍对比

    • Guided Back-propagation 和 Deconvolution是高分辨率的并且高亮了细粒度的细节,但是并不能区分类别。如图1b,1h,Guided Backprop只提取出了图片中的猫与狗的所有纹理。

    • CAM,Grad-CAM具有很高的类别区分性。如图1c,1i and 1f,1l。其实这里也能看出来,ResNet比VGG16更优一些,以猫为例子,1c(VGG16)的注意力在身体上,1f(ResNet)在头部区域,ResNet关注的位置要比VGG16更符合人类的直觉。

    • 将上面二者的优点进行结合,得到了Guided Grad-CAM,如图1d,1j,

    • 论文还指出了,Grad-CAM得到的结果,与遮挡敏感性的实验结果非常类似。

    • 需要额外指出的是:Grad-CAM, CAM得到的localization map的尺寸与最后一个卷积层得到的feature maps的高宽相同,小于原始输入图片的分辨率。因此1c,1i,1f,1l是localization map进行上采样(双线性差值)并且与输入图片叠加得到的。在 Section Approach有Grad-CAM, CAM的实现方法介绍。

3.Approach

  • Grad-CAM实现方法,

论文中给出的图是这样的,笔者单独把Image Classification的实现方法画了出来,可以结合原论文去理解。当然也可以自行忽略我画的,,,,

将Localization Map上采样(双线性差值)之后,再与Guided Backprop得到的结果点乘,就得到了Guided Grad-CAM。

同时,论文指出Deconvolution得到的高分辨率图片有伪影,Guided Backprop得到的结果具有更少的噪声。

  • CAM实现方法

CAM的思想是去掉全连接层,加一层GAP,然后通过论文中的这个公式:

\[S^{c}=\sum_{k} \underbrace{w_{k}^{c}}_{\text {class feature weights }} \overbrace{\frac{1}{Z} \sum_{i} \sum_{j}}^{\text {global average pooling }} \underbrace{A_{i j}^{k}}_{\text {feature map }}
\]

求出每个类别对应的分数。模型训练完之后,又可以通过论文中的这个公式得到\(L^c_{CAM}\)

\[S^{c}=\frac{1}{Z} \sum_{i} \sum_{j} \underbrace{\sum_{k} w_{k}^{c} A_{i j}^{k}}_{L_{\mathrm{CAM}}^{c}}
\]

图片描述更加好懂一些:

4.Evaluating Localization

4.1. Weakly-supervised Localization

这小节主要介绍了Grad-CAM在弱监督的定位任务上的表现。笔者对弱监督学习还不是很了解,因此不介绍太多。

4.2 Weakly-supervised Segmentation

使用Grad-CAM作为的弱监督定位种子,在VGG16网络上,达到的IoU(一个指标)比CAM要高。

5.Evaluating Visualizations

5.1 Evaluating Class Discrimination

作者在PASCAL VOC 2007中选择了一部分图像(每个图像包含两个注释的类别)进行验证,他Deconvolution、Guided Backpropagation和Grad-CAM分别结合这两个方法得到Deconvolution Grad-CAM和Guided Grad-CAM一共四个方法去对待测样本进行可视化分析,然后在自己的组织Amazon Mechanical Turk (AMT)抽选志愿者进行人为的识别,通过人和机器的对比观察在前向过程中哪一种方法对于类别分类可解释有较好的结果。其实验结果如下:

这一小节读得有点磕磕绊绊。

5.2 Evaluating Trust

Grad-CAM可以更好地评判模型的可信度。作者让54个AMT workers进行如下图这样的打分,使用Grad-CAM进行的可视化在评判模型的可信度上表现更好。

5.3 Faithfulness vs. Interpretability

这一小节是比较可视化方法对模型的忠实度。是通过遮挡实验进行评估的,发现Grad-CAM的可视化区域的遮挡敏感性更高,说明该方法更加忠实于模型。

文中提到了一个 rank correlation(秩相关)。

6.Diagnosing image classification CNNs with Grad-CAM

6.1 Analyzing failure modes for VGG-16

一些错误的预测,通过Grad-CAM进行观察后,似乎有了合理的解释。从上图也可以看出,作者认为CNN模型将样本分类错误是有依据的,比如说对于第一列的样本,CNN模型将其分类成sandbar,但是实际上groundtruth为volcano,因为CNN模型的分类过程他的注意力主要集中在了sandbar的这个目标上,所以对于最终的分类过程显示sandbar更加容易被预测作为结果。

6.2 Effect of adversarial noise on VGG-16



在给神经增添一些不可感知的扰动之后,使得神经网络预测出现失误,但是以类别cat或者dog进行Grad-CAM时依然可以很好地标记出二者的位置,关于神经网络在对抗样本的脆弱性方面的知识挺有意思的好像,读者想了解更多https://cloud.tencent.com/developer/article/1119884

6.3 Identifying bias in dataset

对于一个判断是医生还是护士的任务,有偏置的训练集里医生主要是男性,护士主要是女性,模型学会了关注hairstyle,face去进行预测。而当把训练集进行调整之后,医生类别里添加更多的女医生,护士类别里添加更多的男护士,模型学会了从服饰,听诊器来进行预测。同时论文作者还提了一句对于科学和社会公平的思考:“ This experiment demonstrates a proof-of-concept that Grad-CAM can help detect and remove biases in datasets, which is important not just for better generalization, but also for fair andethical outcomes as more algorithmic decisions are made in society.”

7. Grad-CAM for Image Captioning and VQA

这一节作者又介绍了Grad-CAM在 Image Captioning and VQA 上的良好表现,笔者在这个方面知识不是很全面,因此只通读了一下,暂不做总结。

What if

首先需要记住的是,这个方法最本初的用途是:找到图片中使得神经网络做出预测的区域

当我理解了Grad-CAM的实现方法之后:

有了一个疑惑一直萦绕在心头,为什么不直接反向传播,然后得到预测分类c的分数score关于输入图片的像素值pixel的导数 $\partial score^c \over \partial pixel $,这样不就找到了哪些像素最能影响神经网络做出这个决策。但实际上,这个叫做Vanilla backpropagation的方法可视化效果不好:

图片引自:https://github.com/kazuto1011/grad-cam-pytorch

那为什么这个原始的方法效果不好呢?问题似乎出现在relu函数这里,引用了这篇博客里的示意图,\(f\)是前向传播时经过relu函数的矩阵,\(R^{l+1}_i\)是上游传下来的梯度值,\(R^{l}_i\)是经过relu函数反向传播得到的梯度值。

可以看到,反向传播时,上游梯度很多的正值丢失了,同时一些负值传了下来。但正值是对最终结果做出“促进”作用的,反之亦然。或许是因为这个原因吧。

所以出现了Guided Backpropagation,这个方法对梯度反向传播通过relu节点时的计算方法做了修改:

得到的可视化结果好了许多:

图片引自:https://github.com/kazuto1011/grad-cam-pytorch

但也发现了Guided Backpropagation的类区分性差了一些,比如第二列的猫和狗,不如Grad-CAM,感兴趣的读者可以去上面的github链接查阅更多可视化结果。

至此,从Vanilla backpropagation -->Guided Backpropagation-->CAM-->Grad-CAM介绍完毕。

8.Summary

昨天一篇公众号发了一篇文章,有一句话另外印象深刻:作为一名工科学生,光有天马行空的想法还不够,还得具备实现想法的能力。

这不说的就是我自己,花了一天时间尝试去搭deconvnet,还失败了,接下来准备把pytorch系统学一遍,对里面的各种常用操作有个大致了解,这样做实验应该顺畅一些。

总结的一些点:

  • Grad-CAM的实现方法,及其更好的效果(更高的类区分性,不用修改模型结构等)

  • Grad-CAM可以帮助观察数据集的偏移,6.3护士和医生的例子。

  • 论文涉及了到的还不甚了解的概念,需要填坑

    • 秩相关
    • 双线性差值
    • 神经网络关于对抗样本的脆弱性
  • Deconvlution得到的结果有伪影,因此作者使用了Grad-CAM + Guided Backpropagation得到 Guided Grad-CAM

  • Google in English,一些内容,中文网上没有好的阐述,但是有些外国友人的博客写得很明白。

Grad-CAM:Visual Explanations from Deep Networks via Gradient-based Localization的更多相关文章

  1. 神经网络可视化《Grad-CAM:Visual Explanations from Deep Networks via Gradient-based Localization》

    神经网络已经在很多场景下表现出了很好的识别能力,但是缺乏解释性一直所为人诟病.<Grad-CAM:Visual Explanations from Deep Networks via Gradi ...

  2. 论文笔记:SiamRPN++: Evolution of Siamese Visual Tracking with Very Deep Networks

    SiamRPN++: Evolution of Siamese Visual Tracking with Very Deep Networks 2019-04-02 12:44:36 Paper:ht ...

  3. 论文笔记之:Action-Decision Networks for Visual Tracking with Deep Reinforcement Learning

    论文笔记之:Action-Decision Networks for Visual Tracking with Deep Reinforcement Learning  2017-06-06  21: ...

  4. Deep Learning 8_深度学习UFLDL教程:Stacked Autocoders and Implement deep networks for digit classification_Exercise(斯坦福大学深度学习教程)

    前言 1.理论知识:UFLDL教程.Deep learning:十六(deep networks) 2.实验环境:win7, matlab2015b,16G内存,2T硬盘 3.实验内容:Exercis ...

  5. 【DeepLearning】Exercise: Implement deep networks for digit classification

    Exercise: Implement deep networks for digit classification 习题链接:Exercise: Implement deep networks fo ...

  6. Deep Networks : Overview

    Overview In the previous sections, you constructed a 3-layer neural network comprising an input, hid ...

  7. On the Optimization of Deep Networks: Implicit Acceleration by Overparameterization

    目录 引 主要内容 定理1 Claim 1 Claim 2 定理2 证明 定理1的证明 Claim 1 的证明 Kronecker product (克罗内克积) Theorem 2 的证明 代码 A ...

  8. Initialization of deep networks

    Initialization of deep networks 24 Feb 2015Gustav Larsson As we all know, the solution to a non-conv ...

  9. 基于pytorch实现HighWay Networks之Train Deep Networks

    (一)Highway Networks 与 Deep Networks 的关系 理论实践表明神经网络的深度是至关重要的,深层神经网络在很多方面都已经取得了很好的效果,例如,在1000-class Im ...

随机推荐

  1. 第十七个知识点:描述和比较DES和AES的轮结构

    第十七个知识点:描述和比较DES和AES的轮结构 这是密码学52件事中的第17篇.本周我们描述和比较DES和AES的结构. DES和AES都是迭代分组密码的例子.分组密码通过重复使用一个简单的轮函数来 ...

  2. 响应式网页设计(Bootstrap)

    Bootstrap官网 AOS官网 Chrome官方教程 Chrome教程 Bootstrap官网中有许多Bootstrap网站示例,大家可以参考

  3. [黑科技]pb_ds库(G++)

    一.hash(速度快的恐怖).http://codevs.cn/problem/1230/ 1 #include<stdio.h> 2 #include<ext/pb_ds/asso ...

  4. 懂得三境界-使用dubbo时请求超过问题

    引子 刚才下班回家路上,无意中听到大街上放的歌,歌词有这么一句:"毡房外又有驼铃声声响起,我知道那一定不是你".这一句我似乎听懂了歌者的魂牵梦绕和绝望,如果在十年前我大概只能感受出 ...

  5. JavaScript交互式网页设计笔记 • 【目录】

    章节 内容 实践练习 JavaScript交互式网页设计作业目录(作业笔记) 第1章 JavaScript交互式网页设计笔记 • [第1章 JavaScript基本语法] 第2章 JavaScript ...

  6. k8s污点

    https://www.iyunw.cn/archives/k8s-wu-dian-shi-yong-fang-fa-shi-li/ kubectl taint nodes node1 key=val ...

  7. 黑客帝国纯js版

    明天就回家过年了,今天没什么心思上班,看了下博客,发现一个黑客帝国额js版本,地址:https://blog.csdn.net/zhongyi_yang/article/details/5384180 ...

  8. 关于PaddleSharp GPU使用 常见问题记录

    在安装NVIDIA驱动过程中遇到一系列问题,记录如下! 附上PaddleSharp地址,大家喜欢可以关注 根据PaddleSharp官方说明需要安装驱动如下 CUDA 和 cuDNN 和 Tensor ...

  9. 在使用django admin的后台搜索时报错

    在使用django admin的后台搜索时报错 百度说在search_fields中定义了非字符串字段,最后发现author引用了外键 解决办法: 有外健时应写成: 本表外键字段__外键所在表所需要查 ...

  10. Linux_yum安装时报404错误

    使用yum安装报错如下: [root@localhost ~]# yum install gcc 已加载插件:fastestmirror Loading mirror speeds from cach ...