ResNet

  • 残差快
  • ResNet网络
  • 总结


ResNet也被称为残差网络,是由何凯明为主的Microsoft Research的4位学者在2015年首次提出,获得了2015年ILSVRC分类任务的第一名,还在ImageNet检测、ImageNet定位、COCO检测和COCO分割的任务中获得了第一名。也可以说是卷积神经网络中最常用的网络之一,并深刻影响了后来的深度神经网络的设计,不仅在计算机视觉领域取得发展,在nlp领域如transformer等模型里也有应用。

在文章开头,作者先给出了下面这张图:

RESNET原文解读 resnet简介_人工智能


这里作者想要表达的是虽然卷积神经网络能以堆叠层的方式提取丰富特征,但当层数多起来时也面临着梯度消失与梯度爆炸的问题,这个问题往往可以通过batch normalization等方法处理,但是作者发现当更深层次的网络能够开始收敛时,另一个退化问题就暴露出来了:随着网络深度的增加,精度趋于饱和,然后迅速退化。出乎意料的是,这种退化不是由过拟合引起的,在适当深度的模型中添加更多的层会导致更高的训练误差。在上图可以看到56层的堆叠网络在训练集测试集上的效果并没有20层的好,精度退化问题就出现了,基于解决这一问题,作者提出了ResNet,先看一下这个网络的结果(左图是普通网络的18层和34层的结果,右边是ResNet18层和34层的结果):

RESNET原文解读 resnet简介_深度学习_02


很明显,ResNet很好的解决了退化问题。下面是对于ResNet的简单介绍。

残差快

ResNet块的输出不同于AlexNet等网络,它还额外加上了原输入的信息,若原输入为x,f为堆叠层的运算,ResNet的输出则是f(x)+x,如下图所示(注意这里的输入与输出shape与channels都是一样的,因为它们要相加):

RESNET原文解读 resnet简介_深度学习_03


上图中从输入到输出额外的一条线作者将它称为Identity short-cut connections,这个是ResNet网络的核心。上图整个被称为残差快,在原论文中一个残差块有两种不同的结构,分别如下:

RESNET原文解读 resnet简介_人工智能_04


左图中,输入x分别经过一个3x3卷积、batch normliaztion、relu激活、3x3卷积和batch normliaztion,由于需要与原输入shape与channel数相同,所以每个卷积层的padding都为1,stride多维1,最后加上原输入x得到一个残差快的输出。右图也是一样,不过由于对输入加了一个1x1的卷积核,所以对形状与channels数可以做适当改变,比如像下图就将shape减半,通道数加倍:

RESNET原文解读 resnet简介_卷积_05

ResNet网络

由于ResNet系列中网络较多,这里只写一下作者在原论文中贴出的layer-34版本的ResNet-34(34层的ResNet),也是最上面那张图里的,其他网络如ResNet-50、ResNet-101等等也大同小异,无非是多了几层,具体差异如下图:

RESNET原文解读 resnet简介_RESNET原文解读_06


可以把他们中间的层分成4块,像是GoogleNet的stage,分别是conv2_x、conv3_x、conv4_x与conv5_x,如conv2_x中的3x3,64表示经过3x3的卷积层,输出channel数为64;x2、x3表示两个、三个残差快连接在一起。这里列举了ResNet-34与VGG-19和34-layer plain(普通网络)的结构对比图:

RESNET原文解读 resnet简介_人工智能_07


最右边就是ResNet-34的网络结构,图中实线的Identity short-cut connections表示上面残差块中的没有1x1卷积核的,而虚线表示有1x1卷积核的。可以通过计算看到每个卷积块的输入与输出的channel数与shape都是一样的,最后接一个全局平均池化得到一个4d张量,flatten之后然后再接一个全连接得到形状为(samples,1000)的最后输出(由于ImageNet类别数是1000)。

总结

ResNet由于残差连接解决了前面提出的问题,以至于能训练出更深的网络,能达到1000层,原因是什么?
首先,若不使用残差连接,假设一层的输出为y=f(x),在反向传播时的梯度就是RESNET原文解读 resnet简介_人工智能_08,则参数更新的时候就是RESNET原文解读 resnet简介_人工智能_09;若再加一层,输出变为RESNET原文解读 resnet简介_RESNET原文解读_10,则梯度变成RESNET原文解读 resnet简介_RESNET原文解读_11RESNET原文解读 resnet简介_人工智能_08不变,但是层数越多RESNET原文解读 resnet简介_人工智能_08前面的偏导也越多,如果这些偏导都小于1,当层数过大时,RESNET原文解读 resnet简介_人工智能_08就会被缩小很多,导致后面对前层参数做梯度更新时特别慢,造成梯度消失。
若使用ResNet结构,它的输出可以看成RESNET原文解读 resnet简介_卷积_15,即为原输入加上输出,此时的梯度就为RESNET原文解读 resnet简介_人工智能_16,这时梯度不同于不使用残差连接时的,乘法变成了加法,增大了梯度,使得梯度更新的时候不会特别小,模型收敛时也会更快。不小的梯度使得在层数变多时也能不带来梯度消失的问题。