现在我需要用到深度学习做图像分类的任务,虽然之前对CNN有过一定的了解,但我还是第一次真正使用它来解决问题,相关论文看的也比较少,最近恶补了一下近几年比较有名的关于深度学习的论文,写到博客上总结一下,接下来应该会陆续写一个系列。
《Visualizing and Understanding Convolutional Networks》一文是Matthew和Rob两人在2013年发表的论文,文章的主要贡献是使用反卷积神经网络(Deconvolutional Network)对CNN中各层进行可视化,从而确定我们的网络确实学到了东西,而且可以根据可视化结果对网络的结构修改进行指导。
虽然最近的CNN模型能够极大的提升在ImageNet上的识别结果,但是人们始终没有弄明白为什么CNN模型能够有如此出色的表现,或者说怎样才能改进模型呢。在文章中通过一种简单的可视化手段,可以对CNN网络中中间层进行可视化,从而可以起到一种诊断的作用,来改进当前以后的模型。
作者首先介绍了CNN在诸多领域取得的成功,并提出取得更好的成功的三种可能:(1)更大的训练集;(2)更加powerful的GPU;(3)更好的模型正则化策略(如Dropout)。接下来作者提出了上面提到的问题,当前仍然不能知道CNN模型内部是如何工作的,也不清楚到底学到了什么样的特征,因此提出可以通过使用反卷积神经网络对网络中间层进行可视化。最后作者通过对AlexNet的模型进行可视化,并根据可视化结果对其进行改进从而得到了更优的结果。
作者在文中测试的网络结构分别为LeNet和AlexNet。这些模型都是根据输入的2维图像 xi 通过在各层中的处理,最终输出一个概率向量 yi^ 。在网络中每层的结构都由如下几部分组成:(1)对上一层的输出结果的卷积;(2)激活函数(eg:ReLU);(3)[可选] max pooling;(4)[可选] 归一化层。网络的最高层由若干全连接层和一个softmax层组成。
Deconvet是可以看做是卷积网络(convnet)的反操作,convnet是把图像映射为特征图(feature map),因此Deconvnet是把特征图转换为图像。Deconvnet最初发表的目的是为非监督学习的,在本文中作者使用Deconvnet并不具有学习能力,只是用于可视化已经训练好的模型。
为了对convnet的各层进行可视化,需要在convnet的各层都加上Deconvnet,如下图所示:
这部分主要讲作者训练的网络模型结果以及训练的方法细节,这不是本篇论文的重点,略过,有兴趣可以读论文原文。
Feature Visualization: 下图展示了特征可视化后的结果,对每个feature map,选择最大的9个激活值分别进行可视化,这样可以看出CNN提取的特征相对输入图像的不变性,这一点可以在更高层的特征可视化图像看出,如layer 5中第一行第二列的图像,原图中这9个图像似乎并没有多大的共同点,但是可以从提取的特征看出,提取的是这些图中的草地,而不是他们的前景图像(这张图太大了,如果看不清可以去看论文原文)。
通过可视化已经学习到的网络模型各层提取的特征可以对我们改进模型有一定程度的帮助,作者通过对AlexNet网络模型的可视化结果发现AlexNet的可改进之处。如图6所示,AlexNet的第1层提取了很多高频和低频信息,但是对中频的信息提取的较少,同时由于AlexNet采用了比较大的stride(步长)在第2层中提取的特征中有混叠效应。作者根据这些问题提出了如下解决方法:(1)把第1层的卷积核大小由 11×11 变为 7×7 ;(2)把原有为4的stride改为2;改变这些以后作者提升了AlexNet的识别效果。
作者提出这样一个问题,即CNN对物体进行识别时,是真的定位到物体上了,还是只是通过识别周围的环境呢?图7展示了作者进行的一系列实验的结果,作者使用一个灰色方块依次遮挡图像的诸个部分,发现只要遮挡了待识别物体的物体以后,将图像识别为该物体的概率迅速下降,这证明了CNN识别物体时是真的定位到该物体并对其进行识别的。同时当遮挡物挡住原图中可视化图像中显示的物体的部分时,该图像对该特征图的激活值迅速下降,这也证明了可视化中显示的物体真的与对特征图的激活有关。(翻译起来太拗口了,大体是这个意思,实在看不懂我翻译的可以去看原文= =)
深度学习模型与之前已有的识别方法的不同之处在于,深度学习没有用在不同图像中的特定对象部分(例如,脸部具有眼睛和鼻子的特定空间配置)之间建立对应的明确机制。但是作者猜测,深度学习可能隐式的对这种关系进行了对应(即检测脸的话,脸中非常可能有眼睛和鼻子)。作者随机挑选了5张具有狗的正脸的图像,并分别遮挡左眼、右眼、鼻子以及其他一些随机部位,如图8所示,然后通过以下公式进行分析:
对每个图像 i ,计算 ϵli=xli−x^li ,其中 xli 和 x^li 分别表示遮挡前和遮挡后的第 l 层的输出向量,然后通过通过以下公式计算遮挡某位置的值 Δl=∑5i,j=1,i≠jH(sign(ϵli)−sign(ϵlj) ,其中 H 表示Hamming距离。作者提出,越低的 Δ 表示遮挡该部位与狗脸具有更强的相关性。下面我来说明以下我的理解,由于 ϵli 表示遮挡某部位以前和以后的神经网络第 l 层的输出特征向量,那么如果遮挡的部位与要检测的狗脸具有比较强的相关性(比如狗脸中一定在某位置处有眼睛),那么不同的狗脸图像在提取的狗脸的特征向量中的某部分则一定是相似的,比如狗脸的特征向量是由16维的,则其中一定有固定的某几维表示狗的眼睛,而Hamming距离 H(sign(ϵli)−sign(ϵlj) 就是检测遮挡这一部位后,是否所有狗脸的特征都变了(即变成遮挡的灰色方块的特征了),如果是,那么说明在狗脸的特征中确实存在那么那么固定的几维表示狗眼特征,即狗眼睛与狗脸具有很强的相关性。作者在表1中对遮挡狗脸中左眼、右眼、鼻子和随机位置进行了结果统计,如下所示:
接下来文章主要讲解的是作者进行的实验,作者通过对AlexNet进行的修改进一步提升了在ImageNet上的识别率,并达到了当时最好的识别率,这里不再赘述。
这里记录一下作者提出的两个观点:
(1)训练网络时,改变全连接层的大小对于识别的结果似乎并没有太大的影响;
(2)训练网路时,增加中间卷积层的大小(layers)似乎可以在识别率上有一定的提升。
这里作者的两个观点大家姑妄听之,在实际实验中可以已它为指导进行尝试,但这不一定是正确的,因为深度学习过于复杂,理论依据还不是很清楚,大家现在提出的看法大多是根据实验的结果总结出的经验,在这里有效,对我们特定的实验情况就不一定有效,比如AlexNet中提出的归一化层,在接下来的文章中就提出归一化层没有用,而且还浪费计算资源。