一、背景介绍
随着层数的堆叠,网络的深度会不断增加,特征的level
也会提升,很多CV方向的任务也因此取得更好的成绩。但是,一个问题随之出现:通过层数堆叠不断加深网络的同时,可以学习到更好的网络吗?答案是否定的,梯度消失/爆炸是最大的阻碍。不过随着normalized initialization
和Batch normalizaiton
的应用,很大程度上已经解决了这个问题。
但是退化问题(degradation
)依然没有解决:随着网络的加深,网络的精度会饱和,甚至会下降。这也不是过拟合,因为随着深度增加,训练误差会上升。退化问题显然是不符合常理的,举个例子,假设我们现在有一个浅层网络,以及一个在它的基础上无脑堆叠了一些恒等映射(identity mapping
, F ( x ) = x F(x) = x F(x)=x)的深度网络,那么对于同一输入后者的训练误差不会比前者更差。而实际上当时已有网络的效果却比不上它。换句话说就是,从某一层开始,我对输入什么都不处理,都比你花里胡哨地加一堆东西强。
这反映出的问题是:已有的神经网络或许因为非线性层的原因难以拟合恒等映射。因此,可以认为Residual Learning的初衷,其实是让模型的内部结构至少有恒等映射的能力。以保证在堆叠网络的过程中,网络至少不会因为继续堆叠而产生退化!
二、思路提出
在作者们研究了前人的工作如VLAD
、highway network
之后,发现residual representations
和shortcut connection
这两种理论的效果不错,鉴于此提出了Deep Residual Learning
的概念:既然没办法拟合恒等映射,那就改为拟合残差,而且拟合残差更容易优化。
原本神经网络的目的是拟合一个输入到输出的未知映射 H ( x ) H(x) H(x),现在重构 H ( x ) = F ( x ) + x H(x) = F(x) + x H(x)=F(x)+x,那么现在实质上就是要学习残差函数 F ( x ) = H ( x ) − x F(x) = H(x) - x F(x)=H(x)−x,即输入减输出。如果真的需要拟合恒等映射,那么只需要将各层的权重置零,从而使得残差为零即可。
实现方案如图所示,这是ResNet
的核心架构shortcut connecion
,在激活函数之前将前几层的输入与本层的输出相加,用公式表示就是: y = F ( x , { W i } ) + x y = F(x, \left\{ W_i\right\}) + x y=F(x,{
Wi})+x。 F ( x , { W i } ) F(x, \left\{ W_i\right\}) F(x,{
Wi})可以是全连接,也就是卷积层。像图上这样有两层的Residual Block
,应该表示为:
F = W 2 σ ( W 1 x ) F = W_2\sigma(W_1x) F=W2σ(W1x)
其中, σ