Deep Residual Learning for Image Recognition
ResNet
文章目录
摘要
随着神经网络的深度越来越深,是越来越难训练的。为解决这一问题,我们提出了一个残差学习框架来减轻更深的网络的训练压力,并且更容易去做网络的优化,随着网络深度的增加,准确率可以获得提升。
1 介绍
神经网络可以加很多层把网络变得很深,然后不同程度的层可以得到不同等级的feature。问题背景:
随着网络越来越深,会出现梯度爆炸或消失
- 解决方法有:1、权重的初始化做的更好。2、在中间加入一些normalization,包括BN(batch normalization)可以使得校验每个层之间的那些输出和他的梯度的均值和方差相对来说比较深的网络是可以训练的,避免有一些层特别大,有一些层特别小。使用了这些技术之后是能够训练(能够收敛),虽然现在能够收敛了,但是当网络变深的时候,性能其实是变差的(精度会变差)
深度增加,训练的精度变差
- 考虑一个网络和其对应的更深的版本(在浅的网络基础上多加一些层),如果浅的网络的效果不差的话,深的网络的效果应当是不应该变差的:深的网络新加的那些层,总是可以把这些层学习的变成一个identity mapping(输入是x,输出也是x,等价于可以把一些权重学成比如说简单的n分之一,是的输入和输出是一一对应的)但是实际情况是,虽然理论上权重是可以学习成这样,但是实际上做不到。如下图左侧所示
- 文章提出出现精度变差的问题并不是由于层数过多,模型复杂导致了过拟合,而是因为训练误差(training error)变大了。
- 这篇文章提出显式地构造出一个identity mapping,使得深层的神经网络不会变的比相对较浅的神经网络更差,将其称为deep residual learning framework。如下图右侧所示:
2 相关工作
- 残差表示:Residual Representation
- 捷径连接:Shortcut Connection
3 模型(Deep Residual Learning)
如图所示为一个block的结构,其基本思想如下:浅层网络的输出为x,要学习的目标值为H(x),那么就让该层网络学习一个残差目标值F(x) = H(x) - x,最后的输出为F(x) + x。
- 训练更快:梯度上保持较好,不会因为层数变深梯度一直做乘法而变得极小
- 对于深层网络来说,只是加了一个东西进来,没有任何可以学的参数,不会增加任何的模型复杂度,也不会使计算变得更加复杂
3.1 残差连接处理输入和输出形状不同的情况
- 第一个方案是补0,使得形状相同
- 第二个方案是利用卷积进行投影
- 实验中还用到了第三个方案就是所有的连接全做投影:就算输入输出的形状相同。该方案的结果是最好的但是由于更为庞大的计算量并不推荐使用。
4 实验
上表给出了在ImageNet上使用到的5个版本的ResNet的信息
-
conv2_x:其中的[]表示一个block块,代表残差链接的基本单位
-
flops:整个网络要计算多少个浮点数运算。卷积层的浮点运算等价于输入的高乘以宽乘以通道数乘以输出通道数再乘以核的窗口的高和宽
4.1 构建更深的ResNet(bottleneck design)
对应上表中的后三列使用的block。
- 维度越大,所需的模型更深,使用左侧的结构会导致计算复杂度成平方关系增加,因此用右侧的结构代替。
- 等价于先对特征维度降一次维,在降一次维的上面再做一个空间上的东西,然后再投影回去
4.2 一些实验结果
同样的网络架构,使用残差链接(ResNet)后随着深度的增加error下降。
不同版本的model的对比,A、B、C分别对应前文提到的使用不同的残差连接处理输入和输出形状不同情况的方法
原文链接:https://openaccess.thecvf.com/content_cvpr_2016/papers/He_Deep_Residual_Learning_CVPR_2016_paper.pdf