目录
前言
斩获2015年ImageNet挑战赛分类、检测、定位问题第一名、COCO2015检测和分割问题第一名,何凯明大神的ResNet,应该是无人不知无人不晓了。总体感觉ReNet还是比较好阅读的,因为理论性不像GoogLeNet那么深,但是这丝毫没有影响ResNet的实战表现。依然是全文梳理加个人理解,先给出大神的论文下载链接吧:
ResNet论文下载传送门
ResNet论文阅读笔记
Abstract
越深的网络越难训练。对此,我们提出了一个残差学习的思想,使得深度网络能够更容易训练。我们重新设计了网络中层的结构,构建一个残差学习函数,使得这些层能够参考层的输入信息进行学习,而不是毫无参考地去学习新的映射。
1. Introduction
最近的一些研究工作表明,网络的深度对于网络性能来说尤为重要。由网络深度的重要性引出的问题是:不断地增加网络深度是否会影响网络训练难易程度?一个著名的问题就是梯度消失/梯度爆炸问题了。梯度消失/爆炸问题会从一开始就阻碍网络的收敛(梯度计算会乘上网络权重,随着网络的加深,乘的权重也越来越多,梯度会以指数的形式变化,当权重小于1时,梯度以指数速度趋于0,为梯度消失;当权重大于1时,梯度以指数速度趋于无穷,为梯度爆炸)。然而,我们可以通过一些归一化的初始化方法和BatchNorm来解决梯度消失/爆炸问题。
解决了梯度消失/爆炸问题后,深度神经网络已经可以收敛了,但是又出现了一个新的退化问题。随着网络深度的增加,准确率会逐渐趋于饱和(这个好理解),但是之后准确率又会下降(这就奇怪了)。而且,这种退化问题并不是由过拟合引起的。对于一个合理深度的网络来说,继续增加网络深度反而会导致更高的训练误差, 如下图所示:

这种退化问题表明,并不是所有的系统都是很容易优化的。深层模型相当于是一个浅层模型后额外添加了一些层,深层模型的训练集误差不应该比浅层模型的训练集误差大。但是实验结果表明,我们没办法通过深层模型找到一个比浅层模型更好的结果。
我们通过提出一个深度残差学习模块,来解决这种退化问题。我们假设本来这个模块要学习的映射是H(x),那么现在我们这个模块不让它学习H(x)了,我们让它学习F(x) = H(x) – x(本来要学习的映射和输入信息之间的差,就是学习一个残差)。由于本来要学的是H(x),现在只学到了F(x),那么我们通过一个short connection来把输入信息x直接传递到F(x)的地方,再将两者相加,这样就可以输出本来要学习的映射H(x)了。这种设计的优势在于,如果前面一层学习到的x已经是最优的映射了,那么我们需要学习的F(x)其实就是0,这其实是很容易学的(直接权重归0就行了);如果没有short connection,那么需要在权重中填入合适的数来使得这些层进行学习,输出一个本来被输入的映射x,这要相对困难一些(或者按照吴恩达深度学习的说法,引入short connection,这个模块可以什么东西都不学,直接输出一个x,因此这种short connection至少在网络深度加深的时侯,不会导致网络学不到本来浅层网络就能学到的东西)。
2. Related Work
Residual Representations. 提到了很多领域其实都有残差的思想,作者也是由此受到了一些启发。
Shortcut Connections. 很多论文中都有一些short connection或类似short connection的概念,作者由此收到启发。
3. Deep Residual Learning
3.1. Residual Learning
假设网络能够学习H(x)的映射,那么网络也应该有能力学习一个H(x) – x的映射。虽然H(x)和H(x) – x网络都有能力学习,但是学习的难易程度是不一样的。
退化问题表明,通过多层的非线性层来学习一个原本的映射x是比较困难的。如果最优的映射更接近于输入的映射x而不是0映射,那么如果模块能参考输入映射x去学习的话,学习过程相比完全不参考x,去学一个新的映射来说,会更容易(意思就是输入映射x其实可以提供很多信息,网络参考x的信息,去学习一个相对于真实映射H(x)的残差F(x),会更容易,因此将x用short connection传递给F(x),可以帮助网络更好地学习)。我们会用实验证明,学习到的残差往往是比较小的响应,原本的映射x是比较主要的(这就符合了作者上面的假设,其实x是比较接近真实映射H(x)的,那么残差F(x)就是比较小的响应。网络的学习过程实际上就是先大致上学一个框架x,然后通过不断学习小的F(x),来不断完善和修补原来的x,最终得到更加真实的映射)。
3.2. Identity Mapping by Shortcuts
我们设计如下的残差块:

对于上面的残差块,我们定义如下:

(1)中的short connection没有任何参数,简单的相加也不会增加运算的复杂度。这不仅在实践中是很有意义的,而且也很方便我们进行对比实验(相同深度、宽度的网络,传统CNN和残差网络的参数量和计算量是一样的,很轻松地控制了变量,这样就可以很方便地比较相同深度、宽度、参数量、计算量的两种不同网络的性能了)
(1)中要求x和F维度得是一样的(不然怎么加嘛),那么如果两者维度不一样的话,就利用下面的公式,对x作一个线性运算W_s,使得两者维度相等:

通过观察(2),我们也可以发现,其实x和F维度相等的话,我们也可以用(2)式(矩阵W_s选成方阵就行了),但是后面我们的实验会证明其实没有必要,我们直接用(1)式,把x拿过来加上就行了。
残差块的设计也是很灵活的,上面的残差块中间的网络设计成了两层,当然也可以根据需要设计成三层或者更多层。但是如果设计成一层的话,(1)式就相当于是进行了一个线性运算:

这就没有必要了,我们也没看到一层的设计有什么优势。
虽然上面的公式都是以全连接的形式表示的,但是也同样适用于卷积运算(好吧我一开始就是按卷积理解的)。卷积就是输入的feature map和学习到的feature map逐通道相加。
3.3. Network Architectures
基于ImageNet数据集,我们比较了传统CNN和ResNet的性能。
Plain Network(就是传统CNN). 我们基于VGG模型提出了一个传统的CNN网络,网络设计的原则如下(基本上就是VGG的设计原则,当然也参考了现有的其他研究成果比如NIN):
1、基本使用的都是3*3的卷积核
2、如果某一层输出的feature map尺寸不变(stride=1),那么filter的数量就不变
3、如果某一层输出的feature map尺寸减半了(stride=2),那么filter数量就变为原来的二倍,来确保每一层的时间复杂度是一样的
4、下采样的stride是2
5、网络最后使用了全局平均池化(GAP),然后加了一个1000单元的全连接,最后输入softmax(因为一共有1000类)
值得注意的是,相比VGG模型,我们提出的模型具有更少的滤波器数量和更低的复杂度。据统计,我们的模型,浮点计算数量仅仅是VGG的18%。(我认为,这其实很大程度是得益于使用了GAP,大大减少了参数,因为VGG模型中,最后一层卷积层后的第一层全连接参数占了总参数的很大比重)
Residual Network. 根据上面的Plain Network,我们提出了一个和它深度相同的ResNet。图中的short connection中,实线代表x和F相同维度,我们直接使用(1)式,虚线代表两者不同维度,我们考虑下面的两种选择:
(A) short connection仍然把原来的x拿过来,对于多出来的通道,直接填0
(B) 使用(2)式,使用1*1的卷积,使得x的维度变化成和F一样的维度
注意,对于A和B,在short connection这里,步长设置为2(注意,x和F不仅仅是channel数不同,由于第一层卷积的步长是2,两者的Height和Width也不同,因此这里需要设置一个2的步长来使得两者的H和W也相同)。

3.4. Implementation
一些训练的细节,就不多说了。训练过程基本上采纳了AlexNet和VGG的过程,不同的是添加了BatchNorm,没有使用Dropout。
测试的过程也是借鉴了AlexNet,还参考了其他文献进行了多尺度的操作提高性能。
4. Experiments
4.1. ImageNet Classification
本文在ImageNet 2012数据集上进行了实验。先来介绍一下参赛运动员:

上图一共有5个不同深度的网络,但是每个网络模型都可以是plain network或者ResNet。下图展示了18层网络和34层网络的对比结果:


Plain Networks. 对于plain network,34层的表现还不如18层,训练error和验证error都比18层的大,这也是前面提到的退化问题的结果。
深层网络参数更多,比浅层网络更难优化。但是我们认为这个优化上的困难不太可能是由梯度消失导致的。这些plain network设计中都加入了BatchNorm,这保证了前向传播的信号都有非零的方差。此外,我们还验证了在BN的帮助下,反向传播的梯度都是正常的。因此前向传播和反向传播的信号都没有消失,不是梯度下降导致的退化。我们推测,原因可能是网络的收敛速度随着网络深度的增加,以指数的速度衰减。这使得深层网络反倒产生了更高的训练error(我们的实验证明,即使增加迭代次数(变为3倍),退化问题仍然存在,因此退化问题无法通过增加迭代次数的方法来得到明显的改善)。
Residual Networks. 下面我们来看看18层和34层的ResNet会不会有不一样的效果。ResNet网络的整体架构(baseline)和plain network一样,只不过每两个3*3的卷积层用short connection连接。对于Table 2的ResNet和Figure 4右侧的图,当x和F维度不同时,我们采用的是策略A(多出的通道直接填0),这样可以保证short connection不会引入额外的参数,使得ResNet总参数量和plain network的总参数量相等,这样对比会更公平。
分析Figure 4,我们发现:
1、与plain network的情况相反,对于ResNet,深层的网络不仅训练error低,而且验证error也低,表明这个34层的网络泛化能力也不错,退化问题得到了解决。我们确实能通过增加网络深度,使得网络的性能得到提升。
2、横向比较,34层的ResNet比34层的Plain,top-1 error降低了3.5%,性能得到很大提升。这个比较也验证了残差学习对于深层网络的性能提升是很有效的。
3、对于18层的Plain和ResNet,两者的准确率是差不多的(见Table 2),但是Figure 4中可以看出,18层的ResNet收敛更快,因此ResNet的设计可以加速收敛。
Identity vs. Projection Shortcuts. 上面的实验已经说明了无参数的策略A有效,下面看看其他策略性能如何。Table 3中:

策略A:还是以前的无参数策略,直接填0
策略B:仅仅当x和F维度不一样时用式(2),维度相同时全用式(1)
策略C:所有的short connection都用式(2)
结果表明,三种策略都比plain network效果好。B比A好,我们认为是原因是直接填0的通道实际上没有进行残差学习,是跟以前一样学习新的映射。C比B略好一些,我们认为原因是引入了更多的参数,学习更加灵活。但是无论是哪种策略,都可以有效解决退化问题。A/B/C的性能差异不大,不是很重要。因此在后面的实验中为了减小时间复杂度和模型的size,我们没有采用策略C。
Deeper Bottleneck Architectures. 前面只是对退化问题进行了一些实验进行研究,实验中的网络模型不是我们对于ImageNe分类问题的解决方案。对于ImageNet分类问题,我们主要使用的是Table 1中50层及其以后的网络。这里对于残差块,我们采用的是一种瓶颈式的结构。两个1*1的网络分别用于降维和升维(目的应该还是减小运算量)
50-layer ResNet: 残差块的内部层数从两层变为三层,使用策略B。
101-layer and 152-layer ResNets: 通过堆叠更多的三层残差块,得到更深的网络。值得注意的是,尽管网络已经很深了,但是152层的ResNet复杂度依然比VGG低(应该很大程度上得益于GAP)。
Comparisons with State-of-the-art Methods. 实验结果在Table 4和Table 5中。Table 4中所有的模型都是单个模型,可以看出,152层的ResNet不仅在单个模型中性能最好,而且对比Table 5中的结果,单个152层ResNet甚至超过了以往方法的多模型平均的结果(太6了)。那如果将多个ResNet模型平均一下,性能就更不用说了。我们6个不同深度的ResNet平均的模型取得了3.57%的top-5 error。


4.2. CIFAR-10 and Analysis
本文还在CIFAR-10数据集上进一步探讨了极端深度的网络的性能。网络的设计原则如下:

输入原始图像大小是32*32,每进行一次下采样就将滤波器的数量增加一倍。网络总共有6n+2层。选择策略A,这样ResNet和plain network可以有完全相同的深度、宽度、参数量。
训练细节就不说了,直接来看结果:


和ImageNet数据集一样,CIFAR-10上plain network的退化问题仍然很明显。但是ResNet可以克服退化问题,并且随着网络深度的加深不断取得更高的准确率。
这里有一个细节是,在训练110层的网络时,如果还采用之前的学习率0.1,网络会在几个epoch后收敛到90%的error附近,之后不再下降(应该是学习率太大无法收敛)。因此我们的做法是,先用一个小的学习率0.01做一个热身训练,让网络的error下降到80%,然后再采用之前的0.1的学习率继续训练,最终110层的网络也可以收敛得很好。(正常训练网络貌似都是学习率先大后小,我还没听说过还有这种热身训练的说法,看来网络训练说起来简单,实践起来问题还是挺多的)
Analysis of Layer Responses. Fig. 7展示了各个层的标准偏差响应。这个响应是在每个3*3的层的BN后,非线性激活/short connection相加前输出的。对于ResNet,这个值表明了残差函数的响应大小(不太明白为什么标准差表明了函数的响应大小)。Fig. 7结果表明,残差函数的响应确实比plain network的响应小,这也验证了我们前面的假设。ResNet设计的结果确实是使得网络先学一个框架,然后不断地进行小的修正。

Exploring Over 1000 layers. 设置n=200,来看看1202层的网络(乖乖!)。结果表明:用我们的方法,1000层量级的网络没什么优化难度,依然能够取得很低的训练error(<0.1%),test error也不错。
但是仍然有个问题是:尽管train error都很小,但是1202层网络的test error不如110层的test error,我们认为这是因为过拟合的问题(这个用过拟合来解释我觉得是合理的,因为网络太大了,很多参数都用不到,这些参数可能会增加模型的随机性,导致测试时效果不好)。这里我们没有用任何正则化手段(因为目的是研究极端深度网络的性能,并不是提出state-of-the-art的模型,没必要用正则化)。如果用正则化效果应该能更好。
4.3. Object Detection on PASCAL and MS COCO
写不动了,以后再看吧。
总结
理论上网络越深,可以达到的训练误差应该越小,但是实际情况并不是这样。ResNet发现了深度网络中存在这种退化问题,该问题既不是过拟合引起的,也不是梯度消失引起的,作者猜测原因可能是网络的收敛速度随着网络深度的增加呈指数衰减。然后,作者提出用short connection构建一个残差学习块,以这个块为基础构建的深层网络,可以有效地解决退化问题,使得实践结果符合了理论结果。
3129

被折叠的 条评论
为什么被折叠?



