122 计算机视觉领域的深度学习模型(二):VGG & GoogleNet 在上第一期的分享中,我们通过一篇经典论文讲了AlexNet这个模型。可以说,这篇文章是深度学习在计算机视觉领域发挥作用的奠基之作。

AlexNet在2012年发表之后,研究界对这个模型做了很多改进工作,使得这个模型得到了不断优化,特别是在ImageNet上的表现获得了显著提升。今天我们就来看看针对AlexNet模型的两个重要改进,分别是VGG和GoogleNet。

VGG网络

我们要分享的第一篇论文题目是《用于大规模图像识别的深度卷积网络》(Very Deep Convolutional Networks for Large-Scale Image Recognition)[1]。这篇文章的作者都来自于英国牛津大学的“视觉几何实验室”(Visual Geometry Group),简称VGG,所以文章提出的模型也被叫作 VGG网络。到目前为止,这篇论文的引用次数已经多达1万4千次。

首先,我们简单来了解一下这篇论文的作者。

第一作者叫卡伦·西蒙彦(Karen Simonyan),发表论文的时候他在牛津大学计算机系攻读博士学位。之后,西蒙彦加入了谷歌,在DeepMind任职,继续从事深度学习的研究。

第二作者叫安德鲁·兹泽曼(Andrew Zisserman),是牛津大学计算机系的教授,也是计算机视觉领域的学术权威。他曾经三次被授予计算机视觉最高荣誉“马尔奖”(Marr Prize)。

这篇论文的主要贡献是什么呢?一个重要贡献就是研究如何把之前的模型(例如AlexNet)加深层次,从而能够拥有更好的模型泛化能力,最终实现更小的分类错误率

为了更好地理解这篇文章的贡献,我们来回忆一下AlexNet的架构。AlexNet拥有8层神经网络,分别是5层卷积层和3层全联通层。AlexNet之所以能够有效地进行训练,是因为这个模型利用了“线性整流函数”(ReLu)、数据增强(Data Augmentation)以及Dropout等手段。这些方法让AlexNet能够达到8层。

但是,学术界一直以来都认为,从理论上看,神经网络应该是层数越多,泛化能力越好。而且在理论上,一个8层的神经网络完全可以加到18层或者80层。但是在现实中,梯度消失和过拟合等情况让加深神经网络变得非常困难。在这篇论文中,VGG网络就尝试从AlexNet出发,看能否加入更多的神经网络层数,来达到更好的模型效果。

那VGG是怎么做到加深神经网络层数的呢?总体来说,VGG对卷积层的“过滤器”(Filter)进行了更改,达到了19层的网络结构。从结果上看,和AlexNet相比,VGG在ImageNet上的错误率要降低差不多一半。可以说,这是第一个真正意义上达到了“深层”的网络结构

VGG在“过滤器”上着手更改,那么具体的改变细节究竟有哪些呢?简单来说,就是在卷积层中仅仅使用“3/*3”的“接受域”(Receptive Field),使得每一层都非常小。我们可以从整个形象上来理解,认为这是一组非常“瘦”的网络架构。在卷积层之后,是三层全联通层以及最后一层进行分类任务的层。一个细节是,VGG放弃了我们之前介绍的AlexNet中引入的一个叫“局部响应归一化”(Local Response Normalization)的技术,原因是这个技巧并没有真正带来模型效果的提升。

VGG架构在训练上的一个要点是先从一个小的结构开始,我们可以理解为首先训练一个AlexNet,然后利用训练的结果来初始化更深结构的网络。作者们发现采用这种“初始训练”(Pre-Training)的办法要比完全从随机状态初始化模型训练得更加稳定。

GoogleNet

我们要分享的第二篇论文题目是《更深层的卷积》(Going deeper with convolutions)[2]。因为这篇论文的作者基本都来自于谷歌,所以文章提出的模型有时候又被叫作 GoogleNet。这篇论文拥有8千多次的引用数。

GoogleNet不仅和VGG一样在把架构做“深”上下文章,而且在模型的效率上比AlexNet更加优秀。作者们利用了比AlexNet少12倍的参数,在更深的架构上达到了更好的效果。

GoogleNet创新的重点是在网络架构上。和AlexNet以及VGG都不同的是,GoogleNet的作者们认为更加合适的网络架构不是简单地把相同的卷积层叠加起来,然后再把相同的全联通层叠加。如果我们需要更深的架构,必须从原理上对网络架构有一个不同的理解。作者们认为,网络结构必须走向“稀疏化”(Sparsity),才能够达到更深层次、更高效的目的。

那么,能否直接用稀疏结构来进行网络的架构呢?过去的经验表明,这条路并不那么直观。第一,直接利用稀疏的结构所表达的网络结构效果并不好,第二,这样做就无法利用现代的硬件,特别是GPU的加速功能。现代的GPU之所以能够高效地处理视觉以及其他一系列类似的问题,主要的原因就是快速的紧密矩阵运算。所以,直接使用稀疏结构有一定的挑战。

这篇论文的核心思想就是希望用一组“局部的”(Local)紧密结构来逼近理想中的最优的稀疏化结构,从而能够在计算上达到高效率,同时在理论思想上,能够利用稀疏化结构来达到更深的网络架构。

这种局部模块被作者们称作是Inception模块。什么意思呢?传统上,卷积层都是直接叠加起来的。而这篇论文提出的Inception模块,其实就是让卷积层能够在水平方向上排列起来,然后整个模块再进行垂直方向的叠加。至于水平方向排列多少个卷积层,垂直方向排列多少Inception模块,都是采用经验试错的方式来进行实验的。

这篇论文最终提出的GoogleNet有22层网络结构。如果把所有的平行结构都算上的话,整个网络超过了100层。为了能够在这么深的结构上训练模型,作者们还采用了一种方法,那就是在中间的一些层次中插入分类器。相比之下,我们之前遇到过的网络结构都是在最后一层才有一个分类器。分类器层的特点就是最终的标签信息会在这里被利用,也就是说,分类的准确性,或者说是图片中物体究竟是什么,都会被这个标签信息所涵盖。在中间层加入分类器,其实就是希望标签信息能够正确引导中间层的目标,并且能够让梯度依然有效经过。

在实验中,GoogleNet模型可以说是达到了非常好的效果。在2014年的ImageNet竞赛中,GoogleNet和VGG分列比赛的第一名和第二名。两个模型之间的差距仅有不到1个百分点。

小结

今天我为你讲了两篇基于深度学习的经典论文,讨论了两个模型VGG和GoogleNet。这两个模型在AlexNet的基础上做了不少的革新。

一起回顾一下要点:第一,VGG模型对卷积层的“过滤器”进行了更改,实现了19层的网络结构,可以说是第一个真正意义上达到了“深层”的网络结构;第二,GoogleNet模型的创新是在网络架构上,利用稀疏化结构达到了更深的网络架构。

最后,给你留一个思考题,总结和比较VGG和GoogleNet这两个模型,我们看到了深度模型研发的一个什么趋势?

欢迎你给我留言,我们一起讨论。

参考文献

  • K. Simonyan, A. Zisserman. Very Deep Convolutional Networks for Large-Scale Image Recognition. International Conference on Learning Representations, 2015.
  • C. Szegedy et al. Going deeper with convolutions. IEEE Conference on Computer Vision and Pattern Recognition (CVPR), Boston, MA, pp. 1-9, 2015.

参考资料

https://learn.lianglianglee.com/%e4%b8%93%e6%a0%8f/AI%e6%8a%80%e6%9c%af%e5%86%85%e5%8f%82/122%20%e8%ae%a1%e7%ae%97%e6%9c%ba%e8%a7%86%e8%a7%89%e9%a2%86%e5%9f%9f%e7%9a%84%e6%b7%b1%e5%ba%a6%e5%ad%a6%e4%b9%a0%e6%a8%a1%e5%9e%8b%ef%bc%88%e4%ba%8c%ef%bc%89%ef%bc%9aVGG%20&%20GoogleNet.md