残差网络ResNet最全分析

  • Post author:
  • Post category:其他



论文的翻译






从理论上分析,越深的网络就会有越好的学习能力可以整合图像的低维、中维、高维的信息。

1.越深的网络是不是就只是叠加层数这么简单呢?

会产生梯度的爆炸或者消失,严重影响学习速率。

针对这个问题,我们可以通过归一的初始化和中间的归一化层得到缓和(增加BN)

随着网络结构的深度加深又会出现另一个问题:退化

退化:随着网络深度的增加,准确度达到饱和然后迅速下降。不能用过拟合来解释,因为在train集上的精度也下降。

图1分别表明了test和train的两种不同层网络随着迭代而时间准确率的变化。

退化问题说明不是所有的系统都同样的容易去最优化。

作者就想构建一个浅层结构和在其之上构建的深层结构的输出对比。(作者的意思就是我们在一般网络的输入和输出做一些改动,这里的浅和深你可以看分别看作小型网络的输入和输出),再原来网络结构上增加了identity映射(identity mapping 恒等映射就是输出包含原来的输入),plain映射(图中直的网络结构)还用来学习浅层特征,因为现在的网络输出包含输入,所以输出误差不会比没有恒等映射的大(因为假设输入已经是最好的优化了,那接下来的网络并不会有任何优化,输出就是原输入。所有说有恒等映射的网络结构的误差小于等于原来的网络的误差),实验表明有恒等映射的网络结构效果更好,缓和了退化问题。

在这篇文章里,作者提出了残差网络结构用来解决退化问题,大体的思想是我们并不希望训练的目标是X+F(X)(即H(X),网络的输入值加上网络的训练值,desired underlying mapping)而是H(X)-X(即F(X),把F(X)训练到接近于0)

都为输入经过非线性激活函数的输出(会存在退化问题), 应该还包括输入。这样构成残差网络。残差映射是F(x)=H (x)-x,原本的映射是F(x)+x (这里x是网络的输入,F(x)是输入经过原来网络(plain)的输出,我们假设优化残差映射比优化本来的映射更简单,如果X是最优,则F(X)为0,X经过非线性输出还是X(因为经过的是ReID单元)。

在这里插入图片描述

作者在ImageNet上实验了一个152层的残差网络,比VGG深8倍,取得了3.57%的错误率。

作者通过一系列实验证明了表示的深度(即网络的深度)对很多视觉识别任务都至关重要。仅仅由于使用了非常深的网络,作者就在COCO目标检测数据集上获得了28%的相对提升


二、


传统学习上也有利用残差向量来提取特征的,而且效果也很好,有的人就试着把他放到深度学习里,在highway networks里引入了这种跳跃连接,但是他引入了门函数,门关闭的时候效果更差。


三、


在这里插入图片描述

假定H(x)是网络训练最优化的输出,一般的网络都是输入x,得到网络输出映射,训练网络如何达到最好的输出映射(即H(x))

。残差网络不一样,输入是x,去训练网络输入和输出的差值即F(X)=H(X)-X(假设在两者相同维度)达到最优

。两种最后得到的都是最优化输出H(X),但是两种的难易程度是不一样的。

这种网络训练方法的改变是为了缓解退化现象提出来的,如果网络增加了恒等映射,训练误差就不会比不加的大。退化问题表明我们采取原来通过非线性层来达到最优化H(x)的难度有点大。采取残差网络学习,如果以前网络输出已经达到最优化,那残差网络的权重接近于0让输出等于输入,输出一直是最优化的H(x)。

真实的是,输入不会是最优化的H(x),但是残差网络可以帮助提高性能,更容易帮助解决退化问题。


3.2通过短路跳跃来实现恒等映射


我们将采取残差结构在原来的网络基础上,构建的模块在图2表示。

在这里插入图片描述

x为模块的输入,y是模块的输出,F(x,{W i})表示学习的残差映射。例如图2,F=W2σ(W1x),激活函数用的是ReLU,为了简化概念这里忽略了偏置,我们采用的加法后的第二个非线性的输出。

这种短路连接并不会带来额外的参数和计算量,这不仅在实际操作中很具有吸引力,还在对比普通网络(plain networks)和残差网络(resident networks)很重要。我们可以比较同时具有相同数量参数、深度、宽度和计算消耗的普通网络和残差网络。

我们

假定认为等式1的x和F具有相同的维度。如果不具有相同的维度,我们会用一个线性映射Ws来乘以x,使F和Wsx具有相同的维度



在这里插入图片描述

我们会通过实验来表明,恒等映射是能缓和退化问题,而且能简单,

Ws只是用来匹配x的维度



残差函数F的形式是灵活的,有很多种。本文涉及的F有两种,一种是三层的,一种是两层的。但是,F用在只有一层残差网络的话,更像是线性网络,并没有明显的优点。

以上介绍的都是关于全连接层的残差网络,其实同样运用在卷积层。函数F(x,{Wi}) 也可表示多个卷积层,在两个特征映射的每个通道上点加。


3.3网络结构


我们测试了很多一般网络结构和残差网络结构,在这里描述两个模型用于讨论。

plain网络(图3中间的那个):主要来源于VGG-19,卷积核用的主要是33的网络结构遵循两个设计规则:

1.same padding(输入 输出的大小一致)

2.特征映射的数量减半,卷积核的个数增加一倍

通过stride为2的卷积核降采样,在网络的结尾用全局平均池化和神经元为1000的全连接层去连接softmax,该网络的权重层(卷积层+全连接层)为34.该网络和VGG-19相比具有更少的卷积核和更低的复杂度。

Residual网络:我们只是把plain网络中加入了短路连接的方式,顺便用来和plain网络做对比。该网络有实线和虚线的两种短路连接,实线连接是表示输入输出的维度一致,x不需要Ws做线性变化。虚线表示输入和输出维度不一致。当输入输出的维度不一致时(虚线表示的地方),我们考虑两种选择:1.短路仍然用于恒等映射,用0去填充增加的维度。2.用Ws给x做线性变换(用11的卷积核)。对于两个选择,当短路跳跃两层网络结构时,我们将执行这两步。

图3:

在这里插入图片描述

3.4实施

训练:我们将图片将调整它的最小的边在[256,480]进行尺度的缩放,从图片中裁剪出224*224大小的图片进行随机采样或者水平翻转,并减去每个像素的均值。对图像使用了彩色增强,还加入BN在卷积层和激活函数之间。还需要初始化权重,采用的批量梯度下降法的批量是256,学习率是从0.1开始的并且当准确率不再提升的时候除以10,训练的最大迭代次数是600000,权重衰减是0.0001动量是0.9,没用用弃权。

测试:为了做对比,我们用10次裁剪进行测试。为了最好的结果,我们将采用全卷积的方式并在多个尺度下平均分数(图像调整最短的边为{224,256,384,480,640})


四、实验

4.1数据集


在ImageNet 2012 classification dataset,这个数据集有1000个类,分为训练图片1.28百万张,验证集5万张,测试10万张。评价用top-1和top-5的错误率。


表1

:第一列是block 第二列是这个block的输出大小 其他列就表示是多少层权重层用的卷积block以及内部进行了几次卷积。

在这里插入图片描述


表2

:分别表示18层和34层的plain/resnet 的在数据集上top-1的错误率。

在这里插入图片描述

图4:细线表示训练集上的错误,粗线表示验证集上的错误。左边是plain-18和plain-34右边是ResNet-18和ResNet-34

conclusion:

1.在残差网络中,退化问题得到了很好的缓和,而且随着网络层数的增加 可以获得更小的训练误差。

2.残差网络对比普通的网络有更小的错误率,说明残差网络可以有效我提升分类的精度。

3.ResNet在早期能够提供更快的收敛速度来简化优化。

在这里插入图片描述


表3

:ResNet改变恒等映射维度通过3个方法:

A.用0-padding

B.只在维度变化时,进行Ws的线性映射

C.所有恒等映射都进行Ws的线性映射

conclusion:

1.三种维度变化方法的ResNet都比原来的plain错误率小,说明相同层数的ResNet比plain训练效果好。

2.ResNet维度变化选择B比选择A的效果好,因为0padding没有进行残差学习

3.C的效果比B好,但会引入额外的参数。

4.ABC表明投影方式的不同对退化问题影响不大。(退化问题的解决是因为残差网络)

5.为了减少计算量和模型的复杂度,本篇文章的增加维数的方式都没有选择C。

在这里插入图片描述


图5

:表示不同的残差网络结构的F的形式

新结构(右边)中的中间3×3的卷积层首先在一个降维1×1卷积层下减少了计算,然后在另一个1×1的卷积层下做了还原,既保持了精度又减少了计算量

先用11的卷积将256维的chanel降到64维(只改变chanel不改变local信息) 进过33的提取信息 最后再用1*1的卷积增加通道数

因为新结构的输入维度比较大,所以要考虑到计算量的问题。当维数比较小的时候,还是考虑如何能提取更多的特征信息。

在这里插入图片描述


图四

:单一模型(使用了3层的block)的在验证集上的错误率

在这里插入图片描述


表5

:ResNet将6种不同的深度模型混合采用152层的网络结构,赢得了15年的第一ILSVRC。


4.2


作者的目的是推动深度网络的发展不只是为了达到state-of-the-art的效果,所以简化了网络结构


图6

细线表示训练错误 粗线表示测试错误 左边是plain网络 中间是ResNet网络 右边是ResNet-110和更高层次的对比

在这里插入图片描述


图7

表示 每层响应的标准差 这个响应是在卷积层和bn之后,激活函数之前的

上面的表示原始顺序 下面的表示降序排序

在这里插入图片描述


个人的理解



为什么要发展深度神经网络?


随着网络的深度不同可以提取图像low/mid/high-level的特征,

层数越多提取的特征就越丰富

。越深的网络提取的特征越抽象,越具有语义信息。


语义信息:有低、中、高语义信息


视觉层即通常所理解的底层,即颜色、纹理和形状等等,这些特征都被称为底层特征语义;

对象层即中间层,通常包含了属性特征等,就是某一对象在某一时刻的状态;

概念层是高层,是图像表达出的最接近人类理解的东西。


既然深度学习既然能提取更多的信息,为什么不能通过简单的叠加层数来使网络达到深度网络?

通过大量的实验得出,简单地叠加层数来达到深度网络会造成梯度的消失或者爆炸和退化问题。这些问题会导致这样得到的深度网络学习能力比浅层网络好不到哪里去。

针对梯度的消失或者爆炸,我们可以增加正则化初始化和中间的正则化层(BN)。BN它不仅可以加快了模型的收敛速度,而且更重要的是在一定程度缓解了深层网络中“梯度弥散(特征分布较散)”的问题,从而使得训练深层网络模型更加容易和稳定。

退化问题:随着网络深度的增加,准确度达到饱和然后迅速下降。不能用过拟合来解释,因为在train集上的精度也下降。


作者是如何提出来残差网络结构的?

首先在传统学习上,已经有运用这种残差学习如Fisher Vector,且都取得了很不错的效果。深度学习上也有人提出了用这种残差网络的结构,只不过增加了门函数效果不好。

作者就是想我学习恒等映射深层网络总不会比比浅层网络的性能差吧(原因下面有解释),后来构建了残差网络的时候发现能有效的缓解退化问题,来提高深层网络的学习能力。


怎么样通俗的理解恒等映射?


原文的解释:

在这里插入图片描述

具体的解释:

在这里插入图片描述

所以如果是一层的残差结构那学习起来的意义并不是很大。如果只是一层 类似于线性层并不会带来多大的性能的提升。(CSDN公式编辑器真SB)


残差网络是如何缓和退化问题和梯度问题的?


残差跨过一些层,求导的时候就可以直接加上shortcut的终点层的delta了。

resnet相当于多个模型的集成,其中真正有效的部分其实很短,缓和了退化问题,只是由于从loss到输入的有效路径变短了,所以问题不明显了。但是并没有解决,可以看下最后一个问题。

在这里插入图片描述


残差网络到底在学习什么?


学习恒等映射这点出发,考虑到网络要学习一个F(x)=x的映射比学习F(x)=0的映射更难,所以可以把网络结构设计成H(x) = F(x) + x,这样就即完成了恒等映射的学习,又降低了学习难度。这里的x是残差结构的输入,F是该层网络学习的映射,H是整个残差结构的输出。他

把学习的目标从优化F(x) + x接近最优化的H(X)转移到优化F(X),通过学习训练让F(X)接近0。


这样做的好处有很多:从直观上看残差学习需要学习的内容少,因为残差一般会比较小,学习难度小点。

举个大概的例子:如果不使用残差网络结构,这一层的输出F’(5)=5.1 期望输出 H(5)=5 ,如果想要学习H函数,使得F’(5)=H(5)=5,这个变化率较低,学习起来是比较困难的。但是如果设计为H(5)=F(5)+5=5.1,进行一种拆分,使得F(5)=0.1,那么学习目标是不是变为F(5)=0,一个映射函数学习使得它输出由0.1变为0,这个是比较简单的。也就是说引入残差后的映射对输出变化更敏感了。

进一步理解:如果F’(5)=5.1 ,现在继续训练模型,使得映射函数F’(5)=5。(5.1-5)/5.1=2%,也许你脑中已经闪现把学习率从0.01设置为0.0000001。浅层还好用,深层的话可能就不太好使了。如果设计为残差结构呢?5.1变化为5,也就是F(5)=0.1变化为F(5)=0.这个变化率增加了100%。引入残差后映射对输出变化变的更加敏感了,这也就是为什么ResNet虽然层数很多但是收敛速度也不会低的原因。明显后者输出变化对权重的调整作用更大,所以效果更好。残差的思想都是去掉相同的主体部分,从而突出微小的变化。


为何残差网络效果这么好?

1.使网络更容易在某些层学到恒等映射(identity mapping),假设之前的网络已经是最优化了,经过具有残差结构的网络后输出还是它本身(还是最优化)。如果输入不是最优化,我们再经过网络调优。所以说残差结构的深度网络本身具有不低于浅层网络的性能。

2.残差网络是很多浅层网络的集成,层的指数级很多。主要的实验证据是:把 ResNet 中的某些层直接删掉,模型的性能几乎不下降。

3.残差网络使信息更容易在各层之间流动,包括在前向传播时提供特征重用,在反向传播时缓解梯度信号消失。


Resnet 网路结构的目标函数是什么?


目标函数跟网络是分开的两个部分。目标函数,是为了达成目标,给网络一个feedback,让它学习。网络是达成目标的“魔法”,只要知道了最后一层目标函数的导数,扔给网络学就可以了。很多时候我们都认为网络是一个feature extractor(backbone),跟问题本身没有太大关系。ResNet主要是发现了residual connection可以缓和退化的问题,是网络自己的优化。

目标函数和用什么backbone没什么关系,跟你的任务和设计灵感有关。

例如,分类任务 交叉熵损失函数

回归任务 L1 L2 损失函数可以叠加

检测不就是分类+回归


既然采用了残差结构,论文中说为什么当层数达到10^3的数量级时,会出现退化问题?


针对这个问题,此处有两个观点供讨论。

1.残差结构还是可以的,但网络层数太高了,而数据集相对于网络层数来说有点小了。

2.当层数比较小的时候,残差结构可以很好的缓和退化问题,因为上一层饱和时可以通过残差映射更快的传递给下一层。但是当深度太高时,就算是简化成只有残差传递的话,网络还是很深相当于没有残差映射的原来的网络,所以网络还是退化了。所以我一直描述残差网络可以缓和退化问题,并不说解决。