Deep Residual Learning for Image Recognition
摘要:
1.较深的神经网络难以训练
2.本文定义使用了残差块,并且证明使用残差块有利于网络收敛,使用152层的残差网络,能够提升精度,并且是vgg19的8倍那么深,并且具有更低的复杂性(计算出来的):
FLOPS与参数量的计算如下:
参数量:等于输入feature map的大小乘通道乘输出的通道,因为有多少个输出就要多少个神经元,+1代表是Bias也就是偏置。
FLOPS:输出feature map大小乘参数量,因为输出feature map中的每一个元素都需要计算一次,计算一次就需要用到整个参数量
3.我们使用残差网络,获得了ILSVRC2015的冠军,并在cifar10上尝试了100层和1000层(这里的100和1000指的是什么?网络吗)
4.深度残差网络是十分重要的,我们在2015coco数据集上得到了百分之28的相对提升呢个,并且在imagenet的检测,定位,coco的检测与分割上获得了冠军(coco2015,ILSVRC2015)
介绍:
1.较深的网络在很多视觉任务上都起到了很大的作用
2.但是随着网络的加深,梯度消失和梯度爆炸的问题就会显现出来
3.通过归一化,初始化[23, 9, 37, 13]的和中间层的归一化[16]可以使数10层的网络开始拟合
4.随着网络的加深,准确率会出现饱和,并且随后出现急剧下降,并且这不是由于过拟合导致的(什么叫准确率饱和?)
5.加一些层到相对合适的模型中会导致更高的训练错误率,并且也被我们实验验证了如下图所示
56层的plain网络比20层的plain网络训练错误率,和验证错误率都更高,并且在Imagenet上也验证了,如图4所示
`
Imagenet:
1我们在imagenet上展示了,我们深度残差网络更容易优化,而且plain net随着层数的增加会有高的错误率
2我们的残差网络可以随着深度的增加,精度也增加,而且比之前的网络都要深
cifar10:
我们的数据不仅适用于某一特定的数据集,我们在cifar10上实现了100层和1000层的残差网络
比vgg的模型复杂度还低
最后我们赢得了2015年很多比赛的第一名:证明了残差网络的泛化能力很好
总结:skip connection是之前提出来的,它的skip connection跟之前的区别在哪里?
相关工作:
1.残差是传统方法中提出来的,作者从中发现,用残差能够更好的优化
2.short connection也是早有提出,highway network使用shot connection 和门函数,它们的参数不是免费,而我们的残差网络的shot connection是免费的(为什么?),而且highway netrwork上升到100层并没有获得精度上的提升
深度残差学习:
F(x)=H(x)-x
original function = F(x)+x ,这就构成了残差映射
1.如果所加的这些层能够被重建为恒等映射,则更深的网络不应该比浅的网络错误率高(为什么?因为恒等映射不会降低准确率)
2.退化问题显示了通过多层非线性层来逼近恒等映射是比较困难的。
3.利用残差学习来重构,如果恒等映射是最优的,则求解器可以简单地将多个非线性层的权重朝向零驱动以接近身份映射。(不懂??)
4.在实际情况下,恒等映射不太可能是最优的,但我们的重新制定可能有助于预先解决问题。 如果恒等函数更接近于恒等映射而不是零映射,则解算器应该更容易参考身份映射来查找扰动,而不是将该函数作为新映射来学习。 我们通过实验(图7)表明,学习的残差函数通常具有较小的响应,这表明恒等映射提供了合理的预处理。(???通过图7可以看出来学习到的响应确实比较小,所以可以证明残差学习,确实学习较小的响应)
通过shotrcuts来恒等映射
y = F(x, {W i }) + x.
F = W 2 σ(W 1 x)代表的是两层非线性层来构成F(x)
然后逐像素相加
如果F和x通道不匹配,可以再加一个ws来匹配通道(我的理解应该是通过1x1卷积来匹配维度)
y = F(x, {W i }) + W s x.
残差函数F的形式是灵活的。 本文中的实验涉及具有两层或三层的函数F(图5),而更多层是可能的。 但是,如果F只有一层,则方程(1)类似于线性层:y = W 1 x + x,对此我们没有观察到优势。(为什么一层残差块是没优势的??)
总结特点:
1.可以防止退化问题(随着神经网络的加深,训练集的准确率也会下降)
解决:随着网络的加深,网络至少不会比浅层的网络准确率低,有一些层是冗余的层,会自动学习恒等映射,但是由于H(x)=x这种恒等映射在数学上可能是一个比较难学习,但是如果可以学习H(x) = F(x)+x会相对容易学习一点,比如学习H(5)=5,和学习H(5)=F(5)+5,F(5)只需要等于0即可,即权重更倾向于学习较小的,由于初始化使用的权重值较小,所以更容易优化(不是很能接受这一种解释)
2.防止梯度消失:
用以下公式可以推出可以一定程度上防止梯度消失
Network Architectures:
构建plain net的原则:
1对于相同池化层之前的滤波器有相同的channel
2对于不同池化层的滤波器的channel的是池化之前两倍
3.最后是接一个global pooling再加一个全连接层,后面接一个softmax
模型具有更低的复杂度和更少的filters(为什么?明明filter多啊)
Resdual netwrok:
1.当维度相同时可以直接使用short connection相加
2.当维度不同的时,可以使用0pad,或者使用1x1卷积使维度相同
3.对于两个size不同的feature map使用了stride==2的操作(为什么?是接了池化了吗?)
Implementation:
数据增强方法:
1.用短边来进行尺度增强[256, 480]
2.224x224的裁剪或者水平翻转,减像素均值
训练参数设置:
1.每个卷积层后面使用BN
2.从头开始初始化权重,用SGD和256的batchsize
3.当错误率趋于平稳时,学习率除10
4.使用0.0001的权重衰减,和0.9的动量加速
在测试中,对于比较研究,我们采用标准的10crop测试[21]。 为了获得最佳结果,我们采用[41,13]中的完全卷积形式,并在多个尺度上平均得分(图像被调整大小,使得短边在{224,256,384,480,640})(没懂)
Experienment:
1.为了观察为什么18层的plainnet比34层的效果差,它可视化了训练的错误率和验证集的错误率
2.我们使用了BN,所以不可能是梯度消失或者梯度爆炸问题,那可能就是退化问题
3.我们推测,plain网络有指数级较低的拟合率,所以会产生退化问题,这个原因在未来将被研究
1.我们加入了残差模块,从表2可以看出来,加入残差块后的34层plain网络,有更低的训练和验证的错误率,证明残差块解决了退化问题。
最后:
我们观察到18层的palin网络有可以比较的准确率,但是18层的残差网络拟合更快,当网络不是特别深的时候,sgd还是能够找到最优的解,但是残差块能够帮助更快的优化
Identity vs. Projection Shortcuts:
三种shotcut选择:
1.填0feature map来增加维度,参数是free的
2.当维度不够的时候,使用1x1卷积来增加维度,够的时候直接使用Identity mapping直接映射
3.所有的都shortcut都用projection(这个是怎么弄的?)(这个参数量很大,为什么?)
我们发现所有的shotcut都使用1x1的卷积并不是必要的(这里是这个意思吗??)并不是必要的,如下图所示
将buiding block改为 Deeper Bottleneck Architectures:
接下来,我们将为ImageNet描述更深层次的网络。 由于担心我们能够承受的训练时间,我们将构建块修改。 对于每个残差函数F,我们使用3层而不是2层的堆叠层(图5)。 三层是1×1,3×3和1×1卷积,其中1×1层负责减小然后增加(恢复)尺寸,使3×3层成为具有较小输入/输出尺寸的瓶颈。 图5示出了一个示例,其中两种设计具有相似的时间复杂度。
res50:用bottleneck替代34层resnet的2层结构,得到了resnet50
res101和res152:是用更多的3层bottlenetck,然而res15计算复杂度仍然低于vgg16/19.
在表4中,我们与之前的最佳单模型结果进行了比较。我们的baseline34层ResNets已经达到了极具竞争力的精度。 我们的152层ResNet的单模型前5验证误差为4.49%。 该单模型结果优于所有先前的整体结果(表5)。 我们将六个不同深度的模型组合成一个整体(在提交时只有两个152层)。这导致测试集上的前5个误差为3.57%(表5)。这个条目获得第一名 在ILSVRC 2015中。
CIFAR-10 and Analysis:
32x32大小的feature map用1+2n个卷积层
feature map数,也就是神经元数也就是滤波器数,16,32,64(为什么设这么多,vgg16也是2倍2倍的往上加)
我们使用0.0001的权重衰减和0.9的动量,并采用[13]和BN [16]中的权重初始化但没有失活。 这些型号在两个GPU上进行了小批量128的训练。 我们从学习率0.1开始,在32k和48k迭代时将其除以10,并在64k迭代时终止训练,这是在45k / 5k列车/ val分裂上确定的。 我们遵循[24]中用于训练的简单数据增强:每侧填充4个像素,并且从填充图像或其水平翻转中随机采样32×32裁剪。 为了测试,我们仅评估原始32×32图像的单个视图(pad也是一种增强方法,其次学习率是趋于平坦后开始降吗?)
训练策略:对于训练110层的resnet,发现并不能收敛,先用较小的学习率,然后用较大的学习率进行调
图7显示了层响应的标准偏差(std)。 响应是每个3×3层的输出,在BN之后和其他非线性之前(ReLU /加法)。 对于ResNets,该分析揭示了残差函数的响应强度。 图7示出ResNets通常具有比其普通对应物更小的响应。 这些结果支持我们的基本动机(Sec.3.1),残差函数通常可能比非残差函数更接近零。 我们还注意到,更深层次的ResNet具有更小的响应幅度,如图7中ResNet-20,56和110之间的比较所证明的。当存在更多层时,单个ResNets层倾向于更少地修改信号。(这个响应是什么意思?大概看懂了细节没看懂)
1202层网络:
应用在这个训练集上---cifar10(5w万张训练图片),训练错误虽然和110层的差不多,但是测试集的错误率上升了,作者怀疑可能是过拟合的原因(可以使用maxout/dropout等防止过拟合的方法,)作者没有过多的去研究,如果有更有效的正则化方法,可能会有更好的结果,这个作者在未来会研究,
Object Detection on PASCAL and MS COCO:
表7和表8展示了目标检测的一些基本结果,我们使用Faster-RCNN结构,但是将vgg16换成了resnet101,最终结果得到提升,尤其是在coco数据集上,提升了百分之6.8,这是一个相对百分之28的提升,基于残差网络我们赢得了ILSVRC和COCO2015,imagenet检测,imagenet定位,和coco检测还有coco分割的第一名。