在AlexNet[1] 取得 LSVRC2012分类竞赛冠军之后,引爆了深度学习网络。
在何凯明在2015年的深度残差网络(Deep Residual Network,简写为ResNet)[4]可以说是过去几年中计算机视觉和深度学习领域最具开创性的工作。ResNet使训练数百甚至数千层成为可能
,且在这种情况下仍然展现出优越的性能。
一、深层CNN的退化
自AlexNet以来,最先进的CNN架构已经越来越深。AlexNet只有五个卷积层,而之后的VGG网络[2]和GoogleNet(代号 Inception_v1)[3]分别有19层和22层。但是,网络的深度不断加深,性能会越来越好吗?很显然不是的,人们发现当模型成熟增加到某种程度,模型的效果将不会升高反而会下降。也就是说,深度模型发生了退化(degradation)情况。
为什么网络出现degradation?首先想到的无非是**过拟合(over fitting)或者是梯度爆炸/消失(Gradient Exploding/Vanishing).**那真的是这些原因导致的吗??!
1.1 过拟合(over fitting)?
首先看看是否是过拟合导致的
在ResNet[4]中做了个很经典的实验,如图1所示
左图的纵坐标表示训练误差;右图的纵坐标表示测试误差;横坐标都表示迭代次数(每个单位为10000次)
在图1中我们知道,20-layer的网络训练过久的话,虽然训练误差有所下降,但是测试误差却相对来说变大了,这是过拟合现象,所谓的过拟合就是在训练的时候表现很好,但是在测试的时候表现的很差,通俗的说就是学习过头了,也就是训练误差小而测试误差大。
此外,实验不止证明这一点,当成熟增加到56-layer时,这个网络在训练和测试的误差都变大了,说明和过拟合无关。
1.2梯度爆炸/消失(Gradinent Exploding/Vanishing)
过拟合不是导致网络degradation的原因,那么Gradient Exploding/Vanishing呢?
在讲之前,我们首先回顾以下反向传播的知识,这里引用知乎[11]的内容
这就是前向传播,即一步一步往前计算
![](https://i-blog.csdnimg.cn/blog_migrate/6483a8164a85e71894aa7c1e1396a638.png)
而反向传播则是从输出反向一点点推出输入的梯度,如图2所示
从末端开始计算,假如末端的梯度为1,然后经过回传后梯度模值放大了3~4倍
这是由于反向传播结果的数值大小不止取决于求导的式子,很大程度上也取决于输入的模值。当计算图每次输入的模值都大于1,那么经过很多层回传,梯度将不可避免地呈几何倍数增长(每次都变成3~4倍,重复上万次,想象一下310000有多大……),直到Nan。这就是梯度爆炸现象
当然反过来,如果我们每个阶段输入的模恒小于1,那么梯度也将不可避免地呈几何倍数下降(比如每次都变成原来的三分之一,重复一万次就是3-10000),直到0。这就是梯度消失现象。
由于至今神经网络都以反向传播为参数更新的基础,所以vanishing/exploding gradients问题听起来很有道理,因为这个原因所以才导致了网络越深越难训练,更不用说是测试了.然而真的是这样吗?
在ResNet[4]中作者认为,vanishing/exploding gradients问题已经很大程度上被normalized initialization[5,6,7,8]和intermediate normalization layers解决了.就比如拿intermediate normalization layers中现在CNN标配的Batch normalization(BN)[9]来说,BN的作用本质上控制每层输入的模值,因此梯度的爆炸/消失现象理应在很早就被解决了.
不是过拟合,也不是梯度消失,CNN没有遇到我们熟知的两大难题,却还是随着模型的加深而导致效果退化.
1.3 梯度相关性说
在ResNet之后无数多的论文讨论深层CNN退化的原因是什么?ResNet到底解决了什么问题?
其中,我比较喜欢[10]中的解释。
大意是神经网络越来越深的时候,反传回来的梯度之间的相关性会越来越差,最后接近白噪声。因为我们知道图像是具备局部相关性的,那其实可以认为梯度也应该具备类似的相关性,这样更新的梯度才有意义,如果梯度接近白噪声,那梯度更新可能根本就是在做随机扰动。即使BN过后梯度的模稳定在了正常范围内,但梯度的相关性实际上是随着层数增加持续衰减的。而经过证明,ResNet可以有效减少这种相关性的衰减。
有了梯度相关性这个指标之后,作者[10]分析了一系列的结构和激活函数,对于 L 层的网络来说,没有残差表示的Plain Net(普通网络)梯度相关性的衰减在 1 2 L \frac{1}{{{2^L}}} 2L1,而ResNet的衰减却只有 1 L \frac{1}{{\sqrt L }} L1 。
因此,我认为无论网络的深度浅的还是深的都有梯度相关性衰减,只是大小的问题,[10]中也有相应的实验证明,而ResNet则大大减少了这种梯度相关性的衰减,使得网络数百甚至数千层成为可能。
再次强调一下,ResNet并非解决梯度消失/爆炸问题,梯度消失/爆炸问题已经很大程度上被normalized initialization[5,6,7,8]和intermediate normalization layers解决了。
下面就是欣赏Resnet的牛逼结构的时间了。
二、深度残差学习 Deep Residual Learning
2.1 残差学习 Residual Learning
在讲之前,我先讲一下恒等映射(identity mapping),什么叫做identity mapping呢?
论文[4]中提到
There exitsts a solution by construction to the deeper model: the added layers are identity mapping , and the other layers are copide from the learned shallower model.
意思就是说可以利用identity mapping来复制浅层网络从而构建深层网络。
我们知道,随着模型的深度不断加深,模型便出现degration,怎么办?那可以不可以利用identity mapping来将浅层信息映射到深层去,从而减少这种影响呢? 所以可以认为Residual Learning的初衷,其实是让模型的内部结构至少有恒等映射的能力。以保证在堆叠网络的过程中,网络至少不会因为继续堆叠而产生退化!
因此才有了下面的经典结构如图3所示。
这种结构并没有增加额外的参数和计算复杂度,这不仅是一个很巧妙的做法,并且在对“plain”网络和残差网络进行比较时也是非常重要的,我们可以在参数、深度、宽度以及计算成本都相同的基础上对于两个网络进行公平的比较(除了可以忽略不计的元素级加法)
用数学语言描述,假设Residual Block的输入为x,则输入y等于。
其中
y
=
f
(
x
,
{
W
i
}
)
y = f\left( {x,\left\{ {{W_i}} \right\}} \right)
y=f(x,{Wi}) 是我们学习的目标,即输出输入的残差y - x,因此叫残差学习(Residual learning)
残差部分是中间有一个Relu激活的双层权重,即:
y
=
W
2
σ
(
W
1
x
)
y = {W_2}\sigma \left( {{W_1}x} \right)
y=W2σ(W1x)
其中,
σ
\sigma
σ表示Relu,而
W
1
{W_1}
W1、
W
2
{W_2}
W2表示两层的权重(为了简化公式,偏置省略了)
顺带一提,这里一个Block中必须至少包含两个层,否则就会出现很滑稽的情况
y
=
f
(
x
,
{
W
i
}
)
+
x
=
(
W
1
x
)
+
x
=
(
W
1
+
1
)
x
y = f\left( {x,\left\{ {{W_i}} \right\}} \right) + x = \left( {{W_1}x} \right) + x = \left( {{W_1} + 1} \right)x
y=f(x,{Wi})+x=(W1x)+x=(W1+1)x
这样,不就等于啥也没加吗,只不过是把原来拟合W1,变成了W1+1,
另外这种结构,作者[4]发现这不仅是对于全连接层,而且卷积层也是同样适用的。
最后,我在分析一下它为什么能够具备恒等映射的能力
从Residual Block的数学公式 y = f ( x , { W i } ) + x y = f\left( {x,\left\{ {{W_i}} \right\}} \right) + x y=f(x,{Wi})+x可以看到,我们残差学习的部分即为 f ( x , { W i } ) f\left( {x,\left\{ {{W_i}} \right\}} \right) f(x,{Wi}),它这个值假设理想情况下学习到了0,则y=x,此时即为恒等映射,那么为什么不加残差连接不具备恒等映射呢?也就是说 y = f ( x , { W i } ) y = f\left( {x,\left\{ {{W_i}} \right\}} \right) y=f(x,{Wi})不具备恒等映射?因为中间有Relu激活函数,若X小于等于0则Y等于0,显然已有的神经网络很难拟合潜在的恒等映射函数,有激活函数,会卡掉一部分输入的值。
具体哪些层是恒等层,这个会有残差网络训练的时候自己判断出来。
2.2 网络结构与维度问题
论文中原始的ResNet34与VGG的结构如上图所示,可以看到即使是当年号称“very Deep”的VGG,和最基础的Resnet在深度上相比都是个弟弟。
可能有好奇心的宝宝发现了,跳接的曲线中大部分是实现,但也有少部分虚线。这些虚线代表这些Block前后的维度不一致, 因为去掉残差结构的Plain网络还是参照了VGG经典的设计思路:每隔x层,空间(图的长度和宽度)上缩小一倍,但深度(通道数)翻倍。
维度不一致体现在两个层面:
- 空间上不一致
- 深度上不一致
如果输入和输出的维度相同时,可以直接使用恒等shortcuts (图4的实线部分)。当维度不一致时(图4的虚线部分), 需要做些操作
空间上不一致很简单,只需要在跳接的部分给输入 x x x加上一个线性映射 W s {W_{s}} Ws ,即
y = f ( x , { W i } ) + x → y = f ( x , { W i } ) + W s x y = f\left( {x,\left\{ {{W_i}} \right\}} \right) + x \to y = f\left( {x,\left\{ {{W_i}} \right\}} \right) + {W_s}x y=f(x,{Wi})+x→y=f(x,{Wi})+Wsx
其实就是利用线性代数的矩阵变化
而对于深度上的不一致,则有两种解决办法,一种是在跳接过程中加一个1*1的卷积层进行升维,另一种则是直接简单粗暴地补零。事实证明两种方法都行得通。
注:深度上和空间上维度的不一致是分开处理的,但很多人将两者混为一谈(包括目前某乎一些高赞文章),这导致了一些人在模型的实现上感到困惑。
三、实验
3.1 imageNet Classification
图5 在ImageNet上进行训练。细曲线为训练错误率,粗曲线为使用中心crop时的验证错误率。左:18和34层的plain网络。右:18 和34层的ResNets。在这个图中,残差网络和对应的plain网络相比并没有增加额外的参数。
3.2 CIFAR-10 and Analysis
图6 CIFAR-10上的训练效果。虚线表示训练错误率,实线表示测试错误率。左:plain网络。其中plain-110的错误率高达60% 以上,因此并没有展示出来。中:ResNets。右:110层和1202层的ResNets
细心的宝宝发现,Resnet1202层模型的测试结果比110层的结果要差,尽管它们的训练错误率差不多。作者[4]认为这是过拟合导致的。这样一个1202层的模型对于小的数据集来说太大了(19.4M)。若在这个数据集上应用一些强大正则化方法,效果可以获得最好, 如maxout[12]或者 dropout。
更多的实验数据可以阅读原文[4]
四、扩展内容
扩展1
shortcut connections/残差连接/skip connection/跳连接 等等都是一个东西,没有新理论,只是新的表达
扩展2
Feature Pyramid Network[5]提出了,这种跳连接相加可以实现不同分辨率特征的组合,因为浅层容易有高分辨率但是低级语义的特征,而深层的特征有高级语义,但分辨率就很低了。虽然跳接可以结合不同分辨率,但ResNet显然没有充分利用这个优点,因为每个shortcut顶多跨越一种分辨率(大部分还不会发生跨越)”。那么“如果用跳接组合更多分辨率的特征,模型的效果会不会更好?”这就是DenseNet回答我们的问题了。
reference
1、ALexNets(2012年): ImageNet Classification with Deep Convolutional Neural Networks
2、VGG(2014年): Very deep convolutional networks for large-scale image recognition
3、GoogleNet(2014年): Going Deeper with Convolutions
4、ResNets(2015年): Deep Residual Learning for Image Recognition
5、Y.LeCun,L.Bottou,G.B.Orr,andK.-R.Mu ̈ller.Efficientbackprop. In Neural Networks: Tricks of the Trade, pages 9–50. Springer, 1998.
6、X. Glorot and Y. Bengio. Understanding the difficulty of training deep feedforward neural networks. In AISTATS, 2010.
7、A. M. Saxe, J. L. McClelland, and S. Ganguli. Exact solutions to the nonlinear dynamics of learning in deep linear neural networks. arXiv:1312.6120, 2013.
8、K. He, X. Zhang, S. Ren, and J. Sun. Delving deep into rectifiers: Surpassing human-level performance on imagenet classification. In ICCV, 2015.
9、S. Ioffe and C. Szegedy. Batch normalization: Accelerating deep network training by reducing internal covariate shift. In ICML, 2015.
10、The Shattered Gradients Problem: If resnets are the answer, then what is the question?.2017
12、I. J. Goodfellow, D. Warde-Farley, M. Mirza, A. Courville, and Y. Bengio. Maxout networks. arXiv:1302.4389, 2013
13、Lin T Y , Dollár, Piotr, Girshick R , et al. Feature Pyramid Networks for Object Detection[J]. 2016.