ResNet论文精读——如何撑起CV的半边天?

博文创作起因

        回首过去几个月在深度学习上的钻研,大致了解了部分领域的发展历程,但总觉得有些细节还不太掌握,现尝试精度论文,希望可以一篇篇学习作者们的完整研究过程,将知识充分地内化于心。

        这篇博文可能适合对神经网络有一定了解,想要跟博主一样更深入探索自己不明白的地方,或者想要学习一些CV论文写作技巧的同学。当然如果ddl将至,急切想要恶补各种相关的、不相关的知识(博主就经常试图短时间阅读大量博文来完成某些task),也可以简单浏览。

        首先选择ResNet,作为第一篇精度文章,可以先学习到很多写作技巧和知识,例如论文第一页右上角就摆上清晰的图,这张图通常与文章中心是密切相关的。

读ResNet首感(Abstract and Intro)

        摘要与平常接触的论文目的相同,非常简单地介绍解决的问题、问题的前提和效果。随后的Intro是摘要的扩充版本,更细致地讲述了文章提出的问题的主要解决思路。

        第一张图就说明了该论文想要解决的问题:现有的模型层数增加并不能得到模型损失的持续下降,并且这还不是我们熟悉的过拟合导致的,因为训练损失也没有下降

        在逐渐提出自己的方法前,作者简述了现有的卷积办法“the added layers are identity mapping”,也就是恒等映射,通过恒等映射上一层的输入来实现堆叠。通过这段叙述,我们其实可以知道作者想要做出改进的方向了。果然作者提出了自己的方法:

        “ Instead of hoping each few stacked layers directly fit a desired underlying mapping, we explicitly let these layers fit a residual mapping.”抛弃直接映射到一个值并堆叠的做法,而是将这些层去映射到一个残差值。也就是说,输出的结果值加上最开始的输入值再传到下一个残差块。这样就保证了至少模型原本学到的东西不会丢失,解决了中心问题。

        摆上了这张经典的残差块示意图,并且说明了这个方法首先提出于该作者另一篇文章,以及这种架构由于非常简单、没有其他参数产生,复杂度是没有增加的。

        随后说明了提出的架构使用起来比起一些往常模型的其他进步之处有的模型损失虽然收敛,但收敛的值非常高,ResNet没有这样的情况;它可以很快的提高准确率,效果比往常的模型更好。

        在之后就是Related Work,讲述了所有作为基础的理念:VLAD、Multigrid method(多重网格法)、Shortcut Connections。他们名称和应用领域各不相同,但本质的东西是一致的,充分利用残差。

        阅读了整个Related Work后,可以清楚虽然Resnet如此重要,但他的核心理念严格来说并不是原创的,甚至它在二三十年前的机器学习领域就已经十分火热。研究新的idea不容易做到,有时候能运用已经拥有的技术来解决当下的问题,站在巨人的肩膀上,也是一种很好的方法

ResNet论文主干

        其实看到这里,基本上可以完整理解作者做的事了。论文后面是更将详细的介绍以及实现过程。

y(x) = F(x, \{W_{i}\}) + x

        以上是输入层和输出层维度相同时应用的公式,当维度不同时,也可以根据下面的公式加以调整,但实验中对于这里具体的操作,作者放在了下文解释。

y(x) = F(x, \{W_{i}\}) + W_{s}x

模型整体架构

        然后就是具体的实验架构了,为了控制变量,每一层的尺寸都有合理调整来尽量统一复杂度,来对比VGG、PlainNet(不用残差块)和ResNet的效果。

        实验的模型架构从这张图可以清晰得到,比起Plain,ResNet只是多了使用到了残差块这一步(由于残差块没有增加参数和复杂度,控制变量的事迎刃而解)。

        然后是讲述增强训练的一些细节,将图片随机裁剪、缩放,应用BN来归一化数值,学习率0.1(遇到plateaus变为0.01),使用SGD作为梯度更新算法,一个batch有256个数据,以及通过scratch来初始化参数。论文的一个重要目标是ImageNet比赛,因此作者在训练时图像的缩放用了多个尺寸{224, 256, 384, 480, 640}以提高精度。

        之后是论文实验的各层结构,包括了清晰的图表和对应的文字解释。

实验结果

        论文很精彩,差点忘记ResNet是体现在统一架构不同层数上的区别了,表格展示,实验分别做了18、34、50、101、152层(50、101、152层用了BottleNeck架构),得到的结果是PlainNet层数越大,损失反而比变高,而提出的ResNet损失保持降低。

        这里的损失之所以一段时间后断崖式下降,就是因为前面提到的plateau设计(学习率遇到plateaus变为0.01)。

        对比了同个架构不同层数模型的差异,然后是不同模型架构的比较(其中A、B、C表示处理残差块输入输出尺寸不同的解决方法,分别为用0填充、尺寸不同时1*1投影映射和不论尺寸是否相同都投影映射)。可以看到相比VGG、GoogleNet精确度进步非常之大,大大提高了论文的吸引度。

        这里可以看到A、B、C在精确度上是逐渐增高的,但论文后续的实验作者使用的是B方案,因为考虑到了1*1卷积计算的成本,相对C到B的提升效果来看还是比较昂贵。

bottleneck结构

        当深度逐渐加深、维度不断变大时时(论文中指50及以上的层数),作者设计了一个bottleneck的架构,将输入数据经过1*1卷积缩小通道数,在最后再继续1*1卷积放大通道数,使得理论复杂度大大减少。

        这里只是理论复杂度在减小,但我们实际应用可能无法得到很理想的效果,还是需要客观看待。

应用于CIFAR-10

        另外,作者还在CIFAR-10数据集上进行了实验,结果一样ResNet的效果随着层数增加而变好,并且精确度也比Plain得到提升。最后作者省去了结论和讨论的文章结构,而是展示了ResNet在目标检测上的成果。

        整篇论文到这里就精读完了,它在数学原理上解释的比较少,更多的内容花在实验设计和结果的展示上。其实残差块起作用的原因是可以通过梯度传播的数学公式来展开解释,对这一部分感兴趣的同学可以参考我下方的李沐视频,视频末尾有指出数学原理。

        虽然现在来看过程还是比较简单,但简单的架构能得到如此好的结果,以至于被广泛应用于图像分类、目标检测和语义分割等计算机视觉任务中,还是十分令人膜拜的。

论文地址

https://arxiv.org/pdf/1512.03385.pdf

参考链接

https://www.bilibili.com/video/BV1P3411y7nn

https://www.bilibili.com/video/BV1P3411y7nn

https://www.bilibili.com/video/BV17y4y1g76q

https://blog.csdn.net/Tink1995/article/details/105080033

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值