Training and investigating Residual Nets
Introduction
ResNet的核心想法是很简单明了的。本质上是使用一个标准的前向卷积网络,然后加入跳跃连接来绕过一些卷积层。每次捷连都是一个残差模块,卷积层本质上是预测一个残差然后加到模块的输入上。
残差模块的图示如下:
深度前向卷积网络受困于优化的难度。当网络超过一定的深度,加入额外的层会导致更高的train error和更高的val error,即使使用了BN。ResNet的作者讨论说欠拟合不太可能是由于梯度消失引起的,因为已经加入了BN了。残差网络结构是通过添加捷连来解决这个问题的。
Ablation studies (on CIFAR-10)
Effects of model depth. 原文图6简单地就网络深度进行了一系列实验,我们也在CIFAR-10上进行了基本的复现,结果与原文相似。
Residual block architecture.
在我们基本复现了原文结果后,我们开始思考略微不同的残差模块的影响,例如:
- 将BN放在addition之后会不会更好? 如果BN放在addition之后,那么它会norm整个模块的输出。这个可能是有益的。但是,这会强制使每个捷连来对输出进行扰动。这就会有问题:在很多信息流通道里,数据会在没有任何处理的情况下经过多个连续的BN层。每个BN层会对该层的数据分布进行distortion,这会搅和原始输入。这对于模型来说会引入有害的影响:就实验结果而言,将BN放在addition之后会严重影响在CIFAR上的test error。
- 上述结果告诉我们非常重要的一点就是,避免改变恒等连接中的数据流。对于这个原则我们再向前探究一步:残差模块最后的ReLU层可以去掉吗? ReLU层其实也对恒等映射的数据流进行了扰动,但是不同于BN,ReLU有幂等性,也就是不管数据经过多少个ReLU都和经过一个ReLU的结果一样。当我们移除模块最后的ReLU,我们发现了在test的表现上有了少许提升。但是,这个效果是很细微的,需要更多后续的探究。
Alternate optimizers. 在尝试调整超参的时候,通常会尝试使用更加fancy的优化方法取代替带momentum的SGD。带有细微假设的更加复杂的优化方法,虽然可以加快训练,但是对于训练如此深的网络来说还是很有难度的。在实验中我们使用了RMSprop,Adadelta和Adagrad来与原文中使用的SGD+momentum进行对比。往往更加复杂的优化方法会在一开始更快的收敛,但是到最后SGD+momentum会比第二好的优化方法取得还低0.7%的test error。
Solver | Testing error |
---|---|
Nsize=18, Original parper:Nesterov,1e-1 | 0.0697 |
Nsize=18, Best RMSprop (LR 1e-2) | 0.0768 |
Nsize=18, Adadelta | 0.0888 |
Nsize=18, Best Adagrad (LR 1e-1) | 0.1145 |
Training at a larger scale: ImageNet
我们在ImageNet分类数据集上,我们训练了ResNet 18,34,50和101。值得注意的是,我们使用不同的data augmentation方法得到了比原文更高的准确率。
我们使用了论文"Going Deeper with Convolutions"(GoogleNet)中的scale和aspect ratio的增广方法而不是原文中的。在ResNet-34中,top-1 error提高了1.2%。还使用了"Some Improvements on Deep Convolutional Neural Network Based Image Classification"中的颜色增广,但是效果很微小。
Model changes
我们将BN层从模块的最后一层卷积之后移到了addition之后。我们也实验了将步长2的下采样从瓶颈模块的第一个1x1卷积移动到了3x3卷积(ResNet-50和ResNet-101)。
Model | Batch Norm | Stride-two layer | Top-1 single-crop err(%) |
---|---|---|---|
ResNet-18 | after conv | 3x3 | 30.6 |
ResNet-18 | after add | 3x3 | 30.4 |
ResNet-34 | after conv | 3x3 | 26.9 |
ResNet-34 | after add | 3x3 | 27.0 |
ResNet-50 | after conv | 3x3 | 24.5 |
ResNet-50 | after add | 1x1 | 24.5 |
ResNet-50 | after add | 3x3 | 24.2 |
Conclusion
本篇博客在ResNet的基础上对于模型选择,优化方法以及工程优化进行了一系列的探索。该篇的结果略优于ResNet原文,他们开放了训练代码和预训练模型,很多后续使用ResNet的文章都使用了本篇的实现。