ZFNet介绍
首先简单介绍一下ZFNet吧,ZFNet来源于2013的Matthew D. Zeiler和Rob Fergus的Visualizing and Understanding Convolutional Networks论文,为什么叫ZFNet也很简单,作者的两个名的首字母加起来就是啦,这里也给出论文地址,有兴趣可以看看论文https://arxiv.org/abs/1311.2901v3
在 2013 年 ImageNet 大规模视觉识别挑战赛 (ILSVRC) 中,ZFNet 比 AlexNet 有了显着改进,成为众人瞩目的焦点。 这篇论文是非常重要的基石,它提供了许多概念的起点,例如深度特征可视化、特征不变性、特征演化和特征重要性。
在我看来,他在深度学习初期描述了几个很重要的点
- 提出了ZFNet,一种比AlexNet性能更好的网络架构
- 与其在模型中不断试错,不如可视化了中间的feature maps,进行了深度特征可视化,并据此来分析和理解网络
- 进行了许多的消融实验,让CNN的解释性更加形象化,还做了很多特征演化的实验,都是非常好的。
- 探究了预训练大模型的泛化能力,可以进行fine tuning,类似于迁移学习
实际上来说,在近期的发展来说,我们也知道,海量数据,大模型是一种趋势,早在2013年的时候,实际上大家就已经知道预训练大模型,然后迁移到其他相关任务上是非常有用的,即使放在现在来看,我认为这些任务都是make sense的。
ZFNet结构
实际上的ZFNet是改进了一下AlexNet,第一个11x11的卷积核换为了7x7的卷积核,并且步长从4换成了2,为什么这样做呢,实际上是因为,作者通过对AlexNet的特征进行可视化,文章作者发现第2层出现了aliasing,有些卷积核是无效的,而换成7x7后,无效的卷积核少了,并且步长为4的时候,会出现一些网格状的feature map,这是不利于网络进行学习和判断的,所以也将步长为4换成了2。
最后可以总结一下ZFNet的改进
- 第1个卷积层,kernel size从11减小为7,将stride从4减小为2(这将导致feature map增大1倍)
- 为了让后续feature map的尺寸保持一致,第2个卷积层的stride从1变为2
特征可视化
与提出一个性能更好的网络结构相比,这篇论文更大的贡献在于提出一种将卷积神经网络深层特征可视化的方法,从论文的标题上来看,我们也知道,这是这篇论文的核心
对于特征的可视化,作者使用了反卷积网络(deconvnet)。 将 deconvnet 视为自动编码器的解码器部分。 它与普通的卷积网络相反,它使用反池化和卷积核从特征中恢复像素。
该网络中唯一令人困惑的部分是它如何反池化,因为当最大池化完成时,在使用 NxN 池化的情况下,只有一个值保留在 N² 值之外。 整个数据无法恢复,但最大值仍然存在,但如果我们不知道它在卷积层输出中的位置,它就没有用。 所以我们需要在池化的时候,存储最大值的位置,这样可以以供后面进行时候,这些位置在本文中称为 Swich。
为了更清晰的明白反池化的操作,我们可以看看下图的介绍,我们会保存最大池化的位置,也就是Switch,这样在反池化的时候,我们就将其放回原来最大的位置即可,这样我们就可以从特征空间映射回我们的像素空间中,也就是人的肉眼可以看见理解的空间。
接下来我们探究一下,如何进行可视化,卷积网络生成feature map一般要经过卷积、非线性激活函数、池化这三个步骤,此处的Deconvolution便是将该操作反向进行。如下图所示,图的右侧从下往上看,是一个正常的卷积过程,得到的feature map经过左侧的Deconvolution过程可得到原始输入的近似,主要分为以下三步:
Unpooling: 这里是以Max Pooling为例,在正向卷积进行Max Pooling得到feature map时,仅保留filter区域大小的最大值,并使用switch variable来记录最大值在原feature map中的位置,在Unpooling时,可根据这些位置恢复出一个近似的feature map(如示意图所示,非最大值的位置全为0);
Rectification: 这里是正向激活函数为ReLU的情况。正向时,卷积结果经过ReLU后,输出的全为正值,所以作者认为需要在Unpooling后再添加一个ReLU,以确保输出的值都为正值。(这里有疑问,正向输出都为正,即max pooling后的结果也为正,若在Unpooling过程中,非最大值位置都设为0,那此处的ReLU的设置就是没意义的?);
Filtering: 此处是使用正向过程中使用的卷积核进行卷积,由于是逆过程,作者这里使用了卷积核的转置(水平和竖直方向翻转)。这里曾困惑于feature map和卷积核通道个数不匹配的问题,给一个实例推导一下即可,中间层任意一个feature map都可以推导到输入像素空间,得到与原图相同大小的特征图。
可视化结构
作者对激活最大的前九个patch的图像进行了可视化,就可以得到如图所示的图像。
第一层取出最简单的特征,即图像中的各种频率。 将其视为学习图像中的线条。
第二层是对各种角和边缘/颜色组合进行建模。 将其视为学习图像中的曲线。 曲线由细线形成。
第三层学习更复杂的模式,例如网格。 将其视为学习这些曲线的组合,即网格。 曲线汇集在一起创建网格(想想篮子)。
第四层学习特定于类的特征,例如狗脸。 把它想象成把篮子塑形并涂成不同的东西。 网格可以转换为类似于面部和各种复杂物体。
第五层学习具有一些姿势变化(侧面、正面和其他)的整个物体。 把它想象成将所有这些篮子排列成类似不同的物体。 类似于较大物体的较小人工制品的网格可以排列在一起以形成整个形状。
实际上呢,也可以简单的总结一下
- 底层:边缘,颜色
- 中层:形状
- 高层:物体以及一些语义信息,比如种类等
除此之外,从特征的可视化来看,作者还得到了减少过滤器尺寸和 AlexNet 第一层步幅的想法
在 (b) 中,我们有 AlexNet 的第 1 层特征,在 © 中,我们有 ZFNet 的第 1 层特征。 在 (b) 的情况下,我们可以看到一些灰色方块,它们是没有激活值的死亡神经元。 这是一件坏事。 另一个问题是在 (a) 中可以看到颜色/强度的低值和高值,但不是颜色/强度的中间范围。第三个问题是图像特征中的锯齿状视觉特征或混叠。 当采样率不够高时会发生混叠(想想其中有正方形的图像)。 在这种情况下,采样率是将发生的卷积次数。 如果滤波器尺寸较大,则采样率较低。 如果过滤器尺寸较小,则采样率会很高。 同样的事情也会发生在步幅上。这就是为什么解决这些问题的方法是减小过滤器尺寸和步幅,这两者都会导致采样率增加,而且,鉴于现在步幅很小,颜色/强度的中间范围会出现。
特征不变性
卷积神经网络 (CNN) 具有平移、缩放和旋转(给定对象具有旋转对称性)不变性。
第一行是为了表明平移不会影响训练有素的 CNN 的性能。 在第一行的第二列中,您可以看到图像属于其真实类别的概率。 除极端情况外,该曲线在大部分情况下都是稳定的,主要是因为在图像中看不到有问题的物体。
第二行用于显示缩放不会影响经过训练的 CNN 的性能。 在第二行的第二列中,您可以看到图像属于其真实类别的概率。 大多数物体的曲线是稳定的,除了娱乐中心实际上保持类似于电视,因此,这种行为。 但是,一般来说,CNN 看起来对缩放非常稳健。
第三行是为了表明旋转确实弄乱了 CNN。 一个例外是,如果物体具有某种旋转对称性,那么 CNN 仍然保留其对该物体图像的预测能力。 从第三行第二列可以看到所有的曲线都乱七八糟,只有可爱的犬和危险的非洲鳄鱼是稳定的,它们的图像看起来都是旋转对称的。 CNN 对于具有旋转对称性的对象的旋转具有鲁棒性
所以,这也是为什么CNN在现在那么适合图像分类任务的原因。
特征演化
Feature Evolution: 如下图所示,下图的每一行表示同一feature map在训练次数增加过程中中的变化。可以发现,较为浅层的feature map可以较快达到收敛,而layer 5等较为深层的feature map需要更多次训练才能达到收敛;
每一列表示训练过程中不同的轮次:第 1 轮、第 2 轮、第5轮、第10轮、第20轮、第30轮、第40轮和第64轮
在底层的时候,我们会发现,feature map几乎不是不变的,但是在Layer4的时候,在第4行第6列中,我们会发现,使其激活最大特征图已经发生了突变,需要多次训练才能最后稳定下来,并且在这里也能看出,后续提取的信息是比如脸和眼睛的信息。
遮挡性分析
Occlusion Sensitivity 实验:使用一个灰色的小块,遮挡输入图像的不同区域,观察对正类输出概率的影响,以此来分析哪个区域对分类结果的影响最大,即对当前输入图像,网络最关注哪个区域。结果发现,feature map最强响应可视化后对应的区域影响最大。
这里有个点比较重要,在论文中,虽然有时候feature map对应的是与类别无关的信息,或者说是spatial信息,但是网络是综合的,不是根据一层的feature map,而是综合所有的feature map最终得到预测额结果
- feature map保留了空间信息,左上角和原图左上角信息相对应
- 以第三行的为例,激活最大的feature map不一定是对分类最有用的特征(识别猎犬但是激活最大的是人脸)
- 卷积核是人,但是最后结果不是人是因为数据集中没有人脸这个类别
除此之外,还有相关性分析,就是CNN是否有一个结构的一个定式,比如说人的脸需要有眼睛和鼻子之类的,所以作者就做了实验,选取五张不太一样狗的图片,探究深度学习是否对狗这类别进行了语义上的定义,分析不同狗的图片遮挡同一个部位,在不同图片上的影响是是否是一样。如果完全不同的狗,遮住右眼后,对这些狗的网络的影响是一样的,就说明深度学习隐式的定义了右眼这个位置。
从结果中我们可以看出,遮特定的部位,前后差比较小,说明同一个部位对这些不同狗的图片的影响是相同的,是接近的,但是如果是随机遮的话,在浅层特征中影响较大,但是在深层特征中就影响较小,这也侧面说明了深层提取的是语义信息的特征。
其他内容
除了上述之外,论文中还有其他一些值得留意的点,限于篇幅就不展开了,这里仅做记录,详细内容可以读一读论文:
Occlusion Sensitivity 实验:使用一个灰色的小块,遮挡输入图像的不同区域,观察对正类输出概率的影响,以此来分析哪个区域对分类结果的影响最大,即对当前输入图像,网络最关注哪个区域。结果发现,feature map最强响应可视化后对应的区域影响最大。
这里有个点比较重要,在论文中,虽然有时候feature map对应的是与类别无关的信息,或者说是spatial信息,但是网络是综合的,不是根据一层的feature map,而是综合所有的feature map最终得到预测额结果
Feature Generalization:在ImageNet上预训练,固定权重,然后迁移到其他库上(Caltech-101、Caltech-256),重新训练最后的softmax classifier,只需要很少的样本就能快速收敛,且性能不错。
Feature Analysis:对训练好的网络,基于每一层的特征单独训练SVM或Softmax分类器,来评估不同层特征的区分能力,发现越深层的特征区分能力越强。这里做了很多的消融实验,最终确定了最后的ZFNet的结果。
总结和思考
在看了这篇论文后,我深有感触,这篇论文让我们直观地了解神经网络在幕后做了什么,没有人知道如何处理以及如何调整该引擎的黑盒神经网络已不再是谜。下图也展示了一下,特征在神经网络中的变化方式。
ZFNet 首次让世人看到了神经网络的内部世界。 由于人是视觉学习者,它为计算机视觉领域打开了新的大门和途径。 它向我们展示了神经网络的核心思想以及它们是如何形成的。并且这篇论文做了十分多的工作,让我对CNN网络的理解更加深刻,有助于我去学习CNN的卷积网络,而不是像无头苍蝇一样到处乱串了,所以我觉得还是非常有意义的。