Deep Residual Learning for Image Recognition (ResNet)论文详细解读

前言

更深的神经网络更加难以训练,残差网络主要用来减轻训练的网络,这些网络比之前使用的网络都要深得多

在ImageNet的的数据集中网络层数达到了152层,前一年夺冠的VGG只有19层。在COCO物体检测数据集上获得了28%的相对改进

在以往的知识中,深度学习层数越深,提取的特征越多。如下图所示,并非网络层数越多越好。
在这里插入图片描述
引起这部分的原因,这种现象主要是退化:随着网络层数的加深,准确性会达到饱和,梯度传播过程中会逐渐消失,导致无法对前面的网络层权重进行调整,训练误差加大,结果也随之变差。(并非过拟合,如果过拟合,训练的时候误差很小,但是测试的时候误差就很大)

此处也不是梯度消失(本身就没有学习,更新的比较慢,不会收敛)
但此处的训练数据error有在下降,而且趋近收敛

梯度的消失或者爆炸可以通过 适当的权重初始化 + BN 来加快网络收敛

1. 设计理念

为了解决上面提到的退化,引入一个深度残差网络
(理论上深层次网络和浅层的网络性能一样,但现实卷积层层数越到后面会出现退化)

明白退化的原因以及如何改进,整体训练过程中随着层数的加深出现梯度消失,为了防止梯度消失,在某些卷积层中已经是最优解了,本身没有必要在训练(可将其丢弃),即F(x)= 0,输出的结果就是H(x)=x,让其作为恒等映射。

整体的网络架构如下:
使用两层卷积加relu激活函数,经过第一层的时候输出F(x),之后在经过第二层(此处增加了shortcut connection),将其shortcut connection连接到第二层的激活函数之前,输出结果变为H(x)=F(x)+x(恒等映射)

如图所示:(shortcut connection)
在这里插入图片描述
大致参数如下:

参数 描述
x 输入
F(x) 残差
identity 恒等映射

在最后一层 weight layer后不使用激活函数,将与短路连接后的恒等映射,两者求和在使用Relu激活函数
(残差网络 + 恒等映射 ,求和后使用激活函数)

之所以这样设计,因为越到后面的层次可能学习的特征已经很少了。输入x值,学习到的特征标记为H(x),残差网络F(x)为H(x)−x,则对应输出的结果H(x)为F(x)+x。即使残差网络F(x)为0,此处也只是恒等映射(网络性能也没有之前的增加层数而下降)
过去是拟合H(x)= x,现在拟合残差 F(x) = H(x) - x,不用关注太底层的细节

  • 残差网络比较容易优化,普通网络架构(简单的堆叠层)在训练的时候容易出现较高的误差
  • 残差网络随着深度的增加,准确性、精度也会提高

现在的网络主要是拟合F(x),两层网络主要是优化F(x)

所谓的残差:
也就是真实值和预测值的偏差,类似数据的回归

  • 修正上一层的错误
  • 防止梯度消失(以往的线性结构训练,梯度都是越来越小)

2. 核心细节

  • 退化在深层的残差网络容易解决,但在普通的网络(堆积)训练层次error会加大
  • 残差网络享受深层次网络的特征提取

此论文使用了两种残差网络结构,左边为浅层网络使用,右边为深层网络使用
在这里插入图片描述

  • 输入输出维度一致,直接恒等映射
  • 输入输出维度不一致,不可直接恒等映射

本身恒等映射既不会引入额外的参数量以及额外的计算量(相加可忽略不计)


具体残差的数学公式 如下:(x自身输入 + 残差)
在这里插入图片描述
整体的残差就是 先用一层网络激活,再用一层网络不激活。偏置项此处忽略了(如果卷积层加上BN就不需要加偏置项)
F与X的相加本身就是逐通道相加。求和之后在激活一次

如果本身相加的时候不是线性的(下采样的时候才需要这样做),本身加多一个参数,则公式变为:
在这里插入图片描述

残差网络与恒等映射维度不一致,如何相加,论文中提出了几种方案:

  • zero-padding (零填充)增加维度,先下采样,使用步长为2的池化,这样不会增加步数
  • 采用projection shortcut,一般采用1 * 1的卷积(会增加参数也增加计算量)。短路连接除了使用直接恒等映射,也可采用projection shortcut

下采样的使用,多出来的通道(indentity)使用0填充
下采样的时候,将其indentity用 1* 1的卷积调整和残差一样的模块
不管下采样还是在卷积的时候,全部都用1 * 1的卷积

最后的方案是,对indentity不做任何的处理是最好的

整体的结果可参考如下:(加深的残差网络 都达到了最佳的性能)
在这里插入图片描述

在原先的ImageNet 的实验中,残差网络也达到了验证:
在这里插入图片描述

3. 网络架构

总体的网络架构如下:

在这里插入图片描述

VGG19的架构:

  • 总共有5个block组成,所有的卷积都是3 * 3,block的卷积核个数以此为64、128、256、512、512
  • 每个block之间通过下采样
  • 特征图减半,步长加倍
  • 最后使用两个全连接层(输出1000个类别的概率)

34层的普通网络架构如下,中间的架构是加了深度:(类似递归的网络进行优化)

  • 步长为2的下采样来取代原先的全连接层,后加一个池化层,最后输出1000个类别的概率

34层的残差网络架构如下:(整体的网络结构是在VGG19基础上,加入了残差网络)

  • 所有的卷积都是3 * 3
  • 每个block内卷积核数和feature map不变,feature map减半的时候,channel 步长加倍
  • 此论文的下采样都变成2的卷积(VGG使用池化来进行下采样)
  • 短路连接,没有增加计算量,只是增加加法运算而已(网络加深 效果也更好了)
  • 全局平均池化,每个channel求一个平均值来代替全连接层,减少计算量(VGG使用的是全连接层)

以上三种架构,主要讲解下带残差的架构

  • 实线代表维度一样,直接相加
  • 虚线代表维度不一样(出现了下采样,步长为2的卷积),使用残差网络

此处不同维度的相加,论文提出了两种方法:

  • 多出来的通道补0
  • 恒等映射做1 * 1的卷积(1* 1的卷积可以取代连接层,降维 升维,减少计算量等)

不管用哪种方法,下采样都是补偿为2的卷积。
在这里插入图片描述

4. 实验

4.1 ImageNet 分类

图像分别随机被压缩到256到480之间,之后做图像增强

  • 输出处理过程:用224 * 224 随机裁出一个小图,在做水平的镜像来做图像增强(不同尺度维度),10个小图汇总成一个大图(可使用多尺度裁剪和结果融合)。特别是 每个像素减去均值
  • 每个卷积层后面或者激活层之前都使用BN(BN可以加快训练和收敛速度,控制梯度爆炸和防止梯度消失,同样防止过拟合也有作用)
  • 参数:mini-batch为256,学习率为0.1(遇到错误就除以10),训练60万的迭代次数,正则化0.0001,动量是0.9。没有使用dropout(BN和dropout不能混合使用,单独使用效果更佳)

实验结果具体如下,18层的普通网络和残差网络准确度对比:

  • 细线:训练集上的误差
  • 粗线:验证集上的误差
    在这里插入图片描述

表格如下所示:
在这里插入图片描述

结合上面这两张图,可看出没有残差网络会造成退化(随着深度的加深),并不是梯度消失和梯度爆炸导致,本身普通的网络也使用了BN,确保了网络中前向传播有个非零的方差以及反向传播的梯度是正常的

即使用更多的批次也无法解决退化问题。这是因为“ 数据本身决定了该类问题的上限,而模型只是逼近这个上限 ”

通过两幅图也可看出,对照实验,只有残差不一样,但是34层的errror更少了,下采样的时候使用了A方案(也就是多出来的通道补0),没有引入更多的计算量

  • 34层的残差网络比18层的残差网络更好
  • 34层的残差网络在验证集和测试集的泛化效果好(退化问题被解决了),深度越高越好

从上面的实验证明了残差网络可以用来搭建非常深的网络,带残差的网络收敛比较快(通过曲线图,可看出一开始的斜率降的比较快)

当网络为18层的时候,SGD可以找到普通网络良好的解决方案,而ResNet在早期阶段中提供了更快的收敛来缓解优化(parameter-free, identity shortcuts可以更好的解决训练)


后续的论文结果中探讨了 下采样 使用恒等映射还是其他的投影处理
在这里插入图片描述

  • 普通残差(恒等映射):没有额外的参数,恒等映射(主要用于Restnet 18,Restnet 24)
  • bottleneck残差模块(后续章节提及此架构):先用1* 1降维,再用3* 3 处理数据,再用1 * 1升维(主要用于Restnet 50,Restnet 101,Restnet 152)

以下表格主要提供了几种方案,主要用来对比
在这里插入图片描述

  • ResNet - 34 A:所有的shortcut都使用恒等映射,也就是多出来的通道补0,没有额外的参数
  • ResNet - 34 B:平时的shortcut使用恒等映射,升维的时候使用1 * 1卷积
  • ResNet - 34 C:所有的shortcut都使用1 * 1卷积(引入更多的参数,比较好,但是不经济)

B比A好,因为A在升维的时候用padding补零,丢失了shortcut学习,没有进行残差学习
C比B好,因为C的13个非下采样残差模块的shortcut都有参数,模型能力比较强
但是ABC都差不多,说明恒等映射的shortcut可以解决退化问题


后续使用了深度Bottleneck网络架构(考虑时间成本),输入输出都是高维,中间的处理过程为低维
在这里插入图片描述

深层次的网络主要用这个架构,主要用于减少计算量和参数量
1 * 1的卷积可用于降维和升维

无参数的恒等映射对于这个架构是十分重要的,本身shortcut如果引入projection,计算量还有参数量都会翻倍


深层次的残差网络:

50层的残差网络:将其34层的残差网络的2个卷积层替换成了3个bottleneck残差块,就变成了50层残差网络,下采样使用的是1 * 1 的卷积

101层残差网络,152层残差网络,数字都是带权重的残差网络。而且152的残差网络比VGG16/19的网络都要低。而且网络加深有用,没有出现退化的现象。

4.2 CIFAR-10 分析

在CIFAR-10 数据集中(32 * 32 * 3,更小的数据集),50w的训练集,10w的测试集,一共10个类别。训练集上训练,测试机上评估

为了对比普通网络和残差网络

  1. 输入的图像为32 * 32的像素,此时的图像做了预处理(每个像素减去均值)
  2. 第一个卷积层为 3 *3 ,使用6n的卷积层,分别都是3 * 3的,feature map为32 16 8。一共有6n + 2的卷积层(最后一层为池化层:1 +2n,2n,2n,1)
  3. 卷积核个数分别为32 16 8,feature map个数减半,chanel数翻倍
  4. 下采样用的是步长为2的卷积,最后加一个全局池化,10个神经元的全连接层和softmax

如图所示:
在这里插入图片描述

  • 残差是由2层神经网络(每一个shortcut都由3 * 3的卷积组成)来拟合的,总共有6n,所以一共有3n的shortcut。

  • 下采样是由0补充(下采样的残差和不带残差的计算量是一样的)

  • 训练过程中的正则化为0.0001 ,动量化为0.9 ,论文中提出的权重进行初始化,使用了BN没有使用dropout,批次处理为128,起始的学习率为0.1,在3.2w和4.8w迭代时除以10,最终在6.4w终止训练

  • 把训练集划分为4.5w训练和5k的验证,使用图像增强方法,分别在图像外边补4个pixel,再用32 *32 的图像进行剪裁(水平翻转的图像增强)。测试的时候,直接使用32 * 32的图像进行测试即可

当n设置为18的时候,就是110层(6 * 18 + 2)的卷及网络,训练这个网络的时候,初始值为0.1(0.1的收敛太大),所以一开始使用0.01去预热,使得训练误差降到80%(大概在400个迭代次数),再回到0.1进行训练。110层收敛很好。
上面这部分内容主要扯到 两阶段学习:

  1. 小学习率预热
  2. 大学习率学习
    在这里插入图片描述

分析每一层的网络的响应分布(残差网络是在修正输入)

响应的标准差:(std为标准差,standard)
图二只是将图一进行了排序
在这里插入图片描述

BN处理,均值已被调整为0。标准差衡量数据的离散程度(标准差越大,表明响应越大)
响应是每一层都是3 * 3的卷积层,介于BN后和激活之前

通过上图也可看出

  • 网络越深,输出越小。越靠近起始层,输出越大
  • 残差网络比普通网络输出小

超深层网络:

取n等于200 ,也就是1202的残差卷积网络(6 * 200 + 2),和之前的训练方式一样,误差小于0.1,表明了没有退化,没优化困难
在这里插入图片描述

但测试集的性能没有110层的好,文中表明这是过拟合了(模型太深参数过多,对于这个小数据集没有必要)

此论文没有使用maxout或者是dropout来正则化,因为核心任务是为了解决退化问题

5. 附录

应用的性能提升

5.1 目标检测(网络架构)

主要用于Faster R-CNN的骨干网络,用于分类模型初始化,之后在目标检测模型下微调

不像VGG-16,没有全连接层,主要通过这篇论文的想法Networks on Conv feature maps
全图用卷积层获取一个共享的feature maps(代表原图小于16的pixels),ResNet代表conv1, conv2_x, conv3_x, and conv4_x,将这几个层类别为VGG-16的前13个层

通过这样得到的ResNet就和VGG-16的得到的feature map 比较像(都代表原图16的像素),再用RPN对共享特征进行处理,得到300候选框,再用Faster R-CNN进行目标检测。在conv5_1之前进行了RoI 池化(不同输入大小变为同样大小的维度)
之后conv5模块以及所有层对候选框进行目标检测,有VGG-16全连接层的作用

在预训练的时候,BN已经计算好了均值和方差。训练的时候就用预训练的值,主要是为了减少内存的消耗(减去均值除以反差,变成了一个线性结果)

5.2 目标检测优化

在这里插入图片描述

MS COCO:
先提取候选框(两阶段)

  • 预测框精调。回归框又提取了新的特征,新的特征可得到新的分类和新的回归框,前后两个回归框进行非极大值抑制(NMS),NMS取0.1

  • Global context(全图上下文),全局金字塔池化,全图特征做了pooling,之后做了全图上下文特征,再用两头网络(分类头,回归头,端对端训练)

  • 多尺度训练。maxout(带学习参数的激活函数,上一层输出作为下一层输入,选用最大的输出),选取两个相邻尺度,不同尺度缩放为同样大小尺度,之后用maxout进行处理

  • 使用合法的数据。比如8w数据集 +4w测试集用来训练,2w测试集用来测试
    在这里插入图片描述

  • 多模型集成。Faster R-CNN(两阶段:RPN选取候选框,对候选框逐一分类回归),每阶段的多模型集成都并集送到集成的分类器进行回归和分类

PASCAL VOC:(跟上面的数据集处理方法大同小异)

5.3 定位任务

图像中的类别分类出来,并且将其框定位出来(反应算法的分类和回归),定位只有一个框一个类别。定位的框只是针对类别

在这篇论文中采用了“per-class regression” (PCR)(每个类别输出一个定位框),每个定位框有4个参数。先在训练集上预训练数据集,之后在从测试集上微调这个网络

定位算法包括两种:

  • RPN算法
  • RPN + Faster RCNN网络

ResNet和RPN比较相像
RPN是由Faster RCNN用于提取候选框的网络,ResNet此处用于输出每个类别的定位结果

RPN的网络包含两个并列头(一头为 1 * 1的卷积输出1000个二分类结果,另外一头输出每个类别的定位框),每一个分类是用的二分类逻辑回归(交叉熵训练的逻辑回归)
1000个类别,每个类别的概率都是0到1,和真实的标签概率做逻辑回归
回归层要输出1000个类别,每个类别的4个边界框的位置参数,也就是1000 * 4 - d(图像中出现不同位置的物体,都可被先验框锁中。不同物体的框比如矮胖,高瘦等)

具体交叉熵逻辑回归可看如下:二元交叉熵的基本概念

224 * 224的图片进行图像增强,再用256张照片进行微调,为了防止随机裁的时候裁不到物体。8个anchor在每张图片进行随机裁剪。正负样本的比例大致为1:1,用多尺度金字塔提取特征。

如下主要和VGG进行比较:LOC (定位框) 与 GT(真实框)
在这里插入图片描述
dense为裁剪好几个图,error也是显著降低

猜你喜欢

转载自blog.csdn.net/weixin_47872288/article/details/127516894