赞
踩
Resnet(深度残差网络)是由何凯明等学者于2015年提出的网络,斩获当年ImageNet竞赛中分类任务第一名,目标检测第一名,获得COCO数据集中目标检测第一名,图像分割第一名。《Deep Residual Learning for Image Recognition》作为2016年CVPR最佳论文,当前被引次数已高达16w。
Is learning better networks as easy as stacking more layers?(学习更好的网络就像堆叠更多的层一样简单吗?)
网络深度是至关重要,提取层级丰富的图像特征可以通过增加网络深度来实现,在具有挑战性的ImageNet数据集上的领先结果都用到了“非常深”的网络模型。以往人们认为,通过不断堆叠卷积、池化层加深网络,一定会带来精度的提升,然而并非如此:
梯度消失:如果每一层的误差梯度小于1,反向传播时,网络越深,梯度过小甚至趋近零
梯度爆炸:如果每一层的误差梯度大于1,反向传播时,网络越深,梯度过大以至无穷大
梯度消失/爆炸从一开始就阻止了网络收敛,这个问题可以通过normalized initialization(初始归一化,保证输入层数据分布是一样的)以及intermediate normalization layers(中间归一化层,保证每层网络输入数据分布是一样的)缓解。
随着更深的网络能够开始收敛,网络退化问题就暴露出来了——在论文的实验中,随着网络深度的增加,精度趋于饱和然后迅速下降(图 1)。
而这并不是由过拟合引起的(过拟合是训练误差下降,测试误差升高,而从论文中的实验看出,随着网络层数加深,训练/测试误差均在升高),作者认为这也不太可能是梯度爆炸/消失导致的(刚刚提到,这个问题在实验中很大程度上可以被归一化操作缓解)。
图1 网络越深,训练误差越大,测试误差也越大
总的来说,Resnet网络通过残差学习的思想解决了深度神经网络的退化问题(degradation),对于残差学习提出的思路及其详细的介绍我们在后文会讲到。
假设在一个浅层网络中增加许多层,将其堆积成深层网络,一个极端情况是增加的这些层什么也不学习,仅仅复制浅层网络的特征,即实现恒等映射(identity mapping)。
从理论上讲,这种情况并不会让网络产生性能上的损失,假设这里输入的是 x ,而 x 已经是最优,那我们期望通过网络的许多层后最终网络输出的这个映射也为 x 。
然而实际上,作者发现深层网络难以拟合(或者说实现)这个恒等映射关系,随着堆叠层数的不断加深,求解器不能找到一种有效的解决途径。文中的实验也表明较深的网络模型产生了比较浅模型更高的训练误差。至于为什么深层神经网络难以实现恒等变换可以参考:深层网络为什么没有学会恒等映射函数
也就是说,需要找到一种方式实现这样的恒等映射,这样至少能保证网络不会变得更差
在Resnet中,作者提出利用残差学习(residual learning)来解决网络退化问题。
"We hypothesize that it is easier to optimize the residual mapping than to optimize the original, unreferenced mapping.To the extreme, if an identity mapping were optimal, it would be easier to push the residual to zero than to fit an identity mapping by a stack of nonlinear layers."
我们假设优化残差映射比优化原始的、未引用的映射更容易。在极端情况下,如果一个恒等映射是最优的,将残差推至为零要比用一堆非线性层拟合一个恒等映射容易得多
文中提到两种映射方式(图 2):
1.identity mapping(恒等映射),指的是右侧标有x的曲线
2.residual mapping(残差映射),残差指的是F(x)部分
图2 残差学习模块
我们把输入为 x 时网络学习到的特征记为 H(x) ,则残差可以表示为 F(x)= H(x) - x ,而要去学习的原始映射 H(x) 则变成 F(x) + x(逐元素相加)。
作者提出的这个修正方法不再学习 x 到 H(x) 的基本映射关系,而是学习两者之间的差异(残差)。把网络设计为F(x) + x ,则是将恒等映射作为网络学习的一部分,当残差为0时,相当于只做了恒等映射,这样的操作至少不会使网络的性能下降,而实际上残差大概率不为0,这会使网络在输入特征基础上学习到新的特征,进而拥有更好的性能。
之所以这样操作是因为残差学习比直接学习原始特征要容易得多,残差结构是去拟合逼近 0,类比于使用各种非线性网络逼近恒等映射,前者无疑会更加简单。这一点作者在原文中也有提到,数学角度的分析和解释可以参考——你必须要知道CNN模型:ResNet
在Resnet原文中,残差结构有两种不同的设计方式,左图"Basicblock"针对较浅的网络,如ResNet-18/34,右图“Bottleneck”针对较深的网络,如ResNet-50/101/152(图 3)。
Basicblock(左):
主要由两个3x3
卷积组成。
Bottleneck(右):
在3x3
卷积层前后引入分别接1x1
卷积,主要目的是改变维度,减少参数量。第一个1x1
卷积先将通道数从256压缩至64,经过3x3
卷积后再使用一个1x1卷积
扩增通道数至256,这样可以大大减少网络参数量。
图 3 两种残差结构
F(x) + x 可以通过具有“短路连接”(shortcut connections)的前馈神经网络来实现。在Resnet中,短路连接只用于执行/实现恒等映射(直接将x传到了后面,与这两层网络拟合出的结果相加)。
刚刚我们提到,短路连接 H(x) = F(x) + x 这里需要逐元素加和,如果 F(x) 与 x 的通道数相同,则可以直接相加(对应实线),如果 F(x) 与 x 的通道数不同,则需要进行维度匹配,Resent论文中提到以下几种shortcut的实现方式:
(A)“zero-padding shortcuts are used for increasing dimensions, and all shortcuts are parameterfree”
两者维度(通道数)不同,可对增加的维度使用零填充(使用全0填充缺少的维度, 然后concat低维数据从而升到高维)。
(B)“projection shortcuts are used for increasing dimensions, and other shortcuts are identity”
两者维度(通道数)不同,可采用论文中提到的公式H(x) = F(x) + Wx来匹配维度,其中 W 代表线性投影(使用 1x1 卷积),其他shortcuts则为恒等映射(维度相同时)。
(C)“all shortcuts are projections”
无论维度是否相同,对于所有的shortcuts,都使用 1x1 卷积来匹配维度。
注意:
(1)当两者尺寸不同时,执行以上操作时需要让 strides=2
(相当于下采样匹配特征图尺寸)
(2)A是无参数的shortcut连接,B、C均会引入参数
文章做实验对比了以上三种方式,结果表明:
B略好于A,因为A中的零填充的维度没有残差学习
C略好于B,作者归因于C中更多的projection shortcuts引入了额外的参数
A\B\C三种方式的shortcut connection相对于plain counterpart来说精度都有显著改善,然而A\B\C之间差异微小,说明投影捷径对于解决退化问题并非必不可少。所以相对于选项C来说,采取B这种处理方式可以减少内存/时间和模型大小。
论文里面给出了5种不同深度的ResNet网络(图 4),网络中都是用的 1 x 1 和 3 x 3 大小的卷积核。ResNet-18/34进行两层卷积间的残差学习,ResNet-50/101/152进行三层卷积间的残差学习,分别对应上图中两种不同方式的残差结构。
不同深度Resnet网络的公共部分conv1用到的是7 x 7的卷积,至于为什么这样操作,知乎上有对此问题的探讨:为什么resnet不在一开始就使用residual block,而是使用一个7×7的卷积,然后接了max pooling层。
conv2_x、conv3_x、conv4_x、conv5_x即由上文提到的两种残差模块堆叠而成
最后是average pooling和全连接层,softmax输出
注意:“We adopt batch normalization (BN) right after each convolution and before activation”,在Resnet原文中作者将BN层放在卷积层(Conv)和激活层(Relu)之间,BN层的原理可以参考:Batch Normalization详解以及pytorch实验
图 4 不同深度的Resnet网络结构
Resnet的设计参考了VGG-19网络(图5 左),并加入了短路连接形成残差学习(图5 右)。
注意短路连接有实线与虚线之分,实线代表的是维度匹配的shortcut连接,虚线代表维度不匹配。
图 5 Resnet-34
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。