利用激活图谱探索神经网络-Exploring Neural Networks with Activation Atlases(下)
在前面的章节中,我们重点介绍了InceptionV1网络中的mixed4c层的激活图谱,这是一个位于网络中间的层。卷积网络通常较深,由许多层组成,从前到后逐步建立了更强大的抽象。为了得到一个整体的视图,我们必须查看模型的抽象特征表示是如何在几个层上发展的。
图21 Inceptionv1网络结构示意图。在浅层的网络中(如mixed3b),网络似乎仅仅学习到了纹理和一些简单的模式。在中间层中如(mixed4c),网络似乎学习到了眼睛,树叶,水等不同的概念,这些概念在许多类别中是共有的。在深层网络中(如mixed5b)网络学习到了与输出类别联系更紧密的抽象特征表示。
首先,让我们比较网络中不同区域的三层,以了解每一层的不同特性——非常浅的一层(mixed3b)、中间层(mixed4c)和最后一层(mixed5b)。我们将重点关注每一层对“卷心菜”分类有贡献的区域。
图22 您会立即注意到,与其他层相比,早期层是非特定的。出现的图标是图案和色斑。它对应了最终的类别,但并没有特别明显的鉴别性特征。在中间层,图标显然与叶子相似,但它们可以是任何类型的植物。属性标签主要集中在植物上,但有点过于全面。在mixed5b层,这里我们看到的叶子的纹理是卷心菜特有的,并弯曲成圆球。卷心菜的头是完整的,而不是单独的叶子。
当您在网络中移动时,后面的层似乎变得更加具体和复杂。这是预期之内的,因为每个层都在前一层的激活之上构建其激活。后一层也比前一层有更大的感受野,所以概念似乎包含了全体对象中更多的部分。
还有另一个值得注意的现象是:不仅概念在被提炼,而且新概念从旧概念的组合中出现。下面,你可以看到沙子和水在中间层mixed4c层是如何截然不同的概念,两者都归属于“沙洲”的分类。与之形成对比的是后一层,mixed5b层,这两个概念似乎融合在了一起。
图23 在mixed4c层中,我们看到两个不同的区域对“沙洲”属性有很高的归属: 沙质纹理区域以及一个分隔开的带有水纹理的区域。在稍后的一层(mixed5b层)中,我们看到在检测“沙洲”时包含这两个概念的激活。
最后,如果我们缩小一点,我们可以看到更大的激活空间的形状是如何从一层到另一层变化的。通过在几个连续的层中查看相似的区域,我们可以看到概念得到了细化和区分——在mixed4a中,我们看到非常模糊的、通用的区域,而mixed4e则将其细化为更具体的“半岛”。
图24 从上到下分别是Inceptionv1网络中的mixed4a、mixed4b、mixed4c、mixed4d、mixed4e层对应的激活图谱的一部分。可以看出,在mixed4a中有一个模糊的“哺乳动物”区域。在mixed4b层,动物和人被解开了,中间出现了一些水果和食物。在mixed4c层,所有的概念都被进一步细化并划分为小的“半岛”。在mixed4d、mixed4e层,概念被进一步细化。
查看整个的激活图谱可能有点让人不知所措,特别是当您试图了解网络如何对某个特定类别的时候。例如,让我们研究一下网络如何对“fireboat”进行分类。
图25 ImageNet数据集中的救火船图片
我们将从最后一层,mixed5b层的激活图谱开始。但是,我们不显示所有的激活,而是计算每个激活对“fireboat”分类的贡献,然后将该值映射到激活图标的不透明度。对“fireboat”分类贡献很大的区域将是清晰可见的,而贡献很少(甚至是负面贡献)的区域将是完全透明的。
图26 当我们在mixed5b层激活图谱中将不透明度映射到每个激活对“fireboat”的贡献时,我们会看到一组主要的图标,显示红色的船只和飞溅的水花。虽然在其他地方也有一些零星的区域,但这似乎是图谱中专门用来对附近溅着水的红色船只进行分类的区域。
我们刚刚看到的mixed5b层,位于最终的分类层之前,因此它与最终的类紧密结合似乎是合理的。让我们看一下网络中稍早一点的一层,比如mixed4d层,看看它有什么不同。
图27 在mixed4d层中,我们看到“fireboat”的属性在位于激活图谱周围不同位置的几个集群中很高。一个集中于窗户,另一个集中于喷泉和飞溅的水,还有一个集中于类似于起重机的物体。
图28 这里我们看到了一个非常不同的模式,窗户+吊车+水=“灭火船”。如果我们看更多的输入示例,这似乎完全合理。这就好像我们可以看到一个组件概念的集合,网络将在以后的层中使用,以分类“fireboat”。
在图27中,有一个窗户的集群,强烈归属于“救火船”,但单独来看,它的标签也有“street car”。所以,让我们回到mixed4d层的激活图谱,将“street car”单独拎出来,并将其与“救火船”的模式进行比较。让我们更仔细地看看对“救火船” 和“street car”高度响应的地方是怎样的。
图29 对“救火船”和“street car”高度响应的四个区域。
图30 图29中的8个区域放大后的结果。放大之后,我们可以更好地看到这两种分类在这一层的区别。在mixed4d层中,我们看到“streetcar”和“fireboat”都包含像“窗户”和“起重机”这样的特征可视化结果。“救火船”这一类别的高度响应区域中包含了水的背景而“streetcar”几乎没有。“streetcar”类别包含更多建筑的背景而“救火船”几乎没有。
图31 ImageNet中的救火船和有轨电车的例子。如果我们看一下输入的例子就会发现,建筑物的背景和水的背景是区分灭火船和有轨电车的简单有效的方法。
在一个完整的激活图谱中强调类特有的激活有助于了解该类别如何与神经网络视角的整个空间相关联。“然而,如果我们想要真正分隔某个特定类的激活,我们可以删除所有其他激活,而不是让它们变暗,创建我们称之为类激活图谱的东西。”与通用图谱类似,我们对类特定的激活向量进行降维,然后在类激活图谱中显示对应的特征可视化图像。
图32 呼吸管的类激活图谱。
类激活图谱可以让我们更清楚地看到网络使用哪些特征来给检测特定的类。在“呼吸管”的例子中,我们可以清楚地看到海洋、水下和五颜六色的面具是较为重要的特征。
在前面的例子中,我们只显示了那些对所讨论类的激活占比最大的。这将向我们展示对我们对所讨论的类贡献最大的激活,即使它们的整体强度很低(就像在背景探测器中)。不过,在某些情况下,我们希望看到它们之间存在很强的相关性(就像鱼和潜水者之间的相关性一样)。这些激活本身可能对其他类而不是我们所讨论的类贡献更大,但是它们的存在也可能对我们感兴趣的类有很大的贡献。对于这些我们需要选择一个不同的过滤方法。
图33 两种不同的过滤方法得到的“呼吸管”这一类别的类激活图谱。左图,只提取那些主要归属于所讨论的类的激活。结果通常更加集中和孤立,只针对类。有些是低量级的,比如背景,而我们错过了许多类之间共享的相关性或概念。右图,在这里,我们根据对某个类激活值的大小对所有激活进行排序,并选取前2000个激活。我们看到了更多相关的特征可视化,这些激活本身可能有助于另一种分类(我们将每个激活标记为其贡献最大的类)。请注意,某些经常在“呼吸管”附近看到的鱼也出现在这个类中。
使用幅度过滤方法,让我们试着比较两个相关的类,看看我们是否能更容易地看出它们之间的区别。(我们可以使用rank或两者的组合来代替,但是幅度过滤足以向我们展示各种各样的概念)。
图34 呼吸管和潜水员的类激活图谱。
直接从两个类激活图谱中理解类别之间的差异可能有点困难。为了便于比较,我们可以将两个视图合为一个视图。在水平方向上绘制呼吸管和潜水员的属性的区别,在竖直方向上使用t-SNE算法布局。
图35 呼吸管类别和潜水员类别合并的类激活图谱。左侧的类别更倾向于呼吸管,右侧的类别更倾向于潜水员。竖直方向上使用一维t-SNE算法布局。我们可以看到左侧有一些鸟状生物和透明管,这意味着与“呼吸管”相关,在右侧,有一些鲨鱼状生物与一些圆形,有光泽和金属化的事物,这与“潜水员”具有相关性(另外这种激活对“蒸汽机车”类有很强的贡献)。让我们从ImageNet数据集中获取一个标记为“呼吸管”的图像,然后添加类似于该图标的内容,以查看其如何影响分类得分。
图36 通过激活图谱可以得到欺骗神经网络的对抗样本。左侧是ImageNet数据集中呼吸管类别的一幅图像,中间是将蒸汽火车图片添加到该图片后发现,分类概率最大的类别变成了潜水员。这是由于修改后的图片同时具有的金属光泽,透明管等特征。右侧将蒸汽机车图片放大后添加到呼吸管图片中发现,分类概率最大的类别变为蒸汽机车,但是top5的类别中仍然有潜水员。这里的故障模式似乎是由于模型使用了蒸汽机车的特征来识别潜水员的氧气管,我们把这样的特征称为多用途的,这些特征为不同的类别所共有,但在视觉上是相似的。
图37 灰鲸和大白鲨结合后的类激活图谱。我们看到了另一个探测器,它似乎有两个作用:检测棒球上的红色缝线和鲨鱼的白色牙齿和粉红色的内口。让我们将来自ImageNet的一个棒球图片添加到一个“灰鲸”图片中,看看它是如何影响分类的。
图38 在灰鲸图片中加入棒球图片生成对抗样本。结果与上一个例子类似,在灰鲸图片中添加一个较小的棒球图片就能让概率最大的类别变成大白鲨,再变大一些概率最大的类别就又变为棒球。
图39 煎锅和炒锅合并后的类激活图谱。这里有一个不同之处——相关食物的种类。在右边,我们可以清楚地看到一些类似面条的东西(它强烈地归属于“意大利面”类)。让我们从ImageNet上找一张煎锅的图片然后在上面加一些面条。
图40 使用煎锅和面条生成对抗样本,模式和上面两个例子类似。从中可以看出,在煎锅图片上添加了面条就让分类概率最大的类别变成了炒锅。面条图片继续变大,分类概率最大的类别又变成了意大利面。我们怀疑,训练集只是包含了更多的炒锅和面条的图像,而不是煎锅和面条。
到目前为止,我们仅显示了这些补丁在一张图片上的示例。下面我们显示了十个补丁在ImageNet训练集中对应类别的1,000张图像上的运行结果。 尽管它们并非在所有情况下都有效,但它们确实将图像分类以大约五分之二的图像转换到目标类别。如果我们也允许将补丁以最有效的尺寸放置在图像四个角中的最佳位置(左上,右上,左下,右下),则成功率约为2/5。 为了确保我们的攻击不是仅能排除原始类别的证据,我们还将每次攻击与随机噪声图像补丁进行比较。
图41 补丁的动态位置和静态位置的成功率对比。
图44 10个类别补丁的转换成功率。
我们的“攻击”可以被视为一个更大趋势的一部分。研究人员探索对模型的输入攻击,而不是传统的epsilon ball对抗性样本。在许多方面,我们的攻击与对抗补丁最为相似,它还为输入图像添加了一个小补丁。从这个角度来看,对抗补丁更有效,更可靠。相反,我们认为我们的攻击是有趣的,因为它们是由人类根据对模型的理解合成的,并且似乎是在更高的抽象级别上攻击模型。
我们还想强调,并不是所有的类别之间的比较都揭示了这种类型的补丁,也不是可视化中的所有图标都具有相同的(或任何)有效性,我们只在一个模型上测试了它们。如果想更系统地找到这些补丁,一种不同的方法最有可能更有效。然而,类激活图谱技术在我们寻找这些补丁之前就能揭示了它们是否存在。
激活图谱为我们提供了一种深入卷积神经网络的新方法。它们为我们提供了隐藏层中全局的、层次的和人类可解释的抽象概念概述。这不仅使我们能够更好地了解这些复杂系统的内部工作方式,而且有可能为处理图像提供新的接口。
绝大多数神经网络研究集中于网络行为的定量评估。这个模型有多精确? 精度召回率曲线是怎样的等等。虽然这些问题可以描述网络在特定情况下的行为,但它并不能让我们知其所以然。要真正理解网络为什么会这样运行,我们需要充分理解网络丰富的内部世界——其中的隐藏层。例如,更好地理解InceptionV1如何从mixed4d中的组件部分构建消防船的分类器,可以增强我们对模型的信任,并能够将模型意料之外的行为显示出来。
与这个内部世界的接触也促使我们以一种新的方式来进行深度学习研究。正常情况下,每个神经网络实验都只给出少量的反馈信息——不管损失函数值是增加了还是减少了——来启发下一轮的实验。我们几乎是通过盲目的尝试和错误来设计架构的,由我们多年来建立起来的模糊直觉来引导。在未来,我们希望研究人员能得到丰富的反馈,他们的模型中的每一层都在做什么。而我们目前的方法看起来像是在黑暗中跌跌撞撞,在黑屋子里捉黑猫。
就目前的情况来看,激活图谱尚不足以真正帮助研究人员对模型迭代优化,部分原因是它们没有可比性。如果你查看两个稍有不同的模型的激活图谱,你会发现很难去掉任何东西。在未来的工作中,我们将探索如何通过相似性可视化来比较两个模型,显示出除了错误率之外的相似性和差异性。
机器学习模型通常作为自动执行特定的任务的黑盒部署。但越来越多的人意识到,或许有另一种方式可以让我们与它们产生联系: 即人们可以更直接地使用它们,而不是日益自动化一项任务。我们发现这种增强特别引人注目的一个观点是,神经网络学习的内部表征可以被重新用作工具。
我们认为激活图谱揭示了一个机器学习的图像字母表——一个简单的集合,原子概念被组合形成更复杂的视觉概念。就像我们使用文字处理器将字母转换成单词,将单词转换成句子一样,我们可以想象一个工具,让我们从机器学习的语言系统中为图像创建图像。类似于使用GAN网络绘画。想象一下,用一个类似激活图谱的东西作为调色板——你可以把画笔蘸到一个“树”的激活中,然后用它来画画。这是一个概念的调色板而不是颜色的调色板。
我们也可以使用这些激活图谱来查询大型图像数据集。就像我们用单词搜索大量文本一样,我们也可以使用激活图谱在大型图像数据集中查找特定类型的图像。使用单词来搜索文本是非常强大的,但人类的语言通常不适合描述特定的视觉特征。相反,神经网络的隐含层是一种语言,其优化的唯一目的是表示视觉概念。我们可以想象有人使用激活图谱的语言,而不是使用众所周知的千言万语来唯一地指定一个人正在寻找的图像。
最后,我们还可以把激活图谱比作直方图。就像传统的直方图可以很好地总结大型数据集一样,激活图谱也可以用来总结大量的图像。
在本文的示例中,我们仅仅使用了一个数据集用来训练模型,收集激活值。但是,如果我们使用不同的数据集来收集激活,我们可以使用激活图谱作为检查未知数据集的一种方法。激活图谱可以向我们展示模型从图像中学习到的“概念”的直方图。这样的工具可以向我们展示数据的语义,而不仅仅是视觉上的相似性。
虽然我们对激活图谱的潜力感到兴奋,但我们更兴奋的是为其他类型的模型开发类似技术的可能性。想象一下,有一组用于图像、音频和文本的人类可以理解的机器学习方法将会是怎样的。
(完)