2.4 ResNet网络
2015年,微软亚洲研究院提出ResNet网络,以3.75%的top-5的错误率获得当时的ILSCRC大赛冠军。(值得一提的是ResNet的提出者何凯明大神是清华毕业的,2003年广东省理科状元,绝对的是中国人在AI圈的骄傲。有兴趣的朋友可以去了解下微软亚洲研究院的历史,一个几乎撑起了21世纪中国半个互联网圈的机构。)ResNet进一步分析了网络深度对性能的影响,并以其独特的残差结构(Residual Unit)大大地加深了网络的深度,以152层的网络深度傲视群雄。此外,是用残差网络结构还能够加速网络的训练速度,使网络更快收敛。
2.4.1 网络深度对性能的影响
自从2012年AlexNet被提出以来,网络结构的深度就在不断加深,从AlexNet最初的7层到VGG的19层再到GoogLeNet的22层,但是作者在论文中提出是不是通过简单的堆叠网络层就可以提高网络的性能呢?通过大量实验发现显然不是如此,以前我们认为随着网络层深度的增加,参数量就越大,这样造成的问题是容易过拟合。作者在CIFAR-10数据集上对比了20层和56层的常规卷积网络结构上训练集和测试集错误率,发现56层的网络在训练集及测试集上的性能均不如20层的网络,收敛速度更慢了。这就说明了堆叠网络层深度是网络参数变差的原因不全是过拟合,因为过拟合不会导致训练集的错误率升高。
所以作者认为,深度增加造成性能下降的原因更多的是因为网络结构自身的原因,如梯度消失、爆炸或者其他的因素。为了增加网络的深度,我们可以提出这样一个要求:如果一个浅层网络已经达到了最优性能,那么如果再在这个网络上堆叠网络深度,深层网络的性能应该不能比浅层网络的性能差。为了达到这一要求,作者根据瑞士学者Schmidhuber提出的Highway Network设计了深度残差学习框架(Deep Residual Learning Framework)。Highway Network相当于改变了每一层的激活函数,使得上一层的feature map信息有一定几率直接传入下一层而不经过非线性激活和矩阵乘法,就像信息网络中的高速公路一样,因而得名Highway Network。Residual Unit与Highway Network非常类似,都是解决网络随深度变化而引发的问题,Residual Unit的结构如下图所示:
假设不带残差结构的网络对给定的输入X,其输出网络拟合为F(X)。引入残差之后,不带残差结构的原本网络的非线性映射为F(X)=H(X)-X,带残差的输出网络拟合为H(X)=F(X)+X。F(X)+X就是所谓的残差映射(residual mapping),显然残差映射与原本映射的区别就是多了一个输入X。假设这样一个情况,如果之前的浅层网络已经达到了最优性能,那么堆叠的网络层应该就是之前网络层直接恒等映射(后面新堆叠的网络层不起作用),即H(X)=X,这样就能保证深层网络的性能不比浅层网络差。但是也许有人会问,即使不引入残差结构,直接使F(X)=X不也能达到同样的效果吗?通过之前堆叠网络层实验发现,在实际应用中,高层的这种线性关系很难学习到,要不然也不会导致深层网络的性能变差了。所以,引入残差的意义在于,我们认为通过堆叠网络使得原本的非线性映射F(X)优化为0的难度要比F(X)优化到1简单。具体的证明过程可以看这里。
2.4.2 ResNet网络结构
之前提到了残差映射H(X)=F(X)+X,这里有一个小点需要补充一下,就是X与F(X)的通道数必须相同才能进行加法操作。当输入它们的通道数目不同时,作者设计了两种方式来补全,一种是直接将X相对于H(X)缺失的通道直接补零来对其补全,另一种是通过1*1的卷积来补全。为了验证残差结构的有效性,作者设计了3个网络:
- VGG-19网路(VGGNet中最深的一种网络结构);
- 根据VGGNet简单堆叠网络层的网络,总共含有34层;
- 在普通网络结构上添加残差单元的ResNet网络。
从下图中可以看到,作者设计网络时,使用全局平均池化取代了全连接层。另外,在卷积层之后也没有采用池化层来进行降采样,而是直接使用stride=2的卷积层来降采样。图中虚线表示filters的数量发生了变化,当feature map的尺寸下降一半时,feature map的通道数变成两倍,这保证了特征的复杂度。同时,在每个卷积后和激活函数前使用Batch Normalization方法批标准化,没有使用Dropout策略。
针对第三种ResNet网络,作者还设计不同的网络层数,具体参数如下图。注意到当网络更深时,其进行的是三层的残差学习,且隐含层的filters的数量是输出层filters的1/4。应用其他网络结构上比较常用的ResNet结构有50-layer,101-layer和152-layer。
对于不同深度的ResNet网络,作者设计了两个不同的shortcut或skip connections方式,其实主要是连接的尺度上的变化,本质上并没有什么不同。
2.4.3 ResNet实验效果
下图是ResNet与普通网络加深网络层数不同分类效果的对比,注意对比的两种网络的参数量均是相同的:
图中粗线表示验证误差,细线表示训练误差。上图左表示普通的神经网络,当网络层数从18层变成34层,随着迭代次数的增加无论是训练误差还是测试误差都在升高,收敛变慢。其中34层优化困难的原因不是梯度消失造成的,因为作者在网络中引入了很多BN层,并且还验证了反向传播的梯度,发现梯度并未消失。而上图右表示引入残差结构的ResNet网络(使用零填充),随着迭代次数的增加,34层的测试误差和训练误差均低于18层的误差并且收敛更快,这说明网络层数的加深改善了ResNet网络结构的性能,这正是我们需要的。
在ImageNet数据集中,作者首先将图像的最短边缩放到[256,480]中随机的一个值,并通过裁剪水平翻转将数据集扩增10倍。下图展示了ResNet在ImageNet数据集上与其他分类网络的对比:
其中ResNet-A表示残差连接使用恒等映射,在维度不同时使用zero-padding策略;ResNet-B表示在维度相同时使用恒等映射,在维度不同时使用1*1卷积投影映射;ResNet-C表示均使用投影映射。通过分析,作者认为使用B最合适,这样既能涉及残差学习又能减少参数量。可以看到,ResNet的性能全面优于其他网络结构,并且随着网络层数的增加,网络性能继续提升。作者还在CIFAR10数据集上对ResNet网络层深度做了进一步测试,当深度到达1202层后,网络分类性能才开始下降,作者认为有可能是因为层数过多导致模型过拟合的原因。总之,ResNet网络的残差结构不仅能够避免网络过深带来的性能下降的问题,还能够加速模型的收敛速度,是一种非常优秀的网络结构。(ResNet提出后2年,ILSCRC大赛就停止举办了,因为ResNet的分类效果已经超越了人类。)
2.4.4 实现代码
总算是把分类卷积神经网络写完了,之前一月份就把BP神经网络的东西给完了,然后就说要写卷积神经网络,但是由于最近家里有点事,再加上自己心情实在难以捉摸,导致这篇文章一直拖到6月份才写出来。除了文章中提到的网络结构,其他还有很多优秀的神经网络结构被提出来,如ZFNet、SqueezeNet、DenseNet等等,其都具有各自的特点,这系列文章权当抛砖引玉,希望各位同学能够自己去深挖这些网络结构的美妙之处。下一节我们将进入目标检测的部分,现在我们学的分类卷积神经网络是目标检测神经网络的基础。目标检测神经网络的思想更加具有创造性,从two-stages的Faster-RCNN到one-stage的YOLO和SSD算法,这些算法都是人工智能科学家们思想的结晶,相信各位能学到更多state-of-art的知识。