resnet 论文
问题:深度的神经网络很难训练
解决方法:我们通过残差学习网络,训练更深的网络,实验显示深度残差网络很容易收敛并且通过加深网络更容易提升准确率。
问题由来:
网络的深度对于计算机视觉任务非常重要,很多事实证明更深的网络能获得更好的效果。
但是训练很深的网络并不容易,原因如下:
1、梯度消失:这个问题通过normalized initialization和Batch normalization,使得网络能够通过sgd反向传播算法进行训练。
2、degradation退化问题:当网络深度增加时,准确率接近饱和,然后迅速退化。退化并不是由于过拟合造成,增加更多的层去训练更深的网络会导致更高的训练误差。
解决问题的想法:
1、但是如果所增加的层都是一样的,都是浅层模型的复制,那么深度的模型不应该产生更高的训练误差,但是这样的方法很难实现。
2、在这片文章中通过deep residual learning net来解决退化问题。
与其让一些层直接学习输入的特征,还不如学习残差映射。我们使得非线性层学习残差表示:f(x) = H(x) - x,我们希望这样更容易收敛。在非常极端的情况下,如果是恒等映射,那么非线性层的权重应该是0.
网络实现:通过shortcut connnection 来实现,既没有增加参数,也没有增加计算复杂度,网络仍然能通过SGD反向传播实现。
但是需要注意的是输入输出的维度必须相等。如果不维度不同怎么办?下面会解释。
F可以是任意数量的层,但是不能是一层(近似于线性)。
结果:
与plant net相比较,1、resnet更加容易收敛,但是plain net训练误差会随着网络的加深而增大。2、随着网络的加深,resnet通过增加深度,准确率获得提高。
下表是参数数量的比较:
下图是plain net和resnet随着迭代次数的增加误差的比较,可以看出resnet随着网络的加深误差会降低,并且与plain net相比前期收敛速度较快。
下表是plain net和resnet错误率的比较。
最后来看重点怎样解决输入输出维度不同的问题:
通常有三种选择:A、补0 B、对增加的维度使用projection shortcut C、对所有的维度使用projection shortcut
下表是对三种方法结果的对比
但是为了不增加复杂度,我们采用了如下的deeper bottleneck architecture结构。
非常明显通过1x1卷积层巧妙地改变输入输出维度。