论文提出背景
深层网络的训练问题:
1)梯度消失/梯度爆炸,阻碍模型进一步收敛
(可以用已有的batch normalization 和 SGD来解决)
2)退化问题,层数增多效果反而更差
(作者认为这并不是过拟合导致的,因为增加层数之后的训练误差也提高了)
思想启发:
如果增加的隐含层是恒等映射,那么得到的网络性能至少不会比原有浅层网络更差。但是退化现象表明,用多个非线性函数层来逼近一个恒等映射似乎是一件很困难的事。而在重新定义的残差学习形式下,若恒等映射是最优解,那么只要将权重都趋近于0就可以逼近恒等映射。
解决办法
不再让子网络逼近任意无参照函数,而是逼近期望输出与输入之间的差值,对于恒等映射而言,其目标是很确定的0。
结果表明:
1) 极深的残差网络是很容易优化的,但是对应的“plain”网络(仅是堆叠了层)在深度增加时却出现了更高的错误率。
2) 深度残差网络能够轻易的由增加层来提高准确率,并且结果也大大优于以前的网络。
具体方法描述:
1) 残差学习
将H(x)看作一个由部分堆叠的(隐含)层(并不一定是全部的网络)来拟合的底层映射,其中x是这些(隐含)层的第一层输入。假设多个非线性层能够逼近复杂的函数,这就等价于这些层能够逼近复杂的残差函数,也就是H(x)-x,(这里假设输入与输出是相同维数的)。因此直接让这些隐含层来逼近残差函数F(x):=H(x)-x,从而原来的的输出函数变成了F(x)+x。尽管依照假设,两种形式都能够逼近所需的函数,但是学习的难易程度可能不同。
在实际情况下,恒等映射不太可能达到最优,但是上述的重新定义对于这个问题的预处理是有帮助的。如果最优函数更趋近于恒等映射而不是0映射,那么对于求解器来说寻找关于恒等映射的扰动比学习一个新的函数要容易的多。通过实验表明,学习到的残差函数通常只有很小的响应,说明了恒等映射提供了合理的预处理。
2) 恒等Shortcut连接
i) 对几个堆叠的(隐含)层(block)采用残差学习算法,形式化表达如下:
shortcut 连接只是简单的执行恒等映射,再将它们的输出和堆叠层的输出叠加在一起(Fig.2)。恒等的shortcut连接并不增加额外的参数和计算复杂度。完整的网络仍然能通过端到端的SGD反向传播进行训练,并且能够简单的通过公共库(例如,Caffe)来实现而无需修改求解器(solvers)
对F(X)与X维数不同的情况,在shortcut采用线性映射Ws将x映射到与F(X)相同的空间
实验中的F(x,{Wi})函数包含两层或者三层,当然也可以更多层。(但如果只包含一层,那么就等价于一个线性映射,不会具有任何优势)
对于卷积层也是同样适用的。F(x,{Wi})可以表示多个卷积层,在两个特征图的通道之间执行对应元素的加法。
网络结构:
1) plain 网络
主要受VGG网络的启发,卷积层主要为3*3的滤波器,并遵循以下两点要求:(i) 输出特征尺寸相同的层含有相同数量的滤波器;(ii) 如果特征尺寸减半,则滤波器的数量增加一倍来保证每层的时间复杂度相同。我们直接通过stride 为2的卷积层来进行下采样。在网络的最后是一个全局的平均pooling层和一个1000 类的包含softmax的全连接层。加权层的层数为34。(本文模型比VGG网络(Fig.3,左)有更少的滤波器和更低的计算复杂度。我们34层的结构含有36亿个FLOPs(乘-加),而这仅仅只有VGG-19 (196亿个FLOPs)的18%)
2)残差网络
在plain网络的基础上,插入shortcut连接,将网络变成了对应的残差版本。如果输入和输出的维度相同时,可以直接使用恒等shortcuts。当维度增加时(Fig.3中的虚线部分),考虑两个选项:
(A)shortcut仍然使用恒等映射,在增加的维度上使用0来填充,不会增加额外的参数;
(B)使用线性映射Ws的shortcut来使维度保持一致(通过1*1的卷积)。
对于这两个选项,当shortcut跨越两种尺寸的特征图时,均使用stride为2的卷积。
实验结果:
4.1 ImageNetClassification
无参数的恒等shortcuts是有助于训练的:
1)残差学习的设置可以很好的解决退化问题,并且可以增加深度来提高准确率;
2)在极深的网络中,残差学习也是有效的;
3)浅层的plain网络和残差网络的准确率很接近 (Table 2),但是ResNet 的收敛速度要快得多。(Fig.4 右 vs 左)。
如果网络“并不是特别深” (如18层),现有的SGD能够很好的对plain网络进行求解,而ResNet能够使优化得到更快的收敛。
恒等 vs 线性映射 Shortcuts:
A) 对增加的维度使用0填充,所有的shortcuts是无参数的(与Table2 和 Fig.4 (右)相同);
B) 对增加的维度使用映射shortcuts,其它使用恒等shortcuts;
C) 所有的都是映射shortcuts
实验发现,加入线性映射的shortcuts对于解决退化问题并不是必需的,减少复杂度和模型尺寸,并不使用选项C的模型。
总结:
在ResNet之前,较深的神经网络层数大约只有几十层,因为层数增加带来的一系列问题并不会使得准确率进一步升高,反而出现退化问题。而ResNet通过残差的引入,将网络层数增加到超过100层,并使得网络性能显著提升,同时成为当时最深的神经网络。