Resnet理解

背景

ResNet的作者是何凯明依靠Resnet获得CVPR2016最佳论文奖。ResNet是解决了深度CNN模型难训练的问题,从下图中可以看到14年的VGG才19层,而15年的ResNet多达152层,这在网络深度完全不是一个量级上,所以如果是第一眼看这个图的话,肯定会觉得ResNet是靠深度取胜。事实当然是这样,但是ResNet还有架构上的trick,这才使得网络的深度发挥出作用,这个trick就是残差学习(Residual learning)。

Resnet理解

网络退化问题

我们知道随着网络层数的加深,可以提取到更加高维的特征。但是更深的网络其性能一定会更好吗?实验发现深度网络出现了退化问题(Degradation problem):网络深度增加时,网络准确度出现饱和,甚至出现下降。这个现象可以在下图中直观看出来:56层的网络比20层网络效果还要差。这不会是过拟合问题,因为56层网络的训练误差同样高。我们知道深层网络存在着梯度消失或者爆炸的问题,这使得深度学习模型很难训练。但是现在已经存在一些技术手段如BatchNorm来缓解这个问题。因此,出现深度网络的退化问题是非常令人诧异的。

Resnet理解

残差单元

何凯明提出残差学习来解决退化问题。对于一个堆积层结构(几层堆积而成),当输入为x时,其学习到的特征记为H(x),现在我们希望其可以学习到残差F(x) = H(x) - x,这样其实原始的学习特征是H(x)。之所以这样是因为残差学习相比原始特征直接学习更容易。当残差为F(x) = 0时,此时堆积层仅仅做了恒等映射,至少网络性能不会下降,实际上残差不会为0,这也会使得堆积层在输入特征基础上学习到新的特征,从而拥有更好的性能。所以,基本解决了寻找解为全局最优解而不是局部最优解的问题。

实验表明使用一般意义上的有参层来直接学习残差比直接学习输入、输出间映射要容易得多(收敛速度更快),也有效得多(可通过使用更多的层来达到更高的分类精度)。残差学习的结构如图3所示。这有点类似与电路中的“短路”,所以是一种短路连接(shortcut
connection)。

Resnet理解

为什么残差学习相对更容易,从直观上看残差学习需要学习的内容少,因为残差一般会比较小,学习难度小点。不过我们可以从数学的角度来分析这个问题,首先残差单元可以表示为:

Resnet理解
Resnet理解

通道数不相同问题

最后将得到的残差和通过恒等映射的X进行相加,如果残差映射和本身X的通道不相同,则一般采取如下两种恒等映射(identity mapping):1.直接将相差的通道用零进行补充;2.采用1x1卷积,将通道数变成相同。

基本变种

目的:减少参数量,如下图:

Resnet理解

其中右图称为瓶颈模块(BottleNeck)。

网络结构

ResNet网络是参考了VGG19网络,在其基础上进行了修改,并通过短路机制加入了残差单元变化主要体现在ResNet直接使用stride=2的卷积做下采样,并且用global average pool层替换了全连接层。

ResNet的一个重要设计原则是:当feature map大小降低一半时,feature map的数量增加一倍,这保持了网络层的复杂度。从下图中可以看到,ResNet相比普通网络每两层间增加了短路机制,这就形成了残差学习,其中虚线表示feature map数量发生了改变。图中展示的34-layer的ResNet,还可以构建更深的网络。对比图如下:

Resnet理解

Resnet18网络结构:

Resnet理解

子结构:

Resnet理解
Resnet理解

Resnet101子结构:

Resnet理解
Resnet理解