gradcas(Grad-CAM简介)
论文名称:Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization
论文下载地址:https://arxiv.org/abs/1610.02391
推荐代码(Pytorch):https://github.com/jacobgil/pytorch-grad-cam
bilibili视频讲解:https://b23.tv/1kccjmb0 前言
对于常用的深度学习网络(例如CNN) ,普遍认为是个黑盒可解释性并不强(至少现在是这么认为的) ,它为什么会这么预测 ,它关注的点在哪里 ,我们并不知道 。很多科研人员想方设法地去探究其内在的联系 ,也有很多相关的论文 。今天本文简单聊一聊Grad-CAM ,这并不是一篇新的文章 ,但很有参考意义 。通过Grad-CAM我们能够绘制出如下的热力图(对应给定类别 ,网络到底关注哪些区域) 。Grad-CAM(Gradient-weighted Class Activation Mapping)是CAM(Class Activation Mapping)的升级版(论文3.1节中给出了详细的证明) ,Grad-CAM相比与CAM更具一般性 。CAM比较致命的问题是需要修改网络结构并且重新训练 ,而Grad-CAM完美避开了这些问题 。本文不对CAM进行讲解 ,有兴趣的小伙伴自行了解 。
刚刚提到Grad-CAM能够帮我们分析网络对于某个类别的关注区域 ,那么我们通过网络关注的区域能够反过来分析网络是否学习到正确的特征或者信息 。在论文6.3章节中举了个非常有意思的例子,作者训练了一个二分类网络 ,Nurse和Doctor 。如下图所示 ,第一列是预测时输入的原图,第二列是Biased model(具有偏见的模型)通过Grad-CAM绘制的热力图 。第三列是Unbiased model(不具偏见的模型)通过Grad-CAM绘制的热力图 。通过对比发现 ,Biased model对于Nurse(护士)这个类别关注的是人的性别 ,可能模型认为Nurse都是女性 ,很明显这是带有偏见的 。比如第二行第二列这个图 ,明明是个女Doctor(医生) ,但Biased model却认为她是Nurse(因为模型关注到这是个女性)。而Unbiased model关注的是Nurse和Doctor使用的工作器具以及服装 ,明显这更合理 。
1 Grad-CAM介绍以及实验
1.1 理论介绍
作者的想法还是比较简单的 ,参见下图 。这里我们简单看下Image Classification任务 ,首先网络进行正向传播 ,得到特征层
A
A
A(一般指的是最后一个卷积层的输出)和网络预测值y
y
y(注意 ,这里指的是softmax激活之前的数值)。假设我们想看下网络针对Tiger Cat这个类别的感兴趣区域 ,假设网络针对Tiger Cat类别的预测值为y
c
y^c
yc 。接着对y
c
y^c
yc进行反向传播 ,能够得到反传回特征层A
A
A的梯度信息A
ˊ
\acute{A}
Aˊ 。通过计算得到针对特征层A
A
A每个通道的重要程度,然后进行加权求和通过R
e
L
U
ReLU
ReLU就行了 ,最终得到的结果即是Grad-CAM 。至于为什么要这么做 ,我这里讲下我个人的观点(若有不对请指出) 。首先得到的特征层
A
A
A是网络对原图进行特征提取得到的结果,越往后的特征层抽象程度越高 ,语义信息越丰富 ,而且利用CNN抽取得到的特征图是能够保留空间信息的(Transformer同样) 。所以Grad-CAM在CNN中一般A
A
A都指的是最后一个卷积层的输出(参考下图实验 ,越往后的特征层效果越好) 。当然特征层A
A
A包含了所有我们感兴趣目标的语义信息 ,但具体哪些语义信息对应哪个类别我们并不清楚 。接着通过对类别c
c
c的预测值y
c
y^c
yc进行反向传播 ,得到反传回特征层A
A
A的梯度信息A
ˊ
\acute{A}
Aˊ ,那么A
ˊ
\acute{A}
Aˊ就是y
c
y^c
yc对A
A
A求得的偏导 ,换句话说 ,A
ˊ
\acute{A}
Aˊ代表A
A
A中每个元素对y
c
y^c
yc的贡献 ,贡献越大网络就认为越重要 。然后对A
ˊ
\acute{A}
Aˊ在w
,
h
w, h
w,h上求均值就能得到针对A
A
A每个通道的重要程度(这里是对于类别c
c
c而言的) 。最后进行简单的加权求和在通过R
e
L
U
ReLU
ReLU就能得到文中所说的Grad-CAM 。关于Grad-CAM总结下来就是下面这个公式:
L
G
r
a
d
−
C
A
M
c
=
R
e
L
U
(
∑
k
α
k
c
A
k
)
(
1
)
L_{\rm Grad-CAM}^c=ReLU(\sum_{k}\alpha _k^cA^k) \quad \quad (1)
LGrad−CAMc=ReLU(k∑αkcAk)(1) 其中:A
A
A代表某个特征层 ,在论文中一般指的是最后一个卷积层输出的特征层k
k
k代表特征层A
A
A中第k个通道(channel)c
c
c代表类别c
c
cA
k
A^k
Ak代表特征层A中通道k的数据α
k
c
\alpha_k^c
αkc代表针对A
k
A^k
Ak的权重关于
α
k
c
\alpha_k^c
αkc的计算公式如下:
α
k
c
=
1
Z
∑
i
∑
j
∂
y
c
∂
A
i
j
k
(
2
)
\alpha_k^c = \frac{1}{Z}\sum_{i}\sum_{j} \frac{\partial y^c}{\partial A_{ij}^k} \quad \quad (2)
αkc=Z1i∑j∑∂Aijk∂yc(2) 其中:y
c
y^c
yc代表网络针对类别c
c
c预测的分数(score) ,注意这里没有通过softmax激活A
i
j
k
A_{ij}^k
Aijk代表特征层A
A
A在通道k
k
k中 ,坐标为i
j
ij
ij位置处的数据Z
Z
Z等于特征层的宽度×
\times
×高度通过计算公式(2)可知
α
k
c
\alpha_k^c
αkc就是通过预测类别c
c
c的预测分数y
c
y^c
yc进行反向传播,然后利用反传到特征层A
A
A上的梯度信息计算特征层A
A
A每个通道k
k
k的重要程度 。接着通过α
\alpha
α对特征层A
A
A每个通道的数据进行加权求和 ,最后通过R
e
L
U
ReLU
ReLU激活函数得到Grad-CAM(论文中说使用ReLU是为了过滤掉Negative pixles ,而Negative pixles很可能是归属于其他类别的pixles) 。当然一般还要通过一些后处理,插值等方法与原图叠加得到最终的可视化结果。光说公式没意思 ,这里举个例子 ,下图中CNN Extractor代表CNN特征提取器 ,GAP代表Global Average Pooling ,FC代表全连接层:
假设网络正向传播得到的特征层
A
A
A如图所示(这里为了方便只画了两个channel ,数据都是随便写的不必深究) ,针对类别Cat的预测值进行反向传播得到针对特征层A
A
A的梯度信息A
ˊ
\acute{A}
Aˊ(关于梯度是如何计算的 ,可以参考本文1.2和1.3的内容) ,接着利用上述提到的公式(2)计算针对特征层A
A
A每个通道的权重 ,就是求A
ˊ
\acute{A}
Aˊ每个通道的均值 。
α
k
c
=
1
Z
∑
i
∑
j
∂
y
c
∂
A
i
j
k
(
2
)
\alpha_k^c = \frac{1}{Z}\sum_{i}\sum_{j} \frac{\partial y^c}{\partial A_{ij}^k} \quad \quad (2)
αkc=Z1i∑j∑∂Aijk∂yc(2)那么有:
α
C
a
t
=
(
α
1
C
a
t
α
2
C
a
t
)
=
(
1
3
−
2
3
)
\alpha^{\rm Cat} = \begin{pmatrix} \alpha^{\rm Cat}_{1} \\ \\ \alpha^{\rm Cat}_{2} \end{pmatrix} = \begin{pmatrix} \frac{1}{3} \\ \\ -\frac{2}{3} \end{pmatrix}
αCat=⎝⎛α1Catα2Cat⎠⎞=⎝⎛31−32⎠⎞然后我们再带入公式(1):
L
G
r
a
d
−
C
A
M
c
=
R
e
L
U
(
∑
k
α
k
c
A
k
)
(
1
)
L_{\rm Grad-CAM}^c=ReLU(\sum_{k}\alpha _k^cA^k) \quad \quad (1)
LGrad−CAMc=ReLU(k∑αkcAk)(1)得到对应类别Cat的Grad-CAM:
L
G
r
a
d
−
C
A
M
C
a
t
=
R
e
L
U
(
1
3
⋅
(
1
2
3
5
1
1
1
)
+
(
−
2
3
)
⋅
(
1
3
1
1
1
)
)
=
R
e
L
U
(
(
1
3
−
2
3
2
3
−
1
1
−
1
3
1
3
−
1
3
)
)
=
(
1
3
2
3
1
1
3
)
L_{\rm Grad-CAM}^{\rm Cat} = ReLU(\frac{1}{3} \cdot \begin{pmatrix} 1& 0& 2 \\ 3& 5& 0 \\ 1& 1& 1 \end{pmatrix} + (-\frac{2}{3}) \cdot \begin{pmatrix} 0& 1& 0 \\ 3& 1& 0 \\ 1& 0& 1 \end{pmatrix}) = ReLU(\begin{pmatrix} \frac{1}{3}& -\frac{2}{3}& \frac{2}{3} \\ -1& 1& 0 \\ -\frac{1}{3}& \frac{1}{3}& -\frac{1}{3} \end{pmatrix}) = \begin{pmatrix} \frac{1}{3}& 0& \frac{2}{3} \\ 0& 1& 0 \\ 0& \frac{1}{3}& 0 \end{pmatrix}
LGrad−CAMCat=ReLU(31⋅⎝⎛131051201⎠⎞+(−32)⋅⎝⎛031110001⎠⎞)=ReLU(⎝⎛31−1−31−32131320−31⎠⎞)=⎝⎛310001313200⎠⎞1.2 梯度计算示例
上面在介绍计算Grad-CAM时 ,其实主要是计算正向传播得到的特征层
A
A
A ,和反向传播得到的A
ˊ
\acute{A}
Aˊ ,得到特征层A
A
A很简单,大家也经常会提取某个特征层进行分析或者特征融合等等 。但获取A
ˊ
\acute{A}
Aˊ会相对麻烦点 ,计算倒不是难点因为常用的深度学习框架都会自动帮我们计算 ,只是很少有人会使用到反传的梯度信息。那A
ˊ
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!