深度学习笔记(5)——学术界的霸主Resnet

前言

在当今学术界的论文里,几个baseline网络LeNet、AlexNet、VGGNet、GoogLeNet、ResNet都是大家用的多的CNN网络。其中LeNet、AlexNet、VGGNet这三个都是很古老的CNN线性网络,属于新手喜欢用的VGG like 网络,这些网络结构简单,从输入到输出一条路走到黑,所以工业界对这些网络都有很有效的加速优化,但是在学术界却因为泛化能力有限近年逐渐被淘汰。而支路化的GoogleNet曾经流行过一时,但是很快被性能更加优越的ResNet取代,并且ResNet及其增强版ResNext自诞生以来已经霸占学术圈两年。但是ResNet因为结构复杂的原因所以资源消耗的特别多,但是学术界更加关注性能而不是速度,所以ResNet在学术界依然无可取代。在昨天结束的CVPR2017中清华大学的DenseNet获得best paper,也希望作者能够尽快release源码和模型,让DenseNet成为一个新的baseline选择。

当然ResNet在工业界并不像学术界那样地位不可撼动,Face++的ShuffleNet,Google的mobileNet都是性能不差的小模型,甚至有些产品中宁愿使用VGG like的网络也不愿意使用ResNet,因为对于产品而言速度是一个非常重要的指标。

因为有幸和ResNet的通讯作者孙剑老师一起工作,所以也问了他当时怎么想出ResNet这个如此有创造力的idea,不过孙剑老师很谦虚地说其实还是尝试出来的,至于这个idea为什么work的原因也是论文出来了之后补充了一个非官方不敢写到论文里的解释,这个我之后介绍到相应点的时候再说明。

残差块(Residual Block)

Resnet整个网络的成功点就是在于应用了残差块,其实现也非常简单。原始输入x经过一个conv-relu-conv组合层,输出一个F(x),然后把这个输出和原始输出做一个加法(elewise-add),即H(x)=F(x)+x,如下图所示。所以残差块和原始的CNN网络唯一的区别就是原始输入经过一个identity**函数(叫做恒等映射,即y=x)叠加到卷积输出上,这个支路叫做shortcut连接。


深度学习笔记(5)——学术界的霸主Resnet
要想实现Resnet并不难,Resnet就是反复堆叠residual block而已,难点在于为什么如此简单的一个改动却能带来如此巨大的性能提升,所以接下来我们来理解为什么残差会有用,当然连作者们都特别谦虚,我也更加不敢肯定自己理解的是没有错误的。

残差块为什么有用

  • 首先给出目前学术界比较官方一点的说法。Resnet的出发点是认为深层网络不应该比浅层网络性能差,所以为了防止网络退化,引入了大量identity恒等映射,这样就可以把原始信息流入更深的层,抑制了信息的退化。

  • 这里我要再想一下。。。待补

  • 孙剑老师说残差块有用是因为identity这一支路的导数是1,所以可以把深层的loss很好的保留传递给浅层,因为神经网络一个很大的问题就是梯度链式法则带来的梯度弥散。

  • 有篇论文认为残差网络就是大量的不同长度的神经网络组成的组合函数。(Christian Szegedy, Sergey Ioffe, and Vincent Vanhoucke. Inception-v4, inception-resnet and the impact of residual connections on learning. arXiv preprint arXiv:1602.07261, 2016)

  • 还有网友认为残差块就是一个差分放大器。

Resnet一些有趣的地方

Resnet中有一些很有趣的地方,有些是已经被证明有趣的结论,有些就和原理一样扑朔迷离,一切都可以用四个字概括:实验表明。

  • Block中间一层卷积层没用,至少需要两层卷积层。这个结论在何凯明的报告里有提到。

  • Shortcut支路就只能是identity恒等映射,用其他映射效果都不如identity。下图是作者们花式测试各种shortcut


    深度学习笔记(5)——学术界的霸主Resnet

  • 张祥雨本人提到,残差块最有用的地方就是identity,只要有identity,主路上的卷积层随便怎么变都没什么大影响。这一点后来也得到了验证,大量Resnet的变体不管怎么变,只有这个identity雷打不动。

  • 在进入残差之前,会有两次feature map尺寸的减半,使得224×224的feature map变成56×56。这一点也没什么道理解释,张祥雨后来在Face++设计了大量的网络,都是56×56进入残差,可能这就是信仰吧。

  • Resnet通过拆解卷积核,来降低计算量,增加深度。如下图,3×3的卷积核被拆分成两个1×1的卷积核,当然这不是完全等价的,完全等价的应该是拆分成3×11×3的卷积核,不过1×1计算量更少。另外通过两个1×1可以控制feature map的channel数,先把channel降下来,再升回去,这样又进一步降低了运算量。


    深度学习笔记(5)——学术界的霸主Resnet

Resnet

最后给出Resnet完整结构图和ImageNet的结果,只要加几行代码就可以拿ImageNet冠军,顶礼膜拜。


深度学习笔记(5)——学术界的霸主Resnet

结构和计算复杂度,FLOPs是指浮点计算数,用于衡量计算复杂度,Resnet目前还算是非常耗时的网络,因为没有采用group convolution和channel-wise convolution。


深度学习笔记(5)——学术界的霸主Resnet

ImageNet结果
深度学习笔记(5)——学术界的霸主Resnet