[重读经典论文]ResNet

1. 前言

ResNet由微软亚洲研究院在论文《Deep Residual Learning for Image Recognition》中提出,获得2015年ImageNet图像分类、定位、检测,MS COCO竞赛检测、分割五条赛道的冠军,通过引入残差连接,有效解决深层网络训练时的退化问题,可以通过加深网络大大提升性能。

ResNet在ILSVRC-2015图像分类竞赛中获得了top-5误差3.57%的冠军成绩,在图像分类任务上首次超过人类能力。ResNet常用于迁移学习和fine-tuning微调的特征提取的基模型。

2. resnet解决了什么问题

我们知道,从Alexnet开始,到VGG,到GooLeNet,网络的层数逐渐加深,性能也逐渐提高,网络越深提取的特征层次也越丰富,但是我们也知道,越深的网络,越容易出现梯度消失或者爆炸,导致难以收敛,但是这些问题可以通过适当的权重初始化(Xarvier,MSRA)加上BN层进行解决。

真正的问题是,随着网络越深,出现了网络退化,深层的网络都和浅层的网络相比,在训练误差和测试误差上都要差,如下图所示:

Snipaste_2023-04-03_20-36-50

明显56层的网络也学到了东西,也不是过拟合造成的这个问题。

3. resnet如何解决网络退化问题

作者的思路是这样的,现在我们有一个比较浅的模型,还有在这个基础上加了更多层的深层模型,按理来说存在一种情况,就是增加的层是一个恒等映射,其他的权重从浅层模型照搬,按照这种情况的话,更深的模型实际上是不应该比浅模型还要差的。但是目前实验证明还无法找到方法去训练这样的恒等映射(或者比这个恒等映射更好的东西,也可能暂时无法实现)

那解决办法就显而易见了,让模型能够学到这样的恒等映射就可以了。

如果把网络设计为H(x) = F(x) + x,即直接把恒等映射作为网络的一部分。就可以把问题转化为学习一个残差函数F(x) = H(x) - x.

只要F(x)=0,就构成了一个恒等映射H(x) = x。 而且,拟合残差至少比拟合恒等映射容易得多。

于是作者提出了本作的重点,残差模块(Residual block),如下图所示:

Snipaste_2023-04-03_20-55-39

右边的分支叫短路连接(shortcut connection),它是恒等映射,直接把输入x直接连到输出了,左边支线通过两个卷积层,其中第二个卷积层后面不使用激活函数,输出与原输入逐元素相加,然后通过Relu激活函数后,作为本模块的输出。

用数学语言描述,假设Residual Block的输入为x,则输出y等于:

image

image就是我们需要学习的残差,以上图为例,残差部分是中间有一个Relu激活的双层权重,即:

image

残差部分至少要有两层,不然只有一层的话,就相当于:

image

就变成了一个线性层了,跟没加差不多。

因为输出是逐元素相加,因此就必须保持输入x与残差模块的输出的形状是需要一致的,论文中说到如果不一致就通过引入一个投影方阵进行转换:

image

至于这个投影矩阵如何做,在后面有两种方案。

其实这里也提了一嘴,在式子(1)中也可以为x加这么一个方阵,相当于加多一个学习的权重,但是最后他们发现直接恒等映射效果就很好了,而且很经济,这些实验可以参考他们的另外一篇论文《Identity Mappings in Deep Residual Networks》

4. 网络结构

v2-03f393009c383ce8ec8b956399a105a8_720w

如上图所示,左边是宣称very deep的Vgg,中间是没有加残差的34层卷积网络,右边是加了残差的34层的resnet,resnet突出的就是一个字:深。

至于短接部分,实线表示短接前后的输入输出维度是一样的,直接相加;虚线表示前后不一样,残差部分进行了下采样,长宽减半,通道翻倍。

面对这种情况,有两种解决的方案:

  • 对多出来的通道全部用0进行填充
  • 用1*1卷积进行升维

这里说得还是有点模糊的,如果是方案1,则输入的长宽是输出的两倍,他们要怎么相加呢,我估计是在相加的时候按stride=2进行相加,假如原来x的尺寸为w*h,则沿w方向取下标为(0,2,4,…w),h方向取(0,2,4,……h)这样长宽就一致了。

第二种方案是使用1*1卷积进行升维,但是长宽呢,答案是设置stride=2,这个从pytorch的res block的实现得出:

image

对比普通卷积网络和加入残差的resnet,更深的网络,性能就更好了,如下图所示:

image

左边为未加残差的网络,出现了网络退化的问题,在测试集和验证集上34层的都比18层的网络差,加了残差后,34层的就比18层的网路要好多了。

总共提出了5种残差网络:

image

为了减少参数量和计算量,还提出了一种bottleneck的残差模块,以使用到更深的网络中,如下图所示:

image

左边用在resnet18/24中,右边的bottleneck模块使用子啊resnet50/101/152中。

5. resnet为什么能解决网络退化

理论一:深层梯度回传顺畅

  • 恒等映射这一路的梯度是1,把深层梯度注入底层,防止梯度消失。
  • 没有中间商层层盘剥。

理论二:类比其它机器学习模型

  • 集成学习boosting,每一个弱分类器拟合“前面的模型与GT之差”。
  • 长短时记忆神经网络LSTM的遗忘门。
  • Relu激活函数。

理论三:传统线性结构网络难以拟合“恒等映射

  • 什么都不做有时很重要。
  • skip connection可以让模型自行选择要不要更新
  • 弥补了高度非线性造成的不可逆的信息损失。(MobileNet V2)

6. 参考

[1] Resnet到底在解决一个什么问题呢?
[2] Resnet是否只是一个深度学习的trick?
[3] 为什么resnet效果会那么好?

[4] 【精读AI论文】ResNet深度残差网络

(完)

posted @ 2023-04-03 23:34  大师兄啊哈  阅读(456)  评论(0编辑  收藏  举报