深度卷积网络在图像分类领域取得了很大的成功,VGGnet和GoogLeNet都通过增加网络深度,获得了很好的性能。
那我们能否简单的通过堆叠网络深度来学习更好的模型呢?
首先,增加网络深度会带来梯度消失和梯度爆炸的问题,但这可以通过归一化初始化和Batch Normalization得到很大程度的解决。
其次,增加网络深度,可能出现退化(degradation)问题,即随着网络深度增加,精度达到饱和,继续增加深度,导致精度快速下降。如下图实验结果
56 56 56层网络的训练结果和测试结果都要比 20 20 20层的网络差很多,因此也不是过拟合造成的退化。
退化问题表明并不是所有的网络模型都能被很简单的优化。作者认为,至少深层的网络不应该比浅层网络表现更差,原因是我们可以设置这样一个网络:在浅层网络中堆叠恒等映射层(identity mapping)来增加网络深度,这些恒等映射层保持输入和输出一致即可。如下图所示:
基于这种方式构建的深层网络,起码能保持浅层网络的训练精度,而不应该得到比浅层网络更高的训练错误率。但是实验结果却出现了退化问题,说明当前的优化方案很难学习这种(带有恒等映射)模型或其他更好的模型。
引发思考,如果让神经网络能够学习恒等映射,也许就能帮助我们解决退化问题,至少能保证深层网络不会比浅层网络的表现更差。
于是作者设计了残差学习模块,假设数据期望的基础映射为 H ( x ) \mathcal H(x) H(x) ,让堆叠的非线性层去拟合残差映射 F ( x ) = H ( x ) − x \mathcal F(x)=H(x)-x F(x)=H(x)−x,而不是直接拟合 H ( x ) \mathcal H(x) H(x)(前面的分析已经知道,当前的优化方案很难学习恒等映射). 此时基础映射 H ( x ) \mathcal H(x) H(x) 可表示为 F ( x ) + x \mathcal F(x)+x F(x)+x 。作者假设优化残差映射比优化原始的基础映射简单,而且如果恒等映射是最优解,将残差映射 F ( x ) \mathcal F(x) F(x)置为 0 0 0比通过堆叠一些非线性层来拟合恒等映射更简单。
作者使用下面的网络块来表示 F ( x ) + x \mathcal F(x)+x F(x)+x
其中,恒等映射通过“shortcut connections” (上图的弯线连接,指跳过一个或者多个层的连接,后续用跳跃连接表示)实现,如果恒等映射为最优模型,只需要将上图权重层的权重置为 0 0 0即可。 另外,跳跃连接既没有增加参数,也没有增加计算量,且该模型可以使用当前的深度学习工具快速搭建。
其数学表达式为
y = F ( x , { W i } ) + x (1) \rm y = \mathcal F(\rm x,{\rm \{W_i\}})+\rm x \tag {1} y=F(x,{Wi})+x(1)
其中 x , y \rm x,y x,y分别表示该残差块的输入和输出向量, F ( x ) \mathcal F(\rm x) F(x)是待学习的残差映射,在上图中 F ( x ) = W 2 σ ( W 1 x ) \mathcal F(\rm x) = \rm W_2\sigma(W_1x) F(x)=W2σ(W1x) ,其中 σ \sigma σ为激活函数(Relu),为了方便表示,这里省略了偏置 b b b。
由公式 ( 1 ) (1) (1) 可知,虽然加入了跳跃连接,但是并没有参数和计算复杂度,这点在实验中非常具有吸引力,且我们可以很公平的比较具有相同参数量,深度、宽度和计算成本的普通网络与残差网络。
另外,要求 x \rm x x与 F \mathcal F F的维度必须一致,如果不一致(如输入和输出的通道数发生变化),需要使用线性投影 W s W_s Ws来调整 x \rm x x的维度,确保能执行 y = F ( x , { W i } ) + W s x (2) y = \mathcal F(\rm x,{\rm \{W_i\}})+\rm W_sx \tag {2} y=F(x,{Wi})+Wsx(2)
也可以对公式 ( 1 ) (1) (1) 使用投影矩阵 W s W_s Ws(即对所有的恒等映射都使用线性投影),但是通过实验对比发现,恒等映射已经足够解决退化问题了,因此只在维度变化时才使用 W s W_s Ws.
另外,残差映射 F \mathcal F F的形式是很灵活的,论文中的 F \mathcal F F包含两层或者三层权重层,更多层也是可以的 ,但是如果只有一层权重层,此时有 y = W 1 x + x = ( W 1 + 1 ) x \rm y=W_1x+x = (W_1+1)x y=W1x+x=(W1+1)x,跟不使用残差连接没差别。
作者在 I m a g e N e t ImageNet ImageNet数据集上进行了全面的对比实验,发现
先介绍下普通网络,残差网络以及更深层残差网络的基本结构,如下图所示
普通网络(Plain Network)
普通网络的结构主要受VGG启发,网络结构如上图中"34-layers plain"所对应的网络,有以下特点
卷积主要使用大小为 3 ∗ 3 3*3 3∗3的卷积核,如果特征图大小(长和宽)不发生变化,则使用相同数量的卷积核,如果特征图的大小(长和宽)减半,则使用的卷积核数量翻倍,这样能够保持相同的时间复杂度
通过卷积中设置步长为 2 2 2实现下采样
网络最后使用全局平均池化,以及一个具有1000个神经元且使用softmax激活函数的全连接层
残差网络(Residual Network)
基于上图中的普通网络,加入跳跃连接,就构成了残差网络。残差块的配置如下
当残差块的输入和输出维度相同时,使用恒等映射(上图的实线表示的跳跃连接)
如果输出的特征图维度增加(上图虚线表示的跳跃连接)时,则跳跃连接使用两种方式调整输入的特征图通道数
更深层的网络
除了 34 34 34层的普通和残差网络,还设计了 50 50 50层, 101 101 101层和 152 152 152层的残差网络。对于更深层的网络,为了节约训练时间,在残差块中加入了瓶颈(Bottleneck)设计,如下图右侧图形所示
即在残差映射 F \mathcal F F中,包含的权重层由两层变为三层。三层权重层分别为 1 ∗ 1 , 3 ∗ 3 , 1 ∗ 1 1*1,3*3,1*1 1∗1,3∗3,1∗1的卷积层,其中 1 ∗ 1 1*1 1∗1的卷积用来负责降维和升维, 3 ∗ 3 3*3 3∗3的卷积作为低维输入和高维输出的瓶颈
说一下很无聊的点,为啥 3 ∗ 3 3*3 3∗3的卷积叫做瓶颈层,如下图所示, 3 ∗ 3 3*3 3∗3卷积核个数决定这个瓶子最细的地方有多细,因此叫做瓶颈层。(图里的维度,表示通道数或卷积核个数)
最终,共设计和训练了以下几种网络
18 18 18层和 34 34 34层网络的定量结果表如下
训练过程的训练误差和验证集错误率统计图如下
其中粗线条表示验证集错误率,细线表示训练集错误率,通过分析图标,有以下发现:
普通网络
对比了 18 18 18层和 34 34 34层的普通网络(网络结构见上图Table1),发现 34 34 34层网络的训练和验证集错误率均高于 18 18 18层网络,出现了退化问题,作者认为网络使用了Batch Normalization,并且验证了后向传播时的梯度也处在合理范围,因此排除了梯度消失引起退化的可能性。猜测可能随着网络的加深,网络的收敛速度呈指数下降。
残差网络
对比了 18 18 18层和 34 34 34层的残差网络,网络中的跳跃连接均使用恒等映射,需要增加维度时,使用零填充(zero-padding),因此和对应的普通网络相比,残差网络没有新增额外的参数
实验结果发现
作者还做了实验,用于研究跳跃连接使用恒等映射和投影映射( 1 ∗ 1 1*1 1∗1卷积调整维度)的差别,首先做了三种跳跃连接的配置
( A ) (A) (A) 使用恒映射, 需要增加维度时,使用零填充(zero-padding),所有的跳跃连接均不增加参数
( B ) (B) (B) 需要增加维度时,使用投影映射,其他的跳跃连接则使用恒等映射
( C ) (C) (C) 所有的跳跃连接均使用投影映射
实验结果如下图
对比发现, B B B比 A A A好,原因是使用全零填充的维度学不到东西, C C C比 B B B好,认为是引入了更多的参数。但是从整体看 A / B / C A/B/C A/B/C三种配置的错误率差别不大,认为投影映射并不是处理退化问题必须的操作,因此在测试 50 / 101 / 152 50/101/152 50/101/152层残差网络时,跳跃连接使用配置 B B B。
另外,该图表也展示了 50 / 101 / 152 50/101/152 50/101/152层残差网络的结果,发现错误率随着网路加深仍在减小,未发现退化问题。
作者利用CIFAR-10数据集也进行了一系列的测试,其测试和训练误差结果图如下图所示(虚线表示训练误差,粗线测试误差)
上图左侧图像表示普通网络的训练和测试误差,普通网络随着深度增加,训练误差越来越高,这表明,普通网络随着网络深度增加优化困难的现象(退化问题)是一个普遍的问题
上图中间图像为残差网络的训练和测试误差,残差网络随着网络深度的增加训练和测试误差均越来越小,说明残差网络很好的解决了网络深度增加带来的优化困难问题。
此外,作者还分析了残差网络的层响应(BN之后、激活函数之前)标准差数据,其结果如下图所示
发现残差函数 F ( x ) \mathcal F(x) F(x)比非残差函数更接近 0 0 0,且通过比较 20 / 56 / 110 20/56/110 20/56/110层网络,发现较深的残差网络往往具有更小的数据变动,这跟之前关于残差网络的分析是一致的
上图左侧图像为利用残差网络训练更深层( 1202 1202 1202层)网络的结果,发现 1202 1202 1202层网络比 110 110 110层网络的测试误差低,由于两个网络具有几乎相同的训练误差,因此认为是过拟合造成的,且没有发生退化问题(或者说退化问题不明显)