Notes on ResNet

这篇博文是博主读过何恺明及其团队的论文Deep Residual Learning for Image Recognition所做的总结,如有错误,欢迎指正!

人们主观的认为更深层的神经网络可以更好的拟合训练数据,因为深层网络会有更多的参数来学习更多的细节。但随着神经网络层数的增加,在执行反向传播的过程中很容易遇到梯度爆炸或消失的问题,从而使学习效率降低甚至不收敛。该类问题可以通过合理的初始化参数(He and Xavier Initialization)以及消除内部协变量漂移(BatchNormalization)得到妥善的解决。

然而,即便深层的神经网络开始收敛,文章中又提出了网络退化的问题(degradation):网络层数增加,准确率开始饱和,训练误差增大。下图比较了20层和56层网络的训练何测试误差,可以看出56层网络有更高的训练和测试误差。
Notes on ResNet
但是我们可以通过在20层网络中增加36层恒等映射层(identity mapping)来构造一个和20层网络具有相同性能的56层网络,而通过直接训练56层网络却达不到这种效果。说明深层网络并不善于学习恒等映射。为了解决这一问题,ResNet 利用shortcut connection直接将输入恒等映射到输出层并和输出相加,如下图所示:
Notes on ResNet
假设堆叠的这几层网络(通常为2到3层)要学习的映射为H(x),在引入shortcut connection后,H(x) = F(x) + x, F(x) = H(x) - x. 所以堆叠的这几层网络现在要学习的映射为F(x),也就是输入和输出之间的残差。我们称图二为一个残差块。残差网络就是将多个残差块堆叠到一起所构成的深层网络。

为什么要学习残差而不是学习原本的映射呢?基于论文假设:优化残差要比优化原本的映射简单一些。事实上,如果在深层网络中确实有那么几层恒等映射是最优解,这时候只需将残差置零即可。这比用几层非线性网络来学习这个恒等映射要方便的多。在实际操作中,恒等映射可能不是最优解,但是残差学习可以看作是对原问题的预处理。如果最优解接近恒等映射,那么学习一个恒等映射的扰动会比学习一个未知映射简单得多。

通过构建ResNet,何恺明团队解决了网络退化问题,超深层(152层)的ResNet使得训练误差和测试误差都大大降低,并一举拿下了2015年ILSVRC挑战赛的第一名。

我们通过下图来剖析一下ResNet的架构:
Notes on ResNet
在实际操作中,残差块有两种不同的形式,我们分别称之为恒等块和卷积块。恒等块可以用该等式表达:y = F (x, {Wi }) + x. 其中 x 和 y 分别为残差块的输入和输出。可以看出,恒等块并没有引入多余的参数和计算复杂度,但是要求残差F和输入x的维度必须一致。当维度不一致时,我们需要对x做线性变换Ws。也就是:y = F (x, {Wi }) + Ws x. 需要指出恒等映射在实验中已经可以解决网络退化问题并且经济实用,所以Ws只在需要维度变换的时候使用。

在图三所示的34层ResNet中(最右),实线表示恒等映射,虚线表示需要卷积映射来匹配维度(feature和channel 维度)。卷积映射是通过1x1卷积实现的。

论文中对比了18层和34层普通网络(plain network)以及对应的ResNet,通过将他们分别在ImageNet数据集上训练,等到以下结果:
Notes on ResNet
可以看出,ResNet很好的解决了网络退化问题,34层的ResNet性能也得到显著提升,并且ResNet在前期收敛的更快。

论文中也分析了更深层的ResNet的性能,有兴趣的同学可以去读一读论文,该论文为2015年CVPR最佳论文。