对AlexNet的论文解读

csdn博客公式编辑不方便,虽然本文公式不过,不过有强迫症的,可以来看pdf版。点这里

一、概述

ALexNet训练了一个深度卷积神经网络来鉴别120万张高分辨率图片,从而把这些图片分成1000个不同的分类。在测试数据中,获得了在Top-1分类和Top-5分类取得了很好成绩,并且比state-of-the-art都要明显好很多。

以前数据集小的时候,人们一般用数学的方法来解决问题,靠经验去寻找模型,但是后来,机器学习的出现,让很多模型变成了数据驱动,再后来,神经网络的出现,让数据变得更加重要。在很多简单的分类问题上,比如mnist数据集。只要区分十个数字,这种问题,不需要很大的数据集,机器就可以做到很好,大名鼎鼎的LeNet[1]就是做了这个,很快就被应用到了银行支票的号码识别上。(不过,我试过,其实有些奇怪的写法会让结果没有那么好,见卷积网络3D重现)。

可是现实中,很多问题是需要分超多类的。比如说现在一直想推的自动驾驶,如果不能很好判别每个物件,就很容易被一些奇怪的东西所干扰。有个比赛叫ILSVRC,里面的ImageNet,让参赛者分1000类(说实话里面很多东西我也分不清),这种多分类,就需要大量的数据,ImageNet有126万左右的带标签数据,可以说很多了(不过其实还不够,但是配合一些数据增益算法,堪堪够用)AlexNet作为CNN代表出山之作,很好的利用了如此大数据量的特性,AlexNet在那个时代还挺深的,足足有6000万的参数和65万神经元,训练可以说是十分费时了。作者用两个gtx580(那个时代好歹是顶级显卡系列)跑了6天五夜,算法才收敛。

顺带说一句,作者提到了一个更大的ImageNet数据集[2],里面要把数据分为22000类,有1500万带标签数据。

二、模型

Alexnet结构如下:


别看它有两层,其实就是作者让它跑在了两个gpu上,这里很神奇,需要解释一下:

  • 我们看第一层,卷积层总共96个卷积核,大小是5*5,然后分给两个gpu 处理,每层48个卷积核。这里不需要gpu通信。
  • 然后做池化,再是一个卷积层,依旧不需要通信。
  • 但是第三层卷积层,就用到了之前所有的输入,这里是需要通信的。
  • 第四层卷积层,不需要通信。
  • 第五层,也不需要

作者为什么这么做呢,其实很好理解,加快训练速度,减少gpu之间通信时间。那么,为什么有一层有通信呢,也很好理解,要是一层都不通信,特征图之间没有交互,下一层的特征图不能整合之前所有的低级特征。用巨象的说法来看的话,就是,提取了眼睛鼻子这种局部特征,如果不整合在一起,怎么能确定一个人长什么样呢。但是我单单在提取鼻子边缘的时候,我是没必要和眼睛的边缘一起进行整合的。大概是这个意思,我的个人理解,毕竟现在大家对神经网络的定性说法本就没有,我也就说说我的一家之言了。

一些疑问:

作者给的结构,图片大小是224。这里涉及到一个图像增益的问题。我一开始提到了,其实数据还是不够,那咋整呢,数据增益就行。原来的图像是256*256,然后,缩减成224(从256*256的图片,只取224*224的部分,其它舍去),然后再对每一张新的图片,做一个水平反转,作为另一个样本,这样我们人看起来图片是一样的,对计算机来说差别可就大了。最终图片总数会增加到原来的2048倍。这里我认为作者算错了,作者的2048其实就是32^2*2,但我觉得应该是(256-224+1)^2*2作者少了个加1呢。为什么要加这个1,可以参考一个简单的情况,如果原来大小是225,现在减小到224,应该可以取出四张图片,做水平反转就是8张{8=(225-224+1)^2*2}。

除此之外,还有一个问题,那就是,这个224,用5*5的卷积核进行卷积,步长是4,怎么就变成55的特征图大小了呢?来计算一下,(224-5)/4=54.75,而(227-5)/4=55,这是很奇怪的一件事情,然后,去看看caffe:


caffe的输出日志表示,明明是227!!

作者的一些Tricks

除了上述的gpu并行架构,作者还有一些其他的小技巧。

我们先来讲讲这个池化层,作者很有意思,用了一个Overlapping Pooling的技术。这个技术其实就是,和我们平时的池化相比,它的步长要小于池化大小。也就是说,有些像素点,会被多次(两次)加入到池化的统计范围里。作者做池化的时候,用的是补充边缘池化(在图片两边补充0像素点,步长为3补充的是2)。例如:(55+2*2-3)/2=28。

作者还提到他用了一个Local Response Normalization的技术,不好意思,这个技术其实没什么用,2015年的文章BN归一化[3],效果更快,更好,应用面更广。

现在大部分网络的激活函数都是Relu,用这个,首先可以可以起到一定程度的防止梯度消失的问题,并且,求导快,计算快,也不容易过饱和(这个需要解释吗?简单来说,导数趋于0),这个是Hinton最初提出使用的,不愧是Hinton大弟子,Alex 也用了老板这一套,如果不用这个用sigmoid,训练起来怕是十天十夜。

本文也用到了Dropout技术,这个技术现在已经很普遍了,Dropout随机概率(0.5)去丢弃隐藏层数据,置为0,然后这个部分就不参加反向传播的训练了。所以每一次有新的输入,训练的网络都是不一样的。(因为训练出很多个模型组合在一起可以很好地减小测试误差)不过dropout以后,收敛慢了很多,但泛化能力变强了很多,不亏不亏。(我最近看的一个Shake Shake Regularization[4]也是一个在网络中加入一些随机因素,泛化能力变强了很多。所以说啊,神经网络的训练,随机的一些因素其实很重要,毕竟这个世界本来就很随机,人类的思想也是,有的时候,有的人就是会犯傻,干出奇怪的事,但就是一些奇思妙想,才推动了人类不断地进步,墨守成规是不会有什么文明发展的)

三、定量分析

这里进行一个定量的分析:


对左侧结果进行分析:图1可以看出,即使是边缘位置的目标也能被识别。图4说明预测的5个结果都是有道理的,只有猫科动物出现在了这套预测里。但是图5和7说明有些图片确实有歧义性。

对右侧结果进行分析:查看网络的另一个方法是,考虑图像最后导致的特征激励。如果两个图像的特征激励欧氏距离很近,那么可以认为它们很类似,图4右边,先是测试数据集中的5张图片,然后从训练集中找到和他们最相似的6张图片。

从像素级别来说,它们其实都不相似。所以直接针对像素计算距离不现实,那么考虑一下全连接层?不过全连接层的数据有4096个神经元,计算两个4096维的数据的欧氏距离用实数向量效率极低,但是比可以把它编码到一个很短的二进制代码。这比起以前有人做的,直接对像素进行编码要好得多。(没错,这个可以应用在度量学习里,确实有人做过了[5],具体文章我没来得及看,不知道他有没有做编码,我觉得做个rbm编码效果应该不错!等待实验验证)

其实文中还有个技术挺有意思的,作者用2011年的数据,一个fine-tune,迁移到了2012年的比赛上,也就是用别人训练好的模型,固定前面的卷积层,重新训练后面的全连接层(当然也有固定全连接层的)。说到底,一个是固定了特征提取的方式,重新组合特征,一个是固定了特征组合的方式,重新提取特征。

参考文献:

\bibitem{R1} Lecun Y, Bottou L, Bengio Y, et al. Gradient-based learning applied to document recognition[J]. Proceedings of the IEEE, 1998, 86(11): 2278-2324.
\bibitem{R2} Deng J, Dong W, Socher R, et al. ImageNet: A large-scale hierarchical image database[C]. computer vision and pattern recognition, 2009: 248-255.
\bibitem{R3} Ioffe S, Szegedy C. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift[J]. international conference on machine learning, 2015: 448-456.
\bibitem{R4} https://arxiv.org/abs/1705.07485
\bibitem{R5} Yi D, Lei Z, Liao S, et al. Deep Metric Learning for Person Re-identification[C]. international conference on pattern recognition, 2014: 34-39.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章