CNN架构之ResNet
CNN架构之ResNet
ResNet在2015年的ImageNet大规模视觉识别竞赛(ImageNet Large Scale Visual Recognition Challenge, ILSVRC)中获得了图像分类和物体识别的优胜,名声大噪。在此之前,AlexNet——2012年ImageNet的获胜者,这个模型仅有8个卷积层的深度学习,后来的VGG网络有16乃至19层,GoogleNet有22层,而ResNet 有152层。随着模型变得越来越深,Top-5的错误率也越来越低,目前降到了3.5%附近,而在同样的ImageNet数据集合上,人眼的辨识错误率大概在5.1%,也就是目前的Deep Learning模型的识别能力已经超过了人眼。本文就来详细地分析一下ResNet这个里程碑式的架构。
1. 深层网络退化问题
我们都知道,网络越深,我们能提取到的特征越丰富,而且直观地来看近几年神经网络的发展,从一开始的8层到现在的几千层,貌似确实验证了深度越深,表现越好;但如果只是叠加深度,就会出现梯度弥散或梯度爆炸现象,我们之前讲到BN层可以解决这个问题,然而,尽管它可以收敛了,网络性能却还是退化了。
如图所示,这是56层和20层网络在训练集和测试集上的错误率,单看右图来说,我们可以解释为,56层的网络的网络可能是产生了过拟合,所以在测试集上的错误率要大一点,但是我们再看左图就发现,即使在训练集上,56层的表现依然没有20层好,这就说明,它不是产生了过拟合。
从原理上来说其实56层网络的解空间是包括了20层网络的解空间的,换而言之,56层网络取得的性能应该大于等于20层网络的性能的。但是从训练的迭代过程来看,56层的网络无论从训练误差来看还是测试误差来看,误差都大于20层的网络。导致这个原因就是虽然56层网络的解空间包含了20层网络的解空间,但是我们在训练网络用的是随机梯度下降策略,往往解到的不是全局最优解,而是局部的最优解,显而易见56层网络的解空间更加的复杂,所以导致使用随机梯度下降算法无法解到最优解。
2. ResNet架构
为了解决上述问题,ResNet提出了一种新的理念:如果将深层网络的后面若干层学习成恒等映射H(x)=x ,那么模型就退化成浅层网络。但是直接去学习这个恒等映射是很困难的,那么就换一种方式,把网络设计成:
其中H(x)是某一层原始的的期望映射输出,x是输入;它使用了一种连接方式叫做“shortcut connection”,顾名思义,shortcut就是“抄近道”的意思
这样,只要使F(x)=0,就是实现恒等映射了(这是理想情况,实际上我们只能让它无限趋近于0),为什么做这样的变化会简单呢?
我们现在假设,在网络达到某一个深度的时候,已经达到最优状态了,也就是说,此时的错误率是最低的时候,再往下加深网络的化就会出现退化问题(错误率上升的问题)。那我们现在要更新下一层网络的权值就会变得很麻烦,权值得是一个让下一层网络同样也是最优状态才行。
但是采用残差网络就能很好的解决这个问题。还是假设当前网络的深度能够使得错误率最低,如果继续增加深度,为了保证下一层的网络状态仍然是最优状态,我们只需要把令F(x)=0就好了。因为x是当前输出的最优解,采用ResNet的话,只用小小的更新F(x)部分的权重值就可以,不用像一般的卷积层一样大动干戈!
ResNet的整体架构如下图所示
3. ResNet计算细节
1)残差块有二层,如下表达式,
其中σ代表非线性函数ReLU,
然后通过一个shortcut,和第2个ReLU,获得输出y
- shortcut同等维度映射,F(x)与x相加就是就是逐元素相加
- 如果两者维度不同,需要给x执行一个线性映射来匹配维度
实验证明,这个残差块往往需要两层以上,单单一层的残差块并不能起到提升作用
2)我们观察到,在它的结构图中有实线有虚线,这个是ResNet网络的设计规则:对于残差网络,维度匹配的shortcut连接为实线,反之为虚线;维度不匹配时,同等映射有两种可选方案:
- 直接通过zero padding 来增加维度(channel)。
- 乘以W矩阵投影到新的空间。实现是用1x1卷积实现的,直接改变1x1卷积的filters数目。这种会增加参数。
如上图所示,我们截取了一部分,可以看到的”实线“和”虚线“两种连接方式,
实线的Connection部分(注意是第一个紫色矩形和第三个紫色矩形,因为x指的是第二个紫色矩形的输入,即第一个紫色矩形的输出)都是执行3x3x64的卷积,他们的channel个数一致,所以采用计算方式:
虚线的的Connection部分分别是3x3x64和3x3x128的卷积操作,他们的channel个数不同(64和128),所以采用计算方式:
其中W是卷积操作(用128个(3x3)x64的filter),用来调整x的channel维度的
3)把普通网络变成ResNet的方法就是加上跳跃连接,每两层增加一个捷径,构成一个残差块;关于更多的计算细节,在知乎上看到了一个解释,这里直接上截图
4. 后续发展
后来,作者进一步在小的CIFAR10数据集上尝试了更深的Resnet网络,其深度最多达到了1202层。不过却发现分类性能开始有了一定下降。作者分析认为可能是层数过多,导致模型过于复杂,而CIFAR-10较小的数据集造成了它的过拟合
总的来说,通过现阶段的学习,对ResNet的设计理念和基本框架有了一个基础的认知,但是里面需要搞清楚的细节还有很多,本文只是总结了它相对于之前网络的改进思路,而之前出现的每一个网络都有它独特的设计点,比如GoogLeNet的Inception。之后随着学习的深入,会及时修正和补充这篇文章。
最后屯一篇好文——[大话CNN经典模型:GoogLeNet(从Inception v1到v4的演进)]
本文地址:https://blog.csdn.net/weixin_45268911/article/details/107423917
上一篇: 数据结构PTA 案例7-1.5 与零交换
推荐阅读
-
jQuery 2.0.3 源码分析之core(一)整体架构
-
MySQL架构构成之物理文件组成
-
SpringCloud-微服务架构之浅尝辄止
-
NopCommerce架构分析之(四)基于路由实现灵活的插件机制
-
NopCommerce架构分析之(三)EntityFramework数据库初试化及数据操作
-
NopCommerce架构分析之(五)Model绑定Action参数
-
NopCommerce架构分析之(六)自定义RazorViewEngine和WebViewPage
-
NopCommerce架构分析之(八)多语言支持
-
NopCommerce架构分析之(七)主题Theme皮肤管理器
-
详解SpringCloud微服务架构之Hystrix断路器