一文弄懂Resnet

解读

作为在2015年ImageNet比赛分类任务中的冠军,Resnet在目标分割,检测,识别等大展拳脚,更是直接影响了学术界和工业界发展方向。如此厉害的论文,那就站在巨人的肩膀上研究其好在哪里吧。

核心:提出残差块思想(去掉相同主体部分,突出微小变化)

一文弄懂Resnet

图上弯曲的线是跳层连接(shortcut connection),也就是论文说的identity mapping,曲线之外部分叫residual mapping。输出结果 H(x)=F(x) +x,x是输入shortcut连接,H是输出,F(x)就是残差部分(当然在论文中具体使用比这复杂)。


在详细说残差之前,先说下深度对网络的影响,也就是残差出现的由来。

我们都知道,当网络的层数较少时,卷积并不能很好的提取出特征向量,top错误率也就下不来。很自然的,大家都想到了加深网络,当网络的层数越多,能提取到的特征也就越丰富,语义信息越好。

然而简单增加深度,会导致梯度消失/爆炸问题,尽管使用了例如

归一化,dropout等弥补措施,可也导致了网络的退化,深度越深准确率却在下降,看下图:

一文弄懂Resnet

可以明显看到随着网络层数增加,error反而更大。为了解决这个问题,作者提出了残差思想并通过实验去验证它。

残差的本质是随着网络层度增加,我们要让网络不会变坏,作者认为残差让网络获得了更好性能(实际上残差有没有获得更好性能,这个真不好说,也可能是网络更深得到了更好的特征信息,但至少可以确定残差使网络不在退化)。

♂ 我们来先来看下残差网络的原理(此图来源于网络)

一文弄懂Resnet

嗯……原理部分推导估计大家也并不想细看,总结一下就是在求导时多加1,➕1好处就是梯度不会消失(求导不为0),这样残差就可以更容易学习,下面举个栗子F(x)残差到底怎么做。

  • F是求和前网络映射,H是从输入到求和后的网络映射(输出)。
  • 比如把10映射到10.1,
  • 引入残差前是F'(10)=10.1,
  • 引入残差后是H(10)=10.1, H(10)=F(10)+10, F(10)=0.1。
  • F'和F都表示网络参数映射,引入残差后的映射对输出的变化更敏感。比如原来是从10.1到10.2,映射F'的输出增加了1/101=1%,而对于残差结构从10.1到10.2,映射F是从0.1到0.2,增加了100%。后者输出变化对权重的调整作用更大,自然效果更好。

♀ 在看下残差实际效果,也就是实验部分。

一文弄懂Resnet


一文弄懂Resnet

从这这两幅图可以清楚看到,更深的网络错误率越低。


论文中实际使用的残差结构

一文弄懂Resnet

实验证明残差块需要两层以上才能起到提升。左图一般用于resnet-34以下,右图用在50,101这种深度。

目的一目了然,就是为了降低参数的数目,第一个1x1的卷积把256维channel降到64维,然后在最后通过1x1卷积恢复,参数数目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,不使用(左图)就是两个3x3x256的卷积,参数数目: 3x3x256x256x2 = 1179648,差了16.94倍。

还有一个问题,论文中在做残差时会遇到通道数不一致问题,如下图。

一文弄懂Resnet

虚线部分,通道数不一致。解决办法是什么呢?作者通过给 x 调整维度实现,具体计算公式:y = F(x) + Wx, W是卷积操作。

具体结构图

一文弄懂Resnet

从18到152层,最常用的是50和101。这里层数是指卷积或者全连接层,而激活层或者Pooling层没有计算在内。

在实验细节方面,作者讲述的不多(超参数设定见论文)。不过网上有大神实现了其代码,Ryan Dahl 使用tensorflow实现,如下图。

一文弄懂Resnet

图片一目了然,网络就是N个此图的叠加,不在做过多解释。


实验结果对比

一文弄懂Resnet

很明显可以看到随着网络加深,性能越来越好。但是一味加深深度,误差同样也会再次变大。作者在Cifar-10上做实验进行了证明,至于原因作者认为是网络过深,发生了过拟合


总结

Resnet的出现,颠覆了以往网络结构的设计、网络的深度总是受到梯度影响。而残差的出现使网络的深度不在受到限制并且能够保证性能。如果要说缺点的话,尽管用了1*1来减少参数量,但是网络深度依然决定其参数量还是大,所以对硬件要求比较高……


公众号解读先行一步「深度学习框架点滴」

我是休柏,向阳花开。


分享到:


相關文章: