近年来,对深度神经网络可解释性和可解释性方法的研究和探索已经取得了很大进展。目前,人工智能正被越来越多的关键任务部门所接受。但是应用在这些关键性人物的深度学习或基于人工智能的系统,哪怕是最轻微的计算错误,都可能导致信任丧失、金钱损失、社会经济稳定甚至人命损失。
我们迫切需要打破深度学习模型的黑盒子特性,让更大的用户,尤其是普通用户更容易理解它们。因为自从深度学习的发展以来,对模型可理解性的需求并不是模型本身要解决的的问题。还有一个关于AI公平性的更普遍的研究正在进行,但是在这篇文章中,我们不会深入研究这个研究的细节。相反,我将视图找到一个非常精确的模型是否能达到人类层次的视觉。
在寻找答案的过程中,我针对MNIST数字数据训练了一个简单的CNN模型,并尝试回答一些类似的问题。
- 图像的哪一部分对分类结果很重要?
- 高精度是否意味着可靠性?
- 模型会像人类一样思考吗?
为了找到这些答案,我采用了一些已经流行的解释性方法和一个基于自定义高级片段的可视化解释性方法。
模型
MNIST可能是最简单的计算机视觉数据集之一。因此,我们不需要非常深的网络就可以在分类任务中实现非常高的准确性(> 90%)。为此,我创建了一个非常简单的模型,并对其进行了训练,以实现96.25%的验证准确度和95.15%的测试准确度。
传统可解释性研究
现在采用一些流行的可解释性方法来解释分类器的预测。我已使用“ tf_explain”库执行任务。确切地说,我使用了库中的SmoothGrad,积分梯度和遮挡敏感度方法。测试是在测试数据集的第一个图像上执行的,该图像最终是数字7。
CNN模型正确地将输入类别预测为7,得分为0.9993(softmax)。以下是用于运行上述三种方法的方法和输出的代码。
可解释性方法的可视化
基于归因的可解释性方法为基于单个像素梯度的模型结果提供推理。每个像素均被视为模型的单独输入(独立)变量。遮挡敏感度通过使用在输入图像上方的滑动窗口告诉我们输入图像的不同部分如何影响模型的决策。对于我们的实验,窗口大小为3x3。除了图像的强度之外,单像素本身对图像没有太多高级功能。
因此,问题仍然在于这种可解释性是否可以与人类的视觉相媲美。
基于高级分割的可解释性
人类视觉与计算机视觉的区别主要体现在两个方面。首先,人类大脑是先验知识的巨大来源,这些先验知识由各种感觉器官、经验和记忆获得。深度学习模型缺乏这种视觉相关任务的先验知识。其次,当我们看到一张图片时,我们不是聚焦于完整的图片,而是聚焦于图片的不同区域,收集高级特征,然后整合所有这些高级特征来决定这张图片。如果我们问自己为什么输入的是数字7的图像。我们可能会这样回答:它有一条水平线和一条相连的倾斜的垂直线,并且它与我们之前知道的数字7相匹配,因此这个输入图像实际上是7的分类。
我们能从CNN模型中得到这个层次的解释吗?为了找出答案,我使用了一种特殊的技术。我使用' skimage '库使用' Felzenszwalb '方法对输入图像进行分段,而不是将整个图像作为模型的输入,我将单个片段作为模型的输入,并预测类和分数。
我发现这个实验的结果不同寻常。如果您查看前三个部分,它们只是数字7的实际图像的水平线,那么模型可以将它们预测为class 7,并获得近乎完美的分数。这些段和数字7一点也不像。而第四部分,有点像数字7,预测分数下降到0.913。
这一发现进一步强调了这个问题,网络实际上在学习什么。它是否能够像人类一样学习高级别的特征或者它只是找到一些低层次的像素不同强度模式的交互作用然后根据这些模式的存在或不存在对图像进行分类?
结论
这个文章的目的是要证明这样一个事实,即高精度并不意味着这个模型是可靠的,或者它已经达到了人类对图像的理解水平。结果恰恰相反。因此,作为深度学习的实践者,我们必须确保模型确实能够基于可靠的高级特性执行与视觉相关的任务。在我们将所有任务移交给基于人工智能或深度学习的系统之前,这种可靠性是非常必要的。我认为,寻找更可靠的可解释性或可靠性方法仍处于初期阶段,未来我们将能够为与视觉相关的任务建立更可靠的模型。
译者注
我们翻译这篇文章的目的并不是因为我们同意这篇文章的观点,而是因为这篇文章给出了一个非常好的研究方法,在文章中说到我们人类具有最大特点就是我们的先验知识,其实这才是现阶段AI和人类的差距。
以这篇文章最后的分割举例,第一张图,在们有任何背景的条件下,我们肯定认为他是中文的 “一”,而对于外国人来说可能就是减号,这就是我们的先验知识。但是对于我们训练的模型,因为仅有10个分类 0,1,2,3,4,5,6,7,8,9,我特意将这些数字打出,大家可以看一看,如果只从这10个数字里面挑选的话,7是不是与第一张图最相似?
但是为什么能得到0.999的得分呢?我个人理解的原因是因为softmax函数的原因,具体可以去看看label smooth,如果让两端的极值往中间凑,显示结果应该会好很多。
以上也只是我们的想法,欢迎讨论