论文 Identity Mappings in Deep Residual Networks
2015年,ResNet(Residual Neural Network)由微软研究院的Kaiming He等四名华人提出,并在ILSVRC2015比赛中取得冠军,在top5上的错误率为3.57%,同时参数量比VGGNet低,效果非常突出。目前常用的有Res18、Res50、Res101。
VGG网络试着探寻了一下深度学习网络的深度究竟可以深到什么程度还能持续地提高分类准确率。我们的一般印象当中,深度学习愈是深(复杂,参数多)愈是有着更强的表达能力。凭着这一基本准则CNN分类网络自Alexnet的7层发展到了VGG的16乃至19层,后来更有了Googlenet的22层。可后来发现深度CNN网络达到一定深度后再一味地增加层数并不能带来进一步地分类性能提高,反而会招致网络收敛变得更慢,test dataset的分类准确率也变得更差。排除数据集过小带来的模型过拟合等问题后,我们发现过深的网络仍然还会使分类准确度下降(相对于较浅些的网络而言)。也就是说网络出现了退化。
ResNets要解决的是深度神经网络的“退化”问题。什么是“退化”?
我们知道,对浅层网络逐渐叠加layers,模型在训练集和测试集上的性能会变好,因为模型复杂度更高了,表达能力更强了,可以对潜在的映射关系拟合得更好。而“退化”指的是,给网络叠加更多的层后,性能却快速下降的情况。
训练集上的性能下降,可以排除过拟合,BN层的引入也基本解决了plain net的梯度消失和梯度爆炸问题。如果不是过拟合以及梯度消失导致的,那原因是什么?
按道理,给网络叠加更多层,浅层网络的解空间是包含在深层网络的解空间中的,深层网络的解空间至少存在不差于浅层网络的解,因为只需将增加的层变成恒等映射,其他层的权重原封不动copy浅层网络,就可以获得与浅层网络同样的性能。更好的解明明存在,为什么找不到?找到的反而是更差的解?
显然,这是个优化问题,反映出结构相似的模型,其优化难度是不一样的,且难度的增长并不是线性的,越深的模型越难以优化。
有两种解决思路,一种是调整求解方法,比如更好的初始化、更好的梯度下降算法等;另一种是调整模型结构,让模型更易于优化——改变模型结构实际上是改变了error surface的形态。
ResNet的作者从后者入手,探求更好的模型结构。将堆叠的几层layer称之为一个block,对于某个block,其可以拟合的函数为 F(x)F(x)F(x),如果期望的潜在映射为H(x)H(x)H(x),与其让F(x)F(x)F(x) 直接学习潜在的映射,不如去学习残差H(x)−xH(x)−xH(x)−x,即F(x):=H(x)−xF(x):=H(x)−xF(x):=H(x)−x,这样原本的前向路径上就变成了F(x)+xF(x)+xF(x)+x,用F(x)+xF(x)+xF(x)+x来拟合H(x)H(x)H(x)。作者认为这样可能更易于优化,因为相比于让F(x)F(x)F(x)学习成恒等映射,让F(x)F(x)F(x)学习成0要更加容易——后者通过L2正则就可以轻松实现。这样,对于冗余的block,只需F(x)→0F(x)→0F(x)→0就可以得到恒等映射,性能不减。
下面的问题就变成了 F(x)+xF(x)+xF(x)+x 该怎么设计了。
Residual Block的设计
F(x)+xF(x)+xF(x)+x 构成的block称之为Residual Block,即残差块,如下图所示,多个相似的Residual Block串联构成ResNet。
一个残差块有2条路径 F(x)F(x)F(x) 和 xxx,F(x)F(x)F(x) 路径拟合残差,不妨称之为残差路径,x路径为 identity mapping 恒等映射,称之为 ”shortcut” 。图中的 ⊕ 为 element-wise addition,要求参与运算的F(x)F(x)F(x)和xxx的尺寸要相同。所以,随之而来的问题是,
- 残差路径如何设计?
- shortcut路径如何设计?
- Residual Block之间怎么连接?
在原论文中,残差路径可以大致分成2种,一种有 bottleneck 结构,即下图右中的1×1 卷积层,用于先降维再升维,主要出于降低计算复杂度的现实考虑,称之为“bottleneck block”,另一种没有bottleneck结构,如下图左所示,称之为“basic block”。basic block由2个3×3卷积层构成,bottleneck block由1×1
shortcut 路径大致也可以分成2种,取决于残差路径是否改变了feature map数量和尺寸,一种是将输入x原封不动地输出,另一种则需要经过1×1卷积来升维 or/and 降采样,主要作用是将输出与F(x)路径的输出保持shape一致,对网络性能的提升并不明显,两种结构如下图所示,
至于Residual Block之间的衔接,在原论文中,F(x)+xF(x)+xF(x)+x 经过ReLU后直接作为下一个block的输入x。对于F(x)路径、shortcut路径以及block之间的衔接,在文中有更进一步的研究。
下图中实线的Connection部分(“第一个粉色矩形和第三个粉色矩形”)都是3∗3∗643*3*643∗3∗64 的特征图,他们的channel个数一致,所以采用计算方式:
y=F(x)+xy=F(x)+xy=F(x)+x
虚线的的Connection部分(”第一个绿色矩形和第三个绿色矩形“)分别是3∗3∗643*3*643∗3∗64和3∗3∗1283*3*1283∗3∗128的特征图,他们的channel个数不同(64和128),所以采用计算方式:
y=F(x)+Wxy=F(x)+Wxy=F(x)+Wx
其中W是卷积操作,用来调整xxx的channel维度的
在实际的实验过程中,作者实验了很多中不同的结构,如下图所示,最后发现第一种是最好的。
简单理解一下,下图中的左图展开之后就是右图,可以看出,残差网络的结果包含了网络中各个节点*w。
ResNet 网络结构
ResNet 网络参考了 VGG19 网络,在其基础上进行了修改,并通过短路机制加入了残差单元,如下图所示。ResNet 的一个重要设计原则是:当 feature map 大小降低一半时,feature map 的数量增加一倍,这保持了网络层的复杂度。从下图中可以看到,ResNet相比普通网络每两层间增加了短路机制,这就形成了残差学习,其中虚线表示feature map数量发生了改变。下图展示的34-layer的ResNet,还可以构建更深的网络如表1所示。从表中可以看到,对于18-layer和34-layer的ResNet,其进行的两层间的残差学习,当网络更深时,其进行的是三层间的残差学习,三层卷积核分别是1x1,3x3和1x1,一个值得注意的是隐含层的 feature map 数量是比较小的,并且是输出 feature map 数量的1/4。下面直观看一下ResNet-34与34-layer plain net和VGG的对比,以及堆叠不同数量Residual Block得到的不同ResNet。
ResNet的设计有如下特点:
- 与plain net相比,ResNet多了很多“旁路”,即shortcut路径,其首尾圈出的layers构成一个Residual Block;
- ResNet中,所有的Residual Block都没有pooling层,降采样是通过conv的stride实现的;分别在conv3_1、conv4_1和conv5_1 Residual Block,降采样1倍,同时feature map数量增加1倍,如图中虚线划定的block;
- 通过Average Pooling得到最终的特征,而不是通过全连接层;
- 每个卷积层之后都紧接着BatchNorm layer,为了简化,图中并没有标出;
ResNet结构非常容易修改和扩展,通过调整block内的channel数量以及堆叠的block数量,就可以很容易地调整网络的宽度和深度,来得到不同表达能力的网络,而不用过多地担心网络的“退化”问题,只要训练数据足够,逐步加深网络,就可以获得更好的性能表现。下面为网络的性能对比
作者对比18-layer和34-layer的网络效果,如下图所示。可以看到普通的网络出现退化现象,但是ResNet很好的解决了退化问题。
最后展示一下ResNet网络与其他网络在ImageNet上的对比结果,如下表所示。可以看到ResNet-152其误差降到了4.49%,当采用集成模型后,误差可以降到3.57%。