ILSVRC15 夺冠神器,ResNet论文阅读

论文地址:https://arxiv.org/pdf/1512.03385.pdf
作为ILSVRC15年的冠军,Kaiming大神一贯落实着不发则已,一发惊人的论文生产准则。最近静下心来仔细研究一下这篇论文,个人认为Kaiming是一个很看重问题本质的学者,他发的论文都会从问题的最本质的原因入手,比如Focal loss的提出、Faster RCNN的加速点、Mask RCNN的突破性创新等等。
ResNet也不例外,今天静下心来好好读一下这篇文章,想一想究竟为什么ResNet会起作用。
从LeNet开始,深度学习网络就朝着不断加深,越来越复杂的方向前进,从AlexNet,到VGGNet,到GoogLeNet(Inception)。但是随着网络越来越深,大家发现一个问题,当达到了一定深度之后,模型开始出现训练困难,甚至不升反降的现象。
关于训练困难的问题,一定程度上可以通过归一化来解决,比如BN。这种方式通过消除层于层之间的偏移,也就是各层的输出不均衡问题来加速训练和收敛。但是仍然解决不了训练退化,也就是随着网络加深,训练效果不升反降的问题。
而这篇文章通过引入“残差模块”,来有效的解决了训练退化的问题。残差模块,简单来说,就是将希望预测的值H(x),转变为输入x加一个残差函数F(x),即H(x)=F(x)+x。比如我现在想要预测一辆车的长度,这辆车的长度是4.8m,网络某一层的输入是4.5m,传统的做法是,经过一系列的卷积、非线性变换之后,得到一个输出,这个输出就是4.8m。那么残差模块希望的是通过同样的网络结构,得到一个(4.8-4.5)=0.3m的输出,这个输出是输入与真实值之间的“残差”,或者理解为bias、offset我觉得都是没有问题的。但是可能读到这里,会有疑问,同样是卷积操作+非线性变换,为什么输出残差就要比输出最终的值要好呢?(这也是一个非常核心和关键的问题所在)
先说一下这个公式H(x)=F(x)+x,F(x)的输出,与x输入之间,是要大于等于两层的,否则文章指出就相当于是给x加了一个线性层,相当于是H(x)=Wx+x。不论隔了几层,因为并没有引入新的参数,因此也就不存在新的计算消耗。因为要加在一起,所以F(x)和x应该是同样维度的,也就是要求 channel数相同,如果不相同,给x做一个卷积操作H(x)=F(x)+Wx,将x维度变换到与F(x)相同即可。如果相同,直接相加就可以了。
文章的实验给出了18层和34层的卷积网络,分别不加和加了残差模块的结果。结果证明加入残差模块后,退化问题得到了解决,并且横向对比也可以看出残差模块可以显著加速收敛。
中间和右图分别是没有加残差模块,和加了残差模块的34层网络结构,18层的就是采用了34层结构的前18层子结构。虚线连线表示维度需要进行改变,实线则是直接把原来的输入x加到后面的输出。
文章给出的Plain结构最深的就是34层,那么如何加深网络结构呢,文章使用了“bottleneck”结构,也就是下图的结构,将Plain中的两层,替换为一个三层网络,先降维再升维。34层的结构中,除去第一层卷积和最后一层全连接,每两层都有残差结构,替换为三层的残差结构,得到一个2+(32/2)*3=50层的网络。
左边是Plain中的两层残差结构,右图是替换为三层的Bottleneck结构
在50层的基础上,在网络的后面再增加三层的Bottleneck残差结构,分别可以得到101层(增加27个三层Bottleneck)和152层(增加54个三层Bottleneck)。这些深层的网络都没有出现训练退化的现象,随着网络加深,训练效果都在提升。
加入残差结构,34层及更深的错误率对比
所以其实文章看到最后,都没有明确指出为什么残差结构能够解决退化的问题,大部分是给出的猜测。这里参考了https://www.jianshu.com/p/ca6bee9eb888的回答:
1、首先就是反向传播的过程中,残差模块对于数据的波动更加敏感。对于公式H(x)=F(x)+x,还是以车辆长度为例,假设车辆真实长度为4.6m,输入x为4m,而使用Plain结构的网络输出为4.3m,两个数相差不过(4.6-4.3)/4.6=7%左右。但是采用了残差结构,期望的输出应该是4.6-4=0.6m,而网络的输出就是4.3-4=0.3m,两个数差了100%。在计算梯度的时候,这完全是两个概念,所以说残差模块对于微小的波动更加敏感。
2、再就是论文里,和这篇文章提到的,残差模块去求解本征映射的优化难度要低很多。个人理解是,忽略掉数据之间的相同点,重点关注数据之间的不同点,可以有效降低数据冗余。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值