按照ResNet论文的思路流程对论文进行了总结
Resnet论文大体思路如下:
阐述事实:网络深度对网络模型性能至关重要,一般来说,深度越深,性能越好
提出疑问:是否可以通过不断增加网络深度来提升模型性能?
分析问题:不断加深网络会遇到两个问题:梯度消失/梯度爆炸 和 网络退化
提出解决方法:梯度消失/梯度爆炸前人的研究很多了,也可以很好的缓解这个问题。论文主要解决网络退化问题,使用残差结构。
实验验证:在各大数据集的挑战上验证了自己方案的可行性。
一、网络深度的重要性
网络深度对模型的性能至关重要,网络的深度会直接影响模型的性能。在下图ImageNet图像分类大赛历年冠军模型深度发展图也能印证这一观点。
从12年AlexNet在ImageNet上大放异彩到2015的ResNet。模型的错误率越来越低,性能越来越好。同时网络的深度也从8层增加到152层。引用论文中的一句话来解释网络深度为何能提升模型性能“the “levels” of features can be enriched by the number of stacked layers (depth)”。作者认为增加网络层可以丰富特征的层次化表示,从而提升模型的性能。特征的层次化表示如下图
二、通过增加深度来提升模型性能的障碍
既然增加网络深度可以提升性能,是不是可以通过不断的加深网络来得到更好性能的模型呢?答案肯定是否定的。论文中举出来在加深网络时会遇到两个障碍:
梯度消失/梯度爆炸:不断加深网络容易出现梯度消失或梯度爆炸问题,从而导致在优化时无法收敛。
网络退化:当网络不断加深,模型性能会不断提升,但达到一个合适的深度后,继续加深网络模型性能会急剧下降。作者将这个问题称之为“网络退化”问题。
关于梯度消失/梯度爆炸已经有很多研究并提出了许多缓解梯度消失/爆炸的方案。论文主要着重解决网络退化问题。
1、梯度消失/梯度爆炸。
以下分别从模型角度和激活函数角度分析梯度消失和梯度爆炸出现的原因,以及如何避免出现梯度消失和梯度爆炸问题
1)梯度消失/梯度爆炸出现的原因
- 模型角度
在反向传播优化模型时。根据链式求导法则,到参数w1的梯度值将是一个连乘操作。考虑一个简单的网络结构,每层只有一个神经元。
其可用以下公式表达:
y对w1求梯度可表示为
其结果是一个连乘操作,每增加一层,反向求梯度时连乘就要增加一项。一般激活函数的导数'
属于[0,1]。当wi值较大时,
大于1。反之
小于1。假设每层增加的项没p,网络总层数为n。
当每层的梯度项小于1,连乘结果后趋于0,导致梯度消失问题;每层梯度项大于1,连乘后结果趋于无穷,导致梯度爆炸问题。虽然网络层数n不可能趋于无穷。但增加网络层还是会增加梯度消失/梯度爆炸的风险。
- 激活函数角度
不合适的激活函数也会导致梯度消失问题,如sigmodi激活函数。其函数曲线下图所示。
其导数曲线如下:
在上面对w1的求导公式可看到,梯度反向传播,每经过一层都要乘一次激活函数的导数。而sigmoid的导数最大才为0.25。多次连乘导致梯度值越来越小,直至消失。
2)梯度消失/梯度爆炸的缓解方法
对应于导致该问题两个方面原因,提出相应的缓解方法
模型层面
- 参数w合理的初始化,如使用正太截断初始化方式等。避免w值过大或过小。
- 使用Batch Normlization层
- 旁路连接的结构设计,
- 在优化模型时,加上梯度截断操作避免出现梯度爆炸。就是使用min(x,1)将梯度强制拉回[0,1]区间。
激活函数层面:
- 使用ReLU代替sigmoid激活函数
2、网络退化
作者首先观察到理论与实验结果矛盾,来分析可能存在的问题,之后分析问题并给出了解决方案。最后在各大数据集取得很好的实验结果证明其方法是非常有效的。
发现问题:
矛盾的理论与实验结果:
理论:在一个深度合适的网络后增加几层得到一个较深的网络模型。此时存在一个可能性是增加的这几层的函数映射是恒等映射y=x。则此时这两个网络模型的完全等同。也就是说一个更深的网络至少可以得到和较浅网络相等的性能,或是更好的性能。
实验结果:但实验数据却展示了截然不同的结果,当网络不断加深,模型性能会不断提升,但达到一个合适的深度后,继续加深网络模型性能会急剧下降。如下图,增加网络深度反而得到了更大的训练误差。
分析问题:根据上面的理论分析:如果较深网络中增加的几层学习了恒等映射y=x。则更深的网络应该至少得到与较浅网络一样的训练误差,甚至是更低的训练误差。对应于上图就是理论上56层的网络中后36层如果都学习到恒等映射y=x,则应该能得到至少与20层一样的训练误差。相反的实验结果反映了一个问题:在优化时模型难以学习恒等映射y=x。
解决方案:既然模型难以学习恒等映射,作者设计另一种结构,将恒等映射y=x通过旁路传递过去,只让网络层学习残差映射。例如网络原本要学习的映射函数为H(x)。残杀映射是H(x)-x。这样设计的原因是作者认为这样的结构设计模型更容易去学习恒等映射y=x,只需要将残差置0即可。从而解决网络退化问题。残差模块如下
三、ResNet网络结构设计与Keras实现
1、整体网络结构设计
ResNet-34的网络结构参照了VGG的设计规则:
1)特征图尺寸相同的网络层,其特征图的通道数相等
2)特征图尺寸减半,则特征数翻倍,来保证每层的复杂度相同
图像过长,只截取部分如下图:
可以看到,Resnet block有实线连接和虚线连接。
实线的旁路连接表示x与残差学习得到的F(x)通道数相同,直接使用element-wise的方式按对应位置相加即可
虚线的连接表示x与F(x)的通道数不同,不通的情况下都是x的通道数少于F(x)。有两种解决方式
- 直接补0,使得x的通道数和F(x)的通道数的相同,在进行相加的操作。该方式的优点是没有增加额外的参数
- 使用1x1卷积。回增加额外的参数
2、keras实现
待补充