HW9-Explainable AI
Background
使用较为简单的模型(eg.linear network)可以对产生的结果进行解释,结果为什么这样产生,但当使用CNN、Transformer、Bert
这种复杂的模型框架时,模型就像一个“黑盒”,我们无法对模型怎么产生结果的过程进行解释,从而导致从业人员对模型产生的结果存在怀疑。我们不知道模型产生正确结果的原因是否是合理原因。
比如,李宏毅老师在训练宝可梦和数码宝贝的分类器的时候发现使用简单的CNN
就能训练的很好,由显著图Saliency Map
发现模型在分类的时候“视野”总是聚焦在图片边缘,这是因为宝可梦图片是.PNG,数码宝贝是.JPEG,加载宝可梦图片训练的时候,背景由透明变为黑色,而数码宝贝背景总是透明的,发现模型是由背景是否透明来判断图片类别。
Task
本次作业是采用模型可解释领域的几种方法来回答一些选择题(共三十道),选择题拥有课程号才能参加,只找到了前二十道选择题的链接。
该课程中采用的方法分别有:
CNN explanation
:
- Lime
- Saliency map
- Smooth Grad
- Filter Visualization
- Integrated Gradients
Bert explanation
:
- Attention Visualization
CNN Explanation
Lime
- 全局可解释性:模型认为猫长什么样子(模型中的哪些参数控制猫的特征)。
- 局部可解释性:某张图片中的哪一部分(某些像素)使得模型认为这是猫。
如图所示,红色和蓝色区域表示一个复杂的分类模型(黑盒),图中加粗的红色十字表示需要解释的样本,显然,我们很难从全局用一个可解释的模型(例如线性模型)去逼近拟合它。但是,当我们把关注点从全局放到局部时,可以看到在某些局部是可以用线性模型等简单模型去拟合的。具体来说,我们从加粗的红色十字样本周围采样,所谓采样就是对原始样本的特征做一些扰动,将采样出的样本用分类模型分类并得到结果(红十字和蓝色点),同时根据采样样本与加粗红十字的距离赋予权重(权重以标志的大小表示)。虚线表示通过这些采样样本学到的局部可解释模型,在这个例子中就是一个简单的线性分类器。在此基础上,我们就可以依据这个局部的可解释模型对这个分类结果进行解释了。
但是由于LIME不介入模型的内部,需要不断的扰动样本特征,这里所谓的样本特征就是指图片中的像素。但是一张普通图片的像素少说也有上万个。若直接把每个像素视为一个特征,采样的空间过于庞大,严重影响效率;如果少采样一些,最终效果又会比较差。
所以针对图像任务使用LIME时还需要一些特别的技巧,也就是考虑图像的空间相关和连续的特性。不考虑一些极小特例的情况下,图片中的物体一般都是由一个或几个连续的像素块构成,所谓像素块是指具有相似纹理、颜色、亮度等特征的相邻像素构成的有一定视觉意义的不规则像素块,我们称之为超像素。相应的,将图片分割成一个个超像素的算法称为超像素分割算法,比较典型的有SLIC超像素分割算法还有quickshit等,这些算法在scikit-image库中都已经实现好了,quickshit分割后如图所示:
更具体的说,图像上的采样过程就是随机保留一部分超像素,隐藏另一部分超像素,从而得到一系列的扰动取样作为数据集如下所示:
很直观地看出是找出最分类器结果影响最大的超像素,Lime
拥有很强的适用性,但速度,效率较低,因为在通过扰动取样后的每张图片都需要通过一遍原模型预测一次,看结果。
Question
既然是将原图片通过扰动取样之后得到若干图片,丢进原模型得到分类分数,从而判断图片哪一部分对模型结果影响最大。
为什么还要用扰动取样训练一个简单线性模型呢?
GPT:
Reference:
- Local Interpretable Model-Agnostic Explanations (LIME): An Introduction
- 【CNN可解释性】|特征可视化技术——CAM LIME Grad-CAM 2021-2022
Saliency Map
显著图Saliency Maps
相当于是计算图像的每一个pixel是如何影响一个分类器的, 或者说分类器对图像中每一个pixel哪些认为是重要的.
会计算图像每一个像素点的梯度(如果某个像素对模型很重要那么该像素稍微变化导致分类结果Score变化的幅度应会越大)。如果图像的形状是(3, H, W),这个梯度的形状也是(3, H, W);对于图像中的每个像素点,这个梯度告诉我们当像素点发生轻微改变时,正确分类分数变化的幅度。
计算saliency map
的时候,需要计算出梯度的绝对值,然后再取三个颜色通道的最大值。因此最后的 saliency map的形状是(H, W)为一个通道的灰度图。
Reference:
【Pytorch】Visualization of Feature Maps(4)——Saliency Maps
可解释性与积分梯度 Integrated Gradients
Smooth Grad
该方法是对Saliency Map
的改进。对原图片加入随机噪声产生多张被污染的图片,输入模型对结果求平均用以消除输出saliency maps的"噪声",达到“引入噪声”来“消除噪声”的效果。
可以看到,随着噪声图片的增加,噪声逐渐减少,saliency maps逐渐聚焦到目标物体区域。
Reference:
【CNN可解释性】|特征可视化技术——CAM LIME Grad-CAM 2021-2022
Filter Visualization
Reference:pytorch简单代码实现deep dream图(即CNN特征可视化 features visualization)
Integrated Gradients
gradient saturation
梯度饱和:是 gradient based 方法的一个重要问题。假设我们要判读某张图片是否为大象的图片,显然鼻子长度是一个重要的指标。但是对于已经有长鼻子的大象来说,对其鼻子长度增长或缩短一点对于预测结果而言已经意义不大,会导致鼻子相关pixel的梯度近似为0。设模型为
f
f
f,输入图像为
X
=
{
x
0
,
x
1
,
…
x
n
}
X=\{x_0, x_1, \ldots x_n\}
X={x0,x1,…xn}。其中
x
i
x_i
xi为鼻子特征。
纵轴是模型将图像分类为大象的概率
f
(
x
)
f(x)
f(x),横轴是大象鼻子长度,黄色线代表随着鼻子长度增大,分类为大象的概率不断上升并收敛到1;蓝色线为黄色线的梯度
∂
f
(
x
)
∂
x
i
\frac{\partial f(x)}{\partial x_i}
∂xi∂f(x)。
可见,当黄线处于饱和区,其对应的梯度接近于 0,如果只看梯度,这种情况下会得出鼻子长度无关紧要的错误结论。
积分梯度法的思想很简单,既然鼻子太长时梯度饱和了,那我就从当前长度开始减短,每减短一点求一次梯度,直到减短到某个称为baseline的最小值(确保在非饱和区,这里设为鼻子长度为0),最后把所有梯度全部加起来就好了,当然这个求和还要乘上一个间隔 Δ x i \Delta x_i Δxi。简单说,就是要用微元法求上图中蓝色线和横轴围成的面积。用其来表示一个pixel对结果socore的影响。
Reference:
可解释性与积分梯度 Integrated Gradients
Bert Explanation
Attention Visualization
- https://huggingface.co/exbert/
- 演示视频 https://youtu.be/e31oyfo_thY
该网站可以看到Bert
每层layer的注意力图,可以看到每个token会“attention”哪些token。