ResNet(上)

0. Abstract

深度神经网络非常难以训练,为了解决这个问题,我们提出了一个残差学习的框架,用于解决非常深网络的训练问题,这个网络多深呢,比过去的网络要深的多,我们明确地把这个学习的框架重构了,之前是网络直接去拟合一个分布,而现在我们是让网络去拟合相对于上一层输出的残差,我们做了全面的实验,表明这个残差的网络更容易学习,而且能够通过加深,增加深度来提升性能,提升准确率,在ImageNet数据集上,我们训练了一个152层的网络,这是VGG深度的8倍,但是这个152层的网络,在参数量,模型复杂度上,却比VGG要低,很多的残差模型集成,达到了3.57%的错误率,这个结果赢得了2015年ImageNet图像分类竞赛的冠军。我们还在CIFAR-10数据集上构建了100层和1000层的网络。

神经网络的深度是非常重要的,网络越深,能够提取的特征的层次就越丰富,所以各类计算机视觉任务都要依赖于深度网络提取的特征,仅仅是因为我们这个网络非常深,所以能够提取很好的特征,用这个特征,仅仅是换了个特征,我们就在COCO目标检测数据集上,达到了28%的相对提升,而且在ImageNet和COCO 2015年的5个主要赛道上都获得了冠军,比如ImageNet的目标检测,ImageNet的定位,COCO的目标检测和COCO的分割。

1. Introduction

Introduction一般是介绍背景以及当前工作的一些不足

深度卷积神经网络已经在图像分类领域已经有了显著的进展和突破,深度网络一般是集成和整合了底层,中层和高层的不同尺度特征,50编号这篇论文是ZFNet,ZFNet里面可视化了底层,中层和高层不同层学习出来的特征,用这个特征后面接上分类器,来进行端到端地构建这个模型,而这个特征的levels,就是特征的层次是非常重要的,可以通过堆叠,把模型堆深,来提升特征的丰富程度,就是提升不同尺度的特征,底层的网络是提取边缘,形状,斑块,颜色这样的底层特征,到中层可能就是某种纹理,到高层就是纹理的更加特化的特征比如眼睛,比如轮子,进而越来越特化,最终变成一个分类的语义信息,就是从像素特征变成了语义特征,从底层特征变成了高层特征,随着网络加深,那么这个特征变得越来越特化,越来越难以解释。

最近的两篇论文VGG和GoogLeNet就表明了网络的深度是非常重要的,从这两篇论文的题目就可以看出来。

VGG的题目是Very Deep Convolutional Networks for Large-Scale Image Recognition

GoogLeNet的题目是Going Deeper with Convolutions

GoogLeNet的参考文献第一条就引用了小李子在盗梦空间电影里的表情包,we need to go deeper,就表明这个深度特别重要。

然后近年来的一些比较先进的这个算法,VGG,GoogLeNet,PReLu,BN-Inception,这个PReLu也是ResNet的作者写的,都表明了在ImageNet数据集上要使用非常深的网络,VGG用了一个16层的网络,BN-Inception用了一个30层的网络,其它的视觉任务,比如目标检测,语义分割,像R-CNN,SPPNet,fast R-CNN,faster R-CNN,FCN,也都要使用很深的网络,看这个何恺明就是PReLu,faster R-CNN,Mask R-CNN,SPPNet,Group Normalization,而张祥雨是ShuffleNet的作者,最近在研究自动机器学习,而任少卿是faster R-CNN的第一作者。所以他们几个在图像分类和目标检测上,他们自己就提出了很多模型,各类计算机视觉任务都需要依赖于深度网络提取出的深层的丰富的特征,所以这个提取特征的骨干网络非常重要。

既然深度这么重要,直接简单粗暴把网络堆深就行吗?明显不行,第一个遇见的阻碍就是臭名昭著的梯度消失和梯度爆炸问题,这个梯度消失和梯度爆炸会阻碍模型开始训练时候的收敛,但是梯度消失和梯度爆炸的问题已经可以通过各种各样的归一化技巧,或者初始化技巧来解决了,比如说你可以使用各种各样的权重初始化,比如说Xarier初始化,MSRA初始化,这也是ResNet的作者提出来的,关于这几个初始化可以看CS231N那个公开课,里面有专门一讲介绍如何防止梯度消失,就是通过初始化和Batch Normalization来解决,这样网络就能开始收敛了,通过随机梯度下降优化器和反向传播算法就可以收敛了。这是他遇到的第一个阻碍,基本上已经解决了。

而第二个阻碍是这篇论文主要讨论和解决的,degradation,就是退化问题,网络变深的时候,你会发现深层网络在训练集上的误差和测试集上的误差都变得更高了,都比浅层网络要差,这个现象叫网络退化,这个退化现象是另外一种问题,既不是由梯度消失或梯度爆炸导致的,也不是由过拟合导致的,过拟合是指在训练集上误差低,但在测试集上误差高,而网络退化是在训练集和测试集上误差都高,网络变深的话,在平常作业题和高考题都变得更差,给孩子报了课外辅导班之后,他比那些没有报班的孩子,平常作业题做的也差,高考题考试做的也差,这个就称之为退化现象,在11号文献和42号文献也做了讨论,在我们的实验中,也有非常详尽的验证。

这个图是在CIFAR-10数据集上训练的20层网络和56层网络,左边是训练集,右边是测试集,纵轴都是误差,比如是top-5误差或top-1误差,可以看到红线永远是比黄线高的,两张图红线都比黄线高的,表明了网络退化现象,就是网络从20层加深到了56层,在训练集和测试集上的性能,都不如浅层网络。

这个退化问题表明了不是任何网络都能被相同的优化,不是说你简单的加深网络就能浅层网络一样的优化了,于是作者就想办法对它进行了改进,用一个浅模型,因为我们对浅模型比较了解,浅模型的输入传成两个分支,一条分支保留它不变,对它不进行任何操作,而另外一条分支用同样的一个浅模型来对这一条分支进行处理,然后把这两条分支进行汇总,其实就是加起来输出,这又是一种解决方案,至少这个模型不会让成绩变得更差,大不了就是浅模型这一路为0,仍然是怎么输出来的保留不变,一直到输出,至少加深网络不会让性能变得更差。

这个shallower architecture是绿色,deeper counterpart是整个图,一条路是identity mapping恒等映射,就是不变,另一条路是拷贝了同样的一个浅模型,就是这两个绿色是一样的,这个模型就能够实现加深模型起码不会比浅模型变得更差,就是给孩子报了课外辅导班之后,起码至少不会比不报辅导班的更差,但是这个实验表明这种结构属于递归结构,就是它的网络里面包含了它自己,一个函数中引用了它自己,这种递归结构的很难以被优化,或者是这种结构很难被求解,就是在可行的时间内是没法求解的。

在这篇论文里面,为了解决这个退化问题,我们提出了一个深度残差学习的框架,模型不需要直接去拟合那个底层的映射,而是让它拟合相对于输入的残差。

浅模型输出这个图可以从上面这个图2来解释,还是一条输入,其中一条路不变,而这条路称之为短路连接,也可以称之为跳跃连接,也可以称之为恒等映射,它们三个指的都是一回事,另外一条路是这个神经网络,这个网络负责拟合相对于原始输入的残差,就是去纠正原始输入的偏差,让它变得更好,而不是让整个网络去拟合全部的底层的映射,这样的话只需要进行微调,进行修正就可以了,这对网络而言是更容易学习的,那就是x输入进来,一条路原封不动过来,另一条路经过一层神经网络处理之后,再进行一次激活,再进行一层神经网络处理,不使用激活,跟x加了之后,再进行激活,这就是一个典型的残差模块,Residual block。

ResNet就是很多这样的残差模块堆起来的,之前的话,神经网络需要拟合一个H(x),是一个底层的映射,现在的话不需要直接拟合这个底层映射,而是直接拟合相对于x的残差,偏差就可以,把残差和恒等映射加起来,最终就是这个H(x),底层的映射,我们假设拟合残差比直接拟合底层映射要容易,极端情况就是如果恒等映射足够好的话,那残差模块就可以把所有的权重都学成0,然后输入也为0,这样的话输入和输出就一样,残差为0,底层映射就是恒等映射。就是把这个残差模块里面的神经网络的权重学习都为0,这个是比较容易的,比直接拟合一个恒等映射要容易,就是这个神经网络拟合恒等映射的能力非常差的,关于这个在上一讲视频,ResNet的机理中也解释了。

什么都不做有的时候是最重要的,也是最难的,而传统结构的神经网络很难做到什么都不做,就是输入是什么样的,输出就是什么样的,这个对于传统神经网络而言是比较难的,但是如果变成残差这种方法就比较容易了,让残差层的权重都为0,这个是比较好办的,是能够学习出来的。

这个结构可以使用短路连接,shortcut connections,或叫跳跃连接,也可以称之为恒等映射,来表示恒等映射那一条路,shortcut这个词在英文里面是走捷径的意思,可以把很多不同的层通过shortcut连起来,在我们这个论文里面,shortcut connections指的是只仅仅来进行恒等映射,然后最终把这两条路的结果加起来,恒等映射既不会引入额外的参数量,也不会引入额外的计算量,当然这里有个加法,加法是可以忽略不计的,乘法才是那种真正的浮点运算要算的计算量,所以加了这个恒等映射之后,对于模型的大小而言,基本上是没有变的,同样可以使用随机梯度下降和反向传播方法,端到端的去训练,而且也可以使用现有的深度学习框架,比如像Caffe,Caffe里面的求解器来处理,当然现在没有人使用Caffe了,在当年15年,16年的时候,Caffe是非常火的一个框架,作者也是中国人,浙江绍兴人,贾扬清,Caffe框架的核心就是一个Solver和prototxt文件,定义了优化器。

我们对这个ResNet在ImageNet上做了详尽的实验,表明这个退化问题是如何出现如何解决的,评价了我们这个模型的性能,实验结果表明特别深的残差网络,是易于优化收敛的,相比于没有残差结构的普通的网络,普通网络就是直接简单的堆层,就像VGG一样,而简单堆层的话,就出现了退化问题,当深度增加的时候,在训练集和测试集上的误差都会变高,相当于第一条就说明我们的网络解决了退化问题,而第二条是可以把模型变得特别特别深,用特别深的模型提取出的深层的更丰富的特征,可以用来提升各类计算机视觉任务的性能,用了enjoy这个词,所以论文写作里面这个词很重要,我们这个深度网络可以从深层网络提取的特征中享受性能的提升,相比于之前的网络而言,性能大大提升了,substantially,大大提升了。

在CIFAR-10数据集上,我们发现了类似的现象,也是网络越深,就出现了退化现象和优化困难现象,说明这个退化现象不止局限于特定的数据集,它是一个普遍存在的规律,一个现象,我们在CIFAR-10数据集上实现了100层网络和1000层网络,做了这么几组实验。

在ImageNet图像分类数据集上,实现了得到了一个优秀的特别深的残差网络,有了非常不错的结果,然后这个ResNet-152,而152层的深度残差网络是ImageNet当年最深的网络,但这个最深的网络仍然比VGG模型要小,参数量要少,计算复杂度要小,然后在多个残差模型的模型集成,达到了3.57%的top-5错误率,这是有史以来最好成绩,而且超过了人类的水平。

这个成绩获得了2015年ImageNet图像分类竞赛的冠军,这个特别深的网络提取的特征同样可以迁移泛化到其它的计算机视觉任务上,进一步我们赢得了ImageNet目标检测竞赛,ImageNet定位竞赛,COCO的目标检测竞赛,COCO分割竞赛的冠军,表明深度残差学习的原则是普世的,同样可以用于其它的计算机视觉和非计算机视觉的任务。

2. Related Work

相关工作,也就是文献综述,在写作的时候有一个套路,就是要尽可能把现有的这些工作踩下去,把自己的创新点给拔出来,有一种拉踩的感觉。

在这个文献综述上,先讲了这个残差学习,或叫残差表示,在图像识别领域,这个VLAD就是把这个残差向量来进行编码,进而用它来表示,这个残差向量是相对于一个字典的,Fisher Vector是相当于VLAD的概率版本,但是它们这几种现有工作,都做的比较浅,只是用于图像分类和图像检索非常浅的特征,他们的工作表明在向量量化这个工作上压缩编码,残差向量表明出了更好的性能。

残差表示。在图像识别中,VLAD[18]是一种通过关于字典的残差向量进行编码的表示形式,Fisher矢量[30]可以表示为VLAD的概率版本[18]。它们都是图像检索和图像分类[4,47]中强大的浅层表示。对于矢量量化,编码残差矢量[17]被证明比编码原始矢量更有效。

在低水平的图像工程,就是对像素层面进行操作的图像工程,以及计算机图形学领域,计算机图形学是研究如何在计算机中表示各种二维,三维的图形,并且把它显示在电脑屏幕上,这就是计算机图形学研究的,三维空间要渲染,就要解决偏微分方程问题,解决偏微分方程问题,经常采用多重网格的方法,其实就是把这个问题分解为若干子问题,每一个子问题都是求得一个相对于粗粒度,更细粒度的残差,对它求解,多重网格方法的一个替代方案是采用级联基的preconditioning的方法,也是求得两种尺度的残差。

现有的工作表明用残差的这个方法才能收敛的更快,但是现有的工作并没有发现残差这个现象更加本质的用于机器学习的提升,这些方法也表明一个好的问题重构和预处理能够简化优化流程。

这是第一个残差表示的现有工作

第二个是Shortcut Connections的现有工作,就是把网络中不同层连起来,很多90年代的老论文都讨论了这一点,比如说在早期训练多层感知机,就是多层神经网络的时候,从输入层到输出层之间加一个线性层来连接,在GoogLeNet里面,也有一些层是通过辅助分类器,来连接到底层的,在讲解GoogLeNet那篇论文的时候,作者这样做是希望能够在训练的时候,通过引入多个输入头,来把损失函数的梯度尽可能的注入到底层,当然在inception的后续版本论文中证明这个想法是没有用的,但当时他的初心是想通过这个Shortcut Connections把梯度尽可能的注入到底层,防止梯度消失,解决梯度消失和梯度爆炸问题。

这些论文表明整合每一层的输出梯度和反向传回来的误差,通过Shortcut Connections整合这些东西是非常重要的,在GoogLeNet里面,Inception结构也是包含了一些Shortcut连接的。

同时进行的研究是highway network,门控函数,就比如在循环神经网络里面,像LSTM,GRU里面有很多门,这个门有的时候是开的,有的时候是关的,开的话信号就能通过去,关的话信号就不能通过去,这些门是数据驱动的,需要学习一些权重参数去控制,跟它们不一样,我们这个Shortcut就是一个恒等映射,没有参数,而且也没有什么门,永远都是开放的,在传统的这些带门的网络里面,如果这个Shortcut关上了,或相当于逐渐趋近于0,表现的就是一个非残差学习的范式,比如在LSTM里面,输入门和更新门,输出的为0,不会对现有的记忆有任何更新,那么过去输入是什么样的,输出就是什么样的,没有残差,但是跟它们不一样,在我们的ResNet里面,永远都是有残差的,这个identity shortcut是永远不会被关上的,所有的信号都是能够通过的,就是额外的残差永远会被学习到,现有的工作也表明,这个highway network,就是带shortcut的network,并没有用于特别深的网络中,在特别深的网络中,并没有发现到性能提升。

3. Deep Residual Learning

接下来到论文的主干部分,深度残差网络,首先是残差学习

3.1 Residual Learning

其实和刚刚那个图是一个意思,我们假设H(x)是真正底层的那个映射,是要拟合的输入到到输出的映射,有可能是被网络的一个模块学习到的,也可以是被整个网络学习到的,假如说最终要学习的映射就是这么一个东西,x是输入,根据万能近似定理,这是人工智能领域非常有名的定理,只要有一个隐含层的神经网络,理论上就可以拟合任何函数,不管这个函数多少非线性,多么高维,只要隐含层的神经元个数足够多,神经网络都是可以拟合出来的,就是多个非线性的层可以渐渐拟合复杂的函数,叫做万能近似定理。

这里写的这个万能近似定理现在仍然是open question,从数学上有证明,但实际怎么用,有各种各样的解释,跟它们不一样,我们不是直接让网络去拟合H(x),而是拟合H(x)减去输入x的这个残差,这里假设输入和输出是同样的维度,因为我们要对它求和,是逐元素的求和,就是让这个堆叠起来的层,与其让它们去学习H(x),我们直接让它去学这个残差了,最终结果就是残差加上输入,效果上就和这个底层的映射一样了。

虽然神经网络两种范式都可以学,既可以直接拟合底层的映射,也可以拟合残差,但是拟合残差会更加简单,因为我们之前也讲过,神经网络拟合恒等映射的能力是比较差的,什么都不做对它而言是比较难的,为什么要这样改进呢,就是因为退化现象,在introduction里面也进行了讨论,如果层数一味增加,在训练和测试集上都会表现的更差,这就是网络退化现象,如果加了这个恒等映射的话,残差结构退化现象就会被解决,这里退化现象表明了神经网络很难拟合恒等映射,就是多层非线性的层是很难拟合恒等映射的,很难让它学习到一个输入是什么,输出就是什么的,但是通过残差学习,这个reformulation,这样重构一下,如果输入的恒等映射,就已经是最优的了,那残差模块就可以只需要拟合一个零映射就可以,只需要让这个权重逐渐变成0,输出也逐渐变成0,最终的效果就是残差模块可以拟合恒等映射。

在实际的情况下,恒等映射往往都不是最优的,所以残差分支是有用的,是要对输入进行处理,进行修正的,而后边的网络只需要拟合前面的网络的输出与真实的那个期望标签的残差就可以了,只需要拟合这个扰动,相对于恒等映射的这个扰动,这个扰动就是残差,而这个对于神经网络而言是比较容易做到的,而图7的这个实验表明了残差模块输出的响应会更小,因为这个扰动是比较小的,所以输出的响应就比较小,于是就表明了它提供了一个reasonable preconditioning

3.2 Identity Mapping by Shortcuts

3.2是把这个式子变成了数学公式了,其实就是车轱辘话来回说,我们在每一层,就是每一个模块里都使用了残差学习,就是像图2展示的那样,图2就是一个残差模块的图,写成数学公式就是y等于它俩之和,右边这一项是恒等映射,左边这一项是残差,残差其实是一个神经网络的输出,可以写成图2这样。

就是先用一层神经网络处理,然后激活,再使用一个神经网络处理,不激活,而这个sigma就表示一个激活函数,比如说是ReLu激活函数,而偏置项这里就先忽略了,因为这个并不是很重要,如果卷积层后面加了Batch Normalization的话,是不需要偏置项的,因为它的期望已经变成0了,Batch Normalization就是把输出的均值变成0,方差变成1,最后把残差和输入加起来,通过一个shortcut connection进行逐元素的相加,element-wise,逐元素相加,channel-wise,逐通道相加,wise就是逐的意思,每一个元素对应的相加,比如说把两个三阶魔方加起来,把每一个方块对应位置的数加起来,最后得到的还是一个三阶魔方,然后再对这个求和的结果,再使用一次非线性,就是再激活,其实就是在讲刚刚这个图。

这激活一次,求和之后,然后再激活一次,就是这个ReLu

这个shortcut connection既没有引入额外的参数,也没有引入额外的计算复杂度,所以就提供了一个控制变量的对比的一个条件,我们能把带残差的和不带残差的普通网络来对比,它们是有相同的参数和复杂性的,可以公平的来对比,它们的参数数量,深度和宽度都一样,甚至计算的消耗量也一样,一个有残差,一个没残差,这就是一个单一变量的对照实验,一个消融实验,就能够看出这个残差到底有没有用,这个计算量是有一点点不一样的,因为残差模块有这个微不足道的加法,这个加法是可以忽略不计的,在这个公式(1)里面

x和F的维度必须一样,这样才能逐元素的相加,如果维度不一样的话,比如说有下采样的层,那就可以对这个shortcut connection再进行一次线性变换,把它变成和残差模块的输出同样维度大小,在后文也有讲解,这里也可以用一个方阵,方阵就是输入和输出大小是一样的,行和列一样的矩阵,这样就能让shortcut的输入和输出维度是一样的,也做了很多对比,比如说在Identity Mapping这篇论文里面,做了很多对shortcut进行各种处理的对比,最后发现Identity Mapping是最好的,恒等映射是最好的,什么都不做是最好的,可以看一下这篇论文,在现在这篇论文里面,保留恒等映射已经是足够解决退化问题了,而且是比较经济的,如果在shortcut connection里面加了参数的话,又引入了额外的参数和复杂度,是不经济的,什么时候才这样做呢,只是需要匹配维度的时候,下采样的时候,才需要这样做。

参考:

深入解读残差网络ResNet V1(附源码) - 知乎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值