ResNet主要解决了网络退化以及梯度消失/爆炸这两个主要问题,使得网络可以通过加深提高准确率~

深度卷积网络自然的整合了低中高不同层次的特征,特征的层次可以靠加深网络的层次来丰富。从而,在构建卷积网络时,网络的深度越高,可抽取的特征层次就越丰富。所以一般我们会倾向于使用更深层次的网络结构,以便取得更高层次的特征。但是在使用深层次的网络结构时我们会遇到两个问题,梯度消失/爆炸问题和网络退化的问题。

  • 当使用更深层的网络时,会发生梯度消失/爆炸问题,这个问题很大程度通过标准的初始化和正则化层来基本解决,这样可以确保几十层的网络能够收敛,但是随着网络层数的增加,梯度消失或者爆炸的问题仍然存在。

  • 还有一个问题就是网络的退化,如下图所示,假设已经有了一个最优化的网络结构(图左),是8层。当我们设计网络结构的时候,我们并不知道具体多少层次的网络时最优化的网络结构,假设设计了14层网络结构(图右)。那么多出来的6层其实是冗余的,我们希望训练网络的过程中,模型能够自己训练这6层(红色方框)为恒等映射,也就是经过这层时的输入与输出完全一样。但是往往模型很难将这6层恒等映射的参数学习正确,那么就一定会不比最优化的8层网络结构性能好,这就是随着网络深度增加,模型会产生退化现象。它不是由过拟合产生的,而是由冗余的网络层学习了不是恒等映射的参数造成的。

ResNet简介

ResNet是在2015年有何凯明,张翔宇,任少卿,孙剑共同提出的,ResNet使用了一个新的思想,ResNet的思想是假设我们涉及一个网络层,存在最优化的网络层次,那么往往我们设计的深层次网络是有很多网络层为冗余层的。那么我们希望这些冗余层能够完成恒等映射,保证经过该恒等层的输入和输出完全相同。具体哪些层是恒等层,这个会有网络训练的时候自己判断出来。将原网络的几层改成一个残差块,残差块的具体构造如下图所示:

可以看到X是这一层残差块的输入,也称作F(x)为残差,x为输入值,F(X)是经过第一层线性变化并激活后的输出,该图表示在残差网络中,第二层进行线性变化之后激活之前,F(x)加入了这一层输入值X,然后再进行激活后输出。在第二层输出值激活前加入X,这条路径称作shortcut连接。

ResNet解决深度网络瓶颈的魔力

  • 网络退化问题的解决:

我们发现,假设该层是冗余的,在引入ResNet之前,我们想让该层学习到的参数能够满足h(x)=x,即输入是x,经过该冗余层后,输出仍然为x。但是可以看见,要想学习h(x)=x恒等映射时的这层参数时比较困难的。ResNet想到避免去学习该层恒等映射的参数,使用了如上图的结构,让h(x)=F(x)+x;这里的F(x)我们称作残差项,我们发现,要想让该冗余层能够恒等映射,我们只需要学习F(x)=0。学习F(x)=0比学习h(x)=x要简单,因为一般每层网络中的参数初始化偏向于0,这样在相比于更新该网络层的参数来学习h(x)=x,该冗余层学习F(x)=0的更新参数能够更快收敛,如图所示:

假设该曾网络只经过线性变换,没有bias也没有激活函数。我们发现因为随机初始化权重一般偏向于0,那么经过该网络的输出值为[0.6 0.6],很明显会更接近与[0 0],而不是[2 1],相比与学习h(x)=x,模型要更快到学习F(x)=0。

并且ReLU能够将负数激活为0,过滤了负数的线性变化,也能够更快的使得F(x)=0。这样当网络自己决定哪些网络层为冗余层时,使用ResNet的网络很大程度上解决了学习恒等映射的问题,用学习残差F(x)=0更新该冗余层的参数来代替学习h(x)=x更新冗余层的参数。

这样当网络自行决定了哪些层为冗余层后,通过学习残差F(x)=0来让该层网络恒等映射上一层的输入,使得有了这些冗余层的网络效果与没有这些冗余层的网络效果相同,这样很大程度上解决了网络的退化问题。

  • 梯度消失或梯度爆炸问题的解决:

我们发现很深的网络层,由于参数初始化一般更靠近0,这样在训练的过程中更新浅层网络的参数时,很容易随着网络的深入而导致梯度消失,浅层的参数无法更新。

可以看到,假设现在需要更新b1,w2,w3,w4参数因为随机初始化偏向于0,通过链式求导我们会发现,w1w2w3相乘会得到更加接近于0的数,那么所求的这个b1的梯度就接近于0,也就产生了梯度消失的现象。

ResNet最终更新某一个节点的参数时,由于h(x)=F(x)+x,由于链式求导后的结果如下图所示,不管括号内右边部分的求导参数有多小,因为左边的1的存在,并且将原来的链式求导中的连乘变成了连加状态(正确?),都能保证该节点参数更新不会发生梯度消失或梯度爆炸现象。

这样ResNet在解决了阻碍更深层次网络优化问题的两个重要问题后,ResNet就能训练更深层次几百层乃至几千层的网络并取得更高的精确度了。

下边是ResNet的网络结构图:

左图是ResNet34,右图是ResNet50/101/152。这一个模块称作building block,右图称之为bottleneck design。在面对50,101,152层的深层次网络,意味着有很大的计算量,因此这里使用11卷积先将输入进行降维,然后再经过33卷积后再用11卷积进行升维。使用11卷积的好处是大大降低参数量计算量。

总结

通过上述的学习,你应该知道了,现如今大家普遍认为更好的网络是建立在更宽更深的网络基础上,当你需要设计一个深度网络结构时,你永远不知道最优的网络层次结构是多少层,一旦你设计的很深入了,那势必会有很多冗余层,这些冗余层一旦没有成功学习恒等变换h(x)=x,那就会影响网络的预测性能,不会比浅层的网络学习效果好从而产生退化问题。

ResNet的过人之处,是他很大程度上解决了当今深度网络头疼的网络退化问题和梯度消失问题。使用残差网络结构h(x)=F(x)+x代替原来的没有shortcut连接的h(x)=x,这样更新冗余层的参数时需要学习F(x)=0比学习h(x)=x要容易得多。而shortcut连接的结构也保证了反向传播更新参数时,很难有梯度为0的现象发生,不会导致梯度消失。

这样,ResNet的构建,使我们更朝着符合我们的直觉走下去,即越深的网络对于高级抽象特征的提取和网络性能更好,不用在担心随着网络的加深发生退化问题了。

参考链接:https://baijiahao.baidu.com/s?id=1609100487339160987&wfr=spider&for=pc

作者:邓沉香
链接:https://www.jianshu.com/p/ad6b07fe3215
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

ResNet网络解决的一些事相关推荐

  1. 到底ResNet在解决一个什么问题呢?知乎热门回答

    点击我爱计算机视觉标星,更快获取CVML新技术 本文来源于52CV群友薰风初入弦对题目中问题的回答,该回答成为近期"深度学习""机器学习""图像处理& ...

  2. ResNet网络详解与keras实现

    ResNet网络详解与keras实现 ResNet网络详解与keras实现 Resnet网络的概览 Pascal_VOC数据集 第一层目录 第二层目录 第三层目录 梯度退化 Residual Lear ...

  3. ResNet网络简单理解与代码

    ResNet网络提出的文章是<Deep Residual Learning for Image Recognition> 下载地址:https://arxiv.org/pdf/1512.0 ...

  4. 1. Resnet网络详解

    一.ResNet网络介绍 ResNet是2015年有微软实验室提出的,题目: 作者是何凯明等,这四个都是华人. 当年ResNet斩获了当年各种第一名.基本上只要它参加的比赛,全都是第一名. 我们来看一 ...

  5. 学习笔记1 - ResNet网络学习

    一些概念知识学习: 端到端(end-to-end):指的是输入是原始数据,输出是最后结果. 非端到端的输入端不是直接的原始数据,而是在原始数据中提取的特征.在以前是由手工提取图像的一些关键特征,称为降 ...

  6. 【深度学习】深入探讨:残差网络解决了什么,为什么有效?

    转载自 | 极市平台 作者丨LinT@知乎 来源丨https://zhuanlan.zhihu.com/p/80226180 0 『引言』 残差网络是深度学习中的一个重要概念.这篇文章将简单介绍残差网 ...

  7. 神经网络三:浅析神经网络backpropagation算法中的代价函数和神经网络的反向传播原理、和ResNet网络的捷径链接误差传播计算

    在博客神经网络一:介绍,示例,代码中,Backpropagation Algorithm中用到了代价函数:该代价函数是否是最好的?其有没有自身的局限性?还有其他的代价函数吗,有何特点?本文将针对这些问 ...

  8. ResNet网络详解并使用pytorch搭建模型、并基于迁移学习训练

    1.ResNet网络详解 网络中的创新点: (1)超深的网络结构(突破1000层) (2)提出residual模块 (3)使用Batch Normalization加速训练(丢弃dropout) (1 ...

  9. NeurIPS 2022|基于神经微分方程理论可以帮助我们训练更加深层次的ResNet网络

    原文链接:https://www.techbeat.net/article-info?id=4204 作者:seven_ 本文的重点研究对象是在视觉领域占据统治地位的残差神经网络(ResNets),R ...

最新文章

  1. Linux>软链接的作用与使用
  2. Netty 实战:如何编写一个麻小俱全的 web 容器
  3. Vulnhub靶机渗透之 RAVEN: 1
  4. springcloud 中的zuul整合Elasticsearch报错availableProcessors is already set to [4], rejecting [4]...
  5. Android WebView重定向问题,Android WebView 重定向问题
  6. qt-embedded-linux-opensource-src-4.5.3移植到s3c6410
  7. 日历签到 java_我的Android案例―签到日历
  8. EBS并发管理器请求汇总(按照并发消耗时间,等待时间,平均等待事件等汇总)...
  9. 代码静态检查工具PC-Lint运用实践
  10. at91sam9260 开发环境的建立
  11. 复函数图像怎么画_excel根据表格数据绘制函数图像-怎样用excel画函数图
  12. 星巴克急了,瑞幸就稳了?
  13. vue input组件设置失焦与聚焦
  14. VS2015使用opencv
  15. 计算机术语rander是什么意思,Rendering Engine,呈现引擎还是渲染引擎?
  16. OPPO跨越 “挑战者深渊”
  17. Oracle数据库期末考试范围题
  18. Ant Design of Vue 中 日期时间控件 禁止选中的(日期——)设置
  19. 安卓玩方舟服务器怎么稳定点,方舟 使用代码后 非专用服务器老掉线 | 手游网游页游攻略大全...
  20. Graphviz 绘图软件

热门文章

  1. wxWidgets:wxCriticalSectionLocker类用法
  2. wxWidgets:wxRichTextCtrl概述
  3. boost::sort模块实现展开排序示例
  4. boost::hana::scan_left用法的测试程序
  5. boost::fusion::flatten_view用法的测试程序
  6. Boost:Boost概念的function_requires()的测试程序
  7. boost的chrono模块周期计数延迟的测试程序
  8. DCMTK:演示状态查看器-后台打印程序
  9. OpenCV用方形棋盘进行相机校准
  10. Qt Designer的小部件编辑模式