文章目录
- Introduction
- Deep Residual Learning
- Experiments
Introduction
深度卷积神经网络的好处在于其层比较多,每一层都能捕捉不同的信息。从低级的视觉特征到高级的语义特征。
但是层这么多是一件好事吗?
显然不是,随着网络层次的加深,会出现梯度爆炸与梯度消失。
常见的解决方案是好的初始化或者加入BN层。
然而,虽然做了这些操作之后,模型收敛了,但是精度却下降了。这也不是过拟合造成的,因为训练误差和测试误差都上升了。如下图所示。
进一步思考:按理来说,如果我浅层网络性能比较好的话,深层网络的性能不应该下降的。因为至少可以让新加的层成为一个identity mapping(恒等映射)。但是,简单的SGD是做不到的。
因此,该文章提出了deep residual learning framework,保证网络的性能不会随着深度的增加而变差,这相当于显式地构造出一个identity mapping。
核心思想:假设模型的输出是,但是我不让模型直接学,而是去学习,我我们记为。最后的输出就是。我们将称为残差。直观地来讲,就是不要去学习怎么得到H(x),而是去学习已经学习到的东西和真实的东西之间的残差。
优势在于:模型复杂度不会提升;计算量不会增加。
通过实验证明:plain版本效果差一些(没有residual/shortcut connection);随着深度的增加,性能也会提升。
Deep Residual Learning
上图是四个版本的ResNet的结构。可以看到50layer及以上的版本和18、34的版本的结构有所差别,这是因为随着网络层数的加深,我们希望通道数能增加,因为深度意味着可以学到更多的东西,但考虑到随之带来的参数量的增加,所以构造一个bottleneck的结构,通过1x1卷积实现通道的压缩与恢复。
模型中采用了BN层、数据增广来提升模型的泛化性能,但是没有用dropout,因为不包含全连接层。
那么残差连接如何处理输入输出形状不同的情况呢?
第一个方案是在输入和输出上分别添加一些额外的0,使得两者的形状能够对应起来;
第二个方案是用1x1卷积进行投影。
Experiments
这个图展示的是18和34版本在有无residual connection的区别。指的说明的有:
- 最开始训练误差要比测试误差大,这是数据增强导致的结果;
- 每一次突然的下降都是因为学习率的降低。现在一般不采用乘0.1的手段,因为时机难以掌握,乘得太早会导致后期收敛无力;
- 这个实验说明的是有残差连接后收敛速度快了、性能也相对更好了;
为什么ResNet训练起来速度快?
梯度消失的原因是因为随着网络的加深,链式法则将很多非常小的数相乘,使得梯度下降法减去一个近乎为0的值,当然,要是陷入了局部最优的位置,都不用深层网络,梯度就很容易消失;
但是ResNet的话,好处在于在原有基础上加了一个浅层网络的梯度,这样深层的梯度虽然小了,但是浅层的还是比较大的,所以从数学上来看,梯度不会轻易消失。
所谓的模型复杂度降低了不是说不能够表示别的东西了,而是能够找到一个不那么复杂的模型去拟合数据,就如作者所说,不加残差连接的时候,理论上也能够学出一个有一个identity的东西(不要后面的东西),但是实际上做不到,因为没有引导整个网络这么走的话,其实理论上的结果它根本过不去,所以一定是得手动的把这个结果加进去,使得它更容易训练出一个简单的模型来拟合数据的情况下,等价于把模型的复杂度降低了。