Press "Enter" to skip to content

经典模型——ResNet

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

文章目录

 

Introduction

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

核心思想:假设模型的输出是 H ( x ) H(x) H ( x ) ,但是我不让模型直接学 H ( x ) H(x) H ( x ) ,而是去学习 H ( x ) − x H(x)-x H ( x ) − x ,我我们记为 F ( x ) F(x) F ( x ) 。最后的输出就是 F ( x ) + x F(x)+x F ( x ) + x 。我们将 F ( x ) F(x) F ( x ) 称为残差。直观地来讲,就是不要去学习怎幺得到H(x),而是去学习已经学习到的东西和真实的东西之间的残差。

 

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

 

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

 

Deep Residual Learning

 

 

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

 

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

 

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

 

第一个方案是在输入和输出上分别添加一些额外的0,使得两者的形状能够对应起来;

 

第二个方案是用1×1卷积进行投影。

 

Experiments

 

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

 

 

    1. 最开始训练误差要比测试误差大,这是数据增强导致的结果;

 

    1. 每一次突然的下降都是因为学习率的降低。现在一般不采用乘0.1的手段,因为时机难以掌握,乘得太早会导致后期收敛无力;

 

    1. 这个实验说明的是有残差连接后收敛速度快了、性能也相对更好了;

 

 

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

 

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

 

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

 

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

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。