文章目录

  • Introduction
  • Deep Residual Learning
  • Experiments


Introduction

深度卷积神经网络的好处在于其层比较多,每一层都能捕捉不同的信息。从低级的视觉特征到高级的语义特征。

但是层这么多是一件好事吗?

显然不是,随着网络层次的加深,会出现梯度爆炸与梯度消失。

常见的解决方案是好的初始化或者加入BN层。

然而,虽然做了这些操作之后,模型收敛了,但是精度却下降了。这也不是过拟合造成的,因为训练误差和测试误差都上升了。如下图所示。

resnext优点 resnet 优点_数据


进一步思考:按理来说,如果我浅层网络性能比较好的话,深层网络的性能不应该下降的。因为至少可以让新加的层成为一个identity mapping(恒等映射)。但是,简单的SGD是做不到的。

因此,该文章提出了deep residual learning framework,保证网络的性能不会随着深度的增加而变差,这相当于显式地构造出一个identity mapping。

resnext优点 resnet 优点_深度学习_02


核心思想:假设模型的输出是resnext优点 resnet 优点_深度学习_03,但是我不让模型直接学resnext优点 resnet 优点_深度学习_03,而是去学习resnext优点 resnet 优点_数据_05,我我们记为resnext优点 resnet 优点_人工智能_06。最后的输出就是resnext优点 resnet 优点_人工智能_07。我们将resnext优点 resnet 优点_人工智能_06称为残差。直观地来讲,就是不要去学习怎么得到H(x),而是去学习已经学习到的东西和真实的东西之间的残差。

优势在于:模型复杂度不会提升;计算量不会增加。

通过实验证明:plain版本效果差一些(没有residual/shortcut connection);随着深度的增加,性能也会提升。

Deep Residual Learning

resnext优点 resnet 优点_resnext优点_09

resnext优点 resnet 优点_机器学习_10


上图是四个版本的ResNet的结构。可以看到50layer及以上的版本和18、34的版本的结构有所差别,这是因为随着网络层数的加深,我们希望通道数能增加,因为深度意味着可以学到更多的东西,但考虑到随之带来的参数量的增加,所以构造一个bottleneck的结构,通过1x1卷积实现通道的压缩与恢复。

模型中采用了BN层、数据增广来提升模型的泛化性能,但是没有用dropout,因为不包含全连接层。

那么残差连接如何处理输入输出形状不同的情况呢?

第一个方案是在输入和输出上分别添加一些额外的0,使得两者的形状能够对应起来;
第二个方案是用1x1卷积进行投影。

Experiments

resnext优点 resnet 优点_机器学习_11


这个图展示的是18和34版本在有无residual connection的区别。指的说明的有:

  1. 最开始训练误差要比测试误差大,这是数据增强导致的结果;
  2. 每一次突然的下降都是因为学习率的降低。现在一般不采用乘0.1的手段,因为时机难以掌握,乘得太早会导致后期收敛无力;
  3. 这个实验说明的是有残差连接后收敛速度快了、性能也相对更好了;

为什么ResNet训练起来速度快?

梯度消失的原因是因为随着网络的加深,链式法则将很多非常小的数相乘,使得梯度下降法减去一个近乎为0的值,当然,要是陷入了局部最优的位置,都不用深层网络,梯度就很容易消失;

但是ResNet的话,好处在于在原有基础上加了一个浅层网络的梯度,这样深层的梯度虽然小了,但是浅层的还是比较大的,所以从数学上来看,梯度不会轻易消失。

所谓的模型复杂度降低了不是说不能够表示别的东西了,而是能够找到一个不那么复杂的模型去拟合数据,就如作者所说,不加残差连接的时候,理论上也能够学出一个有一个identity的东西(不要后面的东西),但是实际上做不到,因为没有引导整个网络这么走的话,其实理论上的结果它根本过不去,所以一定是得手动的把这个结果加进去,使得它更容易训练出一个简单的模型来拟合数据的情况下,等价于把模型的复杂度降低了。