“还认为神经网络是黑盒子?再想想吧 :)”
几个小时前,谷歌AI领域的高级研究科学家Greg Corrado在推特上发出这样一句话。随后,谷歌传奇人物Jeff Dean也跟进转发。
之所以说出略带“挑衅”色彩的话,是因为谷歌一项进行很久的研究,今天正式对外公布。这项研究由谷歌大脑团队的天才少年Chris Olah领衔完成,题目叫做:The Building Blocks of Interpretability。
这项研究,展示了机器如何工作,如何做出一项决定。
整体来讲,这项研究探讨了特征可视化如何与其他可解释性技术结合,从而更好地了解神经网络,包括决策的过程,以及如何影响最终的输出结果。
以谷歌大脑为主的研究团队,探索了神经元激活的情况,并为每个神经元配上可视化的图片。谷歌将此比作为神经网络的MRI(核磁共振成像)。
谷歌的这项研究将将神经网络的可解释性向前推进一步。了解神经网络如何工作这件事,已经变得原来越重要。因为它们正在越来越多的代替人类作出决定。
谷歌不但放出了相关研究,而且把与之相关的研究工具也进行了开源。
其中包括Lucid,一个建立在DeepDream之上的神经网络可视化库。地址如下:
https://github.com/tensorflow/lucid
还有colab notebooks,这些笔记内容,让重现研究中的可视化变得非常简单。嗯,你只需要打开笔记本,点击一个按钮即可运行代码,无需安装。地址如下:
https://github.com/tensorflow/lucid#notebooks
这些工具可以显示每个神经元试图识别什么,哪些是成功的,以及神经元们作出的努力是怎样结合在一起来确定图片内容的。
Chris Olah表示,谷歌的这项研究可以帮助确定为什么神经网络容易出错,并在某些情况下解释这种行为是如何学会的。研究人员相信,这有助于最大限度的减少“对抗性样例”的威胁,帮助神经网络防止受恶意图片的欺骗。
当然这项研究仍然处于起步阶段。
供职于Uber AI Lab的机器学习科学家Jason Yosinski警告说,想要理解计算机的思维永远不是一件易事。随着神经网络越来越复杂,理解这件事也越来越困难。他说:“这有点像试图理解人类如何做决定。”
不过谷歌还是对这项研究相当重视,为了配合这次研究的发布,他们还特别找了两分钟读论文团队,为这次的研究做了个视频解读版。
量子位搬运视频如下(中文字幕为机器翻译)
说一千道一万,谷歌这项研究到底细节如何?
量子位把研究的主要内容搬运如下,对细节和详情感兴趣的朋友,推荐前往distill查看英文全文。
地址:https://distill.pub/2018/building-blocks/
神经网络越成功,解释这种成功的需求就越强烈。
人们不希望神经网络是一个黑盒子,人们不满足于只看到模型有用,还一定要知道为什么有用。例如神经网络在复杂的现实世界中会如何表现,是否存在偏见等等。
为此,既需要构建深度抽象,又需要将其以丰富的交互界面呈现出来。但目前还很少有可解释性的研究真正同时做好这两点。
一方面,研究人员的主要兴趣都在开发强大的方法来推理神经网络,例如特征可视化、归因和降维。不过这些研究目前并没有很好的结合起来。另一方面,人机交互界面越来越丰富,但还没有深入研究其中的抽象感念。
在本文中,我们使用图像分类模型GoogLeNet为例,来演示关于人机交互界面的概念。
大部分关于可解释性的工作,主要关注神经网络的输入和输出层。因为这两层的含义很明确。在计算机视觉中,输入层的数值代表图像中每个像素的红绿蓝三色通道的数值,而输出层则是不同的分了标签和相关的概率。
但是,神经网络的力量来源于中间的隐藏层。
每个隐藏层,网络都会发现新的输入表示。在计算机视觉领域,我们让神经网络在图像的每个位置都同样运行多个特征检测器。可以把每个隐藏层学到的表示视作一个三维立方体。立方体中的每个单元格都是一个激活,或者说神经元激发。
如下图所示,x轴y轴代表位置,z轴代表所运行的通道(或者说检测器)。
想理解这些激活并不容易,因为它们通常表示为抽象向量,写出来是这样的:
a10,11 = [50.2, 0, 0, 46.3, 51.5, 0, 139.6, 0, 18.6, 0, 0, 40.1, …] a4,7 = [0, 0, 103.2, 6.80, 0, 0, 0, 0, 0, 0, 0, 0, …]
然而,通过特征可视化,我们可以将这个抽象向量转换成更有意义的“语义字典”。
为了制作一个语义字典,需要将每个神经元激活与其可视化进行配对,并根据激活的大小进行排序。激活与特征可视化的结合改变了我们与潜在数学对象的关系。激活现在映射到了图标表示,而不是抽象的索引。
通过为隐藏层赋予意义,语义字典为我们现有的可解释性技术设置了可组合的构建模块。
语义字典让我们能对激活进行细致的考察:每个神经元能检测到什么?建立这种表示,我们也可以把激活向量作为整体进行考虑。除了对单个神经元进行可视化,我们还能对在任意位置激活的神经元组合进行可视化。
将这种技术应用于所有的激活向量,我们不仅可以看到神经网络在每个位置检测到的内容,还可以了解网络对整个输入图像的理解程度。
通过跨层(例如mixed3a、mixed4d)研究,我们可以查看网络理解如何进化发展:从早期图层的边缘检测,到后期更复杂的形状和对象识别等等。
不过这些可视化忽视了一个关键信息,那就是激活的大小。通过按照激活向量的大小来缩放每个单元的面积,我们可以表明网络在某个位置检测到特征的强度:
特征可视化有助于我们搞清楚网络看到了什么,但并不能回答神经网络如何把这些信息组合起来,以及如何做出最后的决定。
归因是一组通过解释神经元之间的关系来回答上述问题的技术。最常见的归因界面称为显著图,这是一种简单的热图,但这种方法也有自身缺陷。
在上面这个界面里,我们提供了更灵活的归因关系。通过上面这个图标,我们已经开始考虑更高层次概念的归因。例如在特定的位置,许多概念纠缠在一起,这个界面仍然很难把它们分开。于是就有了下面通道归因的尝试。
这个图与之前相似,但层到层的归因是通过通道而不是空间位置。
通过上述两种方式可以揭示模型的强大之处,特别是组合起来使用时。当然这些方法一样有不足之处,例如耗时较长以及过程损耗等等。
如果想构建一个有用的交互界面来解释神经网络,仅仅能理解它是不够的。前面提到的三种方法,就各有各的缺点。神经网络处理的信息对人类来说会造成过载,我们需要将它处理、精简到“人类尺度”。
这个处理过程的关键,就在于找到更有意义的方式来将激活分解开来。很多时候,某些通道或者空间位置高度相关相互协作,可以视为一个单位;而其他通道或位置激活很少,从高层视角来看可以忽略不计。所以,如果找到合适的工具,我们应该可以更好地分解这些激活。
有一个名叫矩阵因子分解的领域,就在研究分解矩阵的最佳策略。将我们前面提到的cube摊平到一个空间位置和通道构成的矩阵中,就可以运用这个领域的研究成果,来为神经元寻找更有意义的分组方式了。
构建这些组是为了解释神经网络在某张图像上的行为,同样的分组可能无法用到其他图像上,每张图像都需要重新计算一组自己的分组方式。
在用户看到的界面上,因子分解得到的组相当于原子。
用户界面的目的会影响我们矩阵因子分解中的优化方向。比如说,如果“网络检测到了什么”优先,因子分解就该完整描述激活;如果“什么能改变网络的行为”优先,就要完整描述梯度;如果“什么因素造成了当前行为”优先,就完整描述归因。当然,也可以平衡这些方面。
下图显示了激活优先、通过用非负矩阵分解(NMF)对激活进行分解来构建的分组,可以注意看一下大量的神经元是如何精简成这些分组的:
上图只展示了神经网络中的一层,如果要同时理解多层,就要让每一层的因子分解互相兼容,这也是因子分解的一个优化方向。
要为理解神经网络寻找更好的原子,上面这些可视化图表只是一个开始。
本文所讲的界面包括特征可视化和归因等模块,这些模块不能随意结合,而是要根据用户界面的目的,遵循一定的结构。
我们可以把这个界面看成各个元素的组合:
如上图所示,每种元素都通过特定的展现方式(PRESENTATION),展示了某一类内容(CONTENT),这个内容的基质可以描述成网络的层(LAYERS)如何划分为原子(ATOMS)。比如说,用特征可视化来展现隐藏层神经元的激活,就是一种向用户解释神经网络的界面。
我们可以将神经网络的基质以网格的形式展现出来,内容和展现形式则是网格中的点或关系符号:
这就为我们提供了一个探索解释性界面的框架。比如说,我们可以看看这样的解释性界面如何帮我们比较开头示例图片的两种潜在分类:
先用特征可视化来探索mixed4d层的通道,再通过计算输出的归因来过滤特定的类别,然后,通过仔细研究各个通道,我们可以得到一幅空间激活的热力图,再通过研究空间位置得到精确到神经元的归因。
本文探索的只是最表面的可能性,涉及的每个模块背后都有很多技术。文中提到的特征可视化、归因、矩阵因子分解都有很多替代工具。
文中所列出的模块也可能并不完善,可能还有新的模块可以增加。比如数据集样例、模型参数,也可能对模型的行为有影响。如果将样例也考虑进来,我们的分析流程就会变成这样:
另外,对多个模型作对比也是解释性界面的一个非常exciting的发展方向,比如说去观察模型在训练过程中如何变化,在迁移到新任务上时做出了哪些改变等等,甚至是比较完全不同的模型。
在与枚举算法的交互中有丰富的设计空间,我们相信与神经网络的交互也存在着同样丰富的空间。
要为可解释性构建强大、可信的界面,我们还有很多工作要做。如果成功了,可解释性必将能让人类构建出更公平、安全、一致的AI系统,更好地管理它们。
最后放一张作者列表。