Deep Residual Network学习(一)

来源:互联网 发布:乐清市知临学校招聘 编辑:程序博客网 时间:2024/06/07 18:42
回顾去年的DCNN成果和深度学习发展,就必然会提及到到Kaiming He的深度残差网络 (arxiv.org/abs/1512.0338)。这不仅是因为ResNet一举拿到了CV下多个比赛项目的冠军,更重要的是这一结构解决了训练极深网络时的degradation问题。作为我来到MSRA第一个月重点学习的论文,现在在这里分享一下我这大半个月以来的学习成果。

1.论文解读


He首先提出一个问题:Is learning better networks as easy as stacking more layers?回答这个问题的一个障碍在于一个著名的问题:梯度消失/爆炸,然而这个障碍可以通过合理的初始化和其他一些技术来解决,接下来看一张图:


这是我在论文结果复现时在CIfar10上复现的训练过程图,plain-20代表不含残差结构的纯粹的20层的网络结构,很明显可以看出随着网络深度增加,performance却在下降。He将这一现象称为degradation,亦即随着网络深度的增加,准确度饱和并且迅速减少。这一问题广泛存在于深层的网络结构中,例如VGG的论文中也观察到这一现象。degradation表明不是所有的系统都能很容易地被优化。

接下来,He提出了深度残差学习的概念来解决这一问题。首先我们假设我们要求的映射是H(x),通过上面的观察我们意识到直接求得H(x)并不那么容易,所以我们转而去求H(x)的残差形式F(x)=H(x)-x,假设求F(x)的过程比H(x)要简单,这样,通过F(x)+x我们就可以达到我们的目标,简单来说就是下面这幅图,我们将这个结构称之为一个residual block。


相信很多人都会对第二个假设有疑惑,也就是为什么F(x)比H(x)更容易求得,关于这一点,论文中也没有明确解释。但是根据后面的实验结果确实可以得到这一个结论。

“Our deep residual nets can easily enjoy accuracy gains from greatly increased depth, producing results substantially better than previous networks.”

这里放上Kaiming大神论文中的一句话,大家自行感受即可...

2.网络结构

接下来让我们关注一下ResNet的网络结构:


PlainNet结构主要基于VGG修改而得到,接下来我们重点关注ResNet结构。可以发现,主要结构与PlainNet一致,只是多了许多shortCut连接,可以发现,通过shortcut,整个ResNet就可以看成是许多个residual block堆叠而成。这里值得注意的是虚线部分,虚线部分均处于维度增加部分,亦即卷积核数目倍增的过程,这时进行F(x)+x就会出现二者维度不匹配,这里论文中采用两种方法解决这一问题(其实是三种,但通过实验发现第三种方法会使performance急剧下降,故不采用):

A.zero_padding:对恒等层进行0填充的方式将维度补充完整。这种方法不会增加额外的参数

B.projection:在恒等层采用1x1的卷积核来增加维度。这种方法会增加额外的参数

3.结果复现

暂时还没有在ImageNet上复现ResNet结果,因为太耗时了喂,听师兄说152层的ResNet在ImageNet12上要跑一个月:(,等以后有时间在尝试吧。接下来的部分均是ResNet在Cifar10上的复现结果,所有的实验都是在caffe上完成的。


依据论文中结构,所有的卷积核都是3x3的,依据上表总共是6n+2层,n代表residual block的数目。注意:在论文中cifar10上对所有的恒等层均采用A方法,但由于caffe暂时不支持zero_padding,所以在本文中结果均采用B方法。A方法我最终也进行了复现,但这需要向caffe中添加新层,留待下次再写吧。

数据预处理部分论文中采取对图像各边扩展4个pixels的方式,亦即将32x32图像扩展成40x40的图像,训练时再随机crop一个32x32的部分进行训练,但这里暂时没有进行这个操作,因为刚开始对CV的很多操作还不是很熟悉,所以采取了原始的32x32的图像截取28x28图像的方式。

接下来就是一些训练参数的设置了,如下:

weight_decay=0.0001
momentum=0.9
batch_size=100
learning_rate=0.1,0.01/40k,0.001/80k
max_iter=100k

接下来就是实验的结果图了:



先是PlainNet,下面一张是限制y轴取值后得到的细节图片,很明显可以看出degradation问题:随着网络层数的增加,accuracy不增反降



接下来就是万众瞩目的ResNet了,上面的那张图可能不太清楚,可以看一下下面的细节图,这时候可以明显看出residual block的威力了,解决了degradation的问题,这样我们可以充分享受深度深度带来的perfomance的提升!

下面放一张我前期所有实验所得到的结果表:


PlainNet明显显现出degradation的问题,下面我们重点看ResNet,这里我实验了三种初始化方法,第一种是均值为0,标准差为0.01的高斯分布,第二种是论文中所使用的初始化方法,亦即msra方法(arxiv.org/abs/1502.0185),第三种就是xavier了,可以看出:

1.对三种初始化方法,随着深度增加,accuracy均得到提升
2.msra的初始化方法能达到最佳甚至超过论文中的结果

4.分析与后续

一.首先是前面提到的,在这里的复现并没有使用pixel padding的数据增强方法,却达到了接近甚至超过论文中结果的performance,难道是源于我们在恒等层使用了B方法而论文中使用了A方法吗?答案是yes,后续会有进一步分析验证。

二.网络结构中采用了batch normalization,这个层的作用是什么?从上述可以看出,msra初始化方法要由于其他两种,为什么?这些都会在后续给出分析

三.后面还将给出另一篇文章的解读(arxiv.org/abs/1603.0502),实验其中的pre-activation和bottleneck结构

四.由于caffe结构限制,即使采用了多GPU,最终也只实验到164层的网络,对于上千层的网络则实在是没办法跑起来,希望有成功复现的人能给一点建议,感激不尽!

最后:部分代码和网络结构以及Model已经分享在github上,github.com/fish145/ResN


ResNet在cifar10上完美复现结果见这一篇:Deep Residual Network学习(二)

3 0
原创粉丝点击