深度残差网络(Deep residual network, ResNet)的提出是CNN图像史上的一件里程碑事件,在2015年提出的时候便取得了五项第一,而何恺明大神也凭借这一paper斩获CVPR 2016 Best Paper Honorable Mention。

目录

  • 背景(深度网络的退化问题)
  • 残差结构
  • 残差结构起作用的原因
  • 网络结构
  • 实验结果
  • 论文地址

背景(深度网络的退化问题)

  • 对于卷积神经网络,深度是一个很重要的因素。深度卷积网络自然的整合了低中高不同层次的特征,特征的层次可以靠加深网络的层次来丰富。因此在构建卷积网络时,网络的深度越高,可抽取的特征层次就越丰富越抽象。所以一般我们会倾向于使用更深层次的网络结构,以便取得更高层次的特征。但是更深层的网络结构真的带来了更好的表现吗?我们看下面这张图:

  • 可以看到,拥有56层数的网络结构表现明显差于拥有20层数的网络结构,造成这一现象的原因大概有:过拟合、梯度消失/爆炸和深度网络的退化,我们来一一剖析。

过拟合

  • 对于这一点答案是显然的,因为过拟合会让网络在训练集上表现得很好,而从上图我们可以看出,无论是在训练集还是测试集中,拥有更深层次的网络表现均比浅层次的网络差,那显然就不是过拟合导致的。

梯度消失/爆炸

  • 我们先简单回顾一下概念:梯度消失/爆炸是因为神经网络在反向传播的时候,反向连乘的梯度小于1(或大于1),导致连乘的次数多了之后(网络层数加深),传回首层的梯度过小甚至为0(过大甚至无穷大),这就是梯度消失/爆炸的概念。
  • 但我们知道,如今我们已经习惯加入BN层(Batch Normalize),他可以通过规整数据的分布基本解决梯度消失/爆炸的问题,所以这个问题也不是导致深层网络退化的原因。

深度网络的退化问题

  • 我们选择加深网络的层数,是希望深层的网络的表现能比浅层好,或者是希望它的表现至少和浅层网络持平(相当于直接复制浅层网络的特征),可实际的结果却让我们大吃一惊(深度网络退化),接下来我们深究一下导致深度网络退化的原因。
  1. MobileNet V2的论文中提到,由于非线性激活函数Relu的存在,每次输入到输出的过程都几乎是不可逆的,这也造成了许多不可逆的信息损失。我们试想一下,一个特征的一些有用的信息损失了,那他的表现还能做到持平吗?答案是显然的

  2. 我们用一个直观的例子来感受一下深层网络与浅层网络持平的表现:

  • 我们把右边的网络理解为左边浅层网络加深了三层(框起来的部分),假如我们希望右边的深层网络与左边的浅层网络持平,即是希望框起来的三层跟没加一样,也就是加的三层的输入等于输出。我们假设这三层的输入为x,输出为,那么深层网络与浅层网络表现持平的直观理解即是:,这种让输出等于输入的方式,就是论文中提到的恒等映射(identity mapping)
  • 所以ResNet的初衷,就是让网络拥有这种恒等映射的能力,能够在加深网络的时候,至少能保证深层网络的表现至少和浅层网络持平

残差结构

  • 通过对深度网络退化问题的认识我们已经明白,要让之不退化,根本原因就是如何做到恒等映射。事实上,已有的神经网络很难拟合潜在的恒等映射函数。但如果把网络设计为,即直接把恒等映射作为网络的一部分,就可以把问题转化为学习一个残差函数.只要,就构成了一个恒等映射。 而且,拟合残差至少比拟合恒等映射容易得多(后面第三部分会解释)。我们看一下残差结构与正常结构对比图:

  • 我们可以看到,残差结构比正常的结构多了右侧的曲线,这个曲线也叫作shortcut connection通过跳接在激活函数前,将上一层(或几层)的输出与本层输出相加,将求和的结果输入到激活函数作为本层的输出
  • 我们从数学的角度来看残差结构,假设残差结构的输入为
  • ,则输出等于:
  • 其中就是我们要学习的残差,我们把移到等式的左侧,残差就等于,以上图为例,残差就是中间有一个Relu激活的双层权重,即:
  • 其中是Relu激活函数,而是指两个weight layer。

残差结构起作用的原因

  • 关于残差结构之所以work,我想这一点也是很多读者疑惑的地方,这里分四点和大家解释。
  1. 首先给大家一个我自己的理解:我觉得加了残差结构后就是给了输入x多一个选择在神经网络学习到这层的参数是冗余的时候它可以选择直接走这条“跳接”曲线,跳过这个冗余层,而不需要再去拟合参数使得输出等于
  2. 因为学习残差的计算量比学习输出等于输入小。假设普通网络为A,残差网络为B,输入为2,输出为2(输入和输出一样是为了模拟冗余层需要恒等映射的情况),那么普通网络就是,而残差网络就是,显然残差网络中的。我们知道网络中权重一般会初始化成0附近的数,那么我们就很容易理解,为什么让(经过权重矩阵)拟合0会比容易了。
  3. 我们知道ReLU能够将负数激活为0,而正数输入等于输出。这相当于过滤了负数的线性变化,让变得更加容易。
  4. 我们知道残差网络可以表示成,这就说明了在求输出对输入的倒数(梯度),也就是在反向传播的时候,残差结构的这个常数1也能保证在求梯度的时候梯度不会消失

网络结构

  • 先上网络的结构图,左到右分别是VGG,没有残差的PlainNet,有残差的ResNet,我们从这张图也可以感受当年ResNet对VGG的统治力:

  • 细心的读者会发现,在ResNet中有的跳接线是实线,有的跳接线是虚线。虚线的代表这些模块前后的维度不一致,因为去掉残差结构的Plain网络还是和VGG一样,也就是每隔n层进行下采样但深度翻倍(VGG通过池化层下采样ResNet通过卷积)。这里就有两个情况:
  • 空间上不一致时,需要给输入的X做一个线性的映射:
  • 深度上不一致时,有两种解决方法,一种是在跳接过程中加一个1×1的卷积层进行升维,另一种则是直接补零(先做下采样)。试验后发现两种方法都可以。
  • 针对比较深的神经网络,作者也考虑到计算量,会先用1×1的卷积将输入的256维降到64维,然后通过1×1恢复。这样做的目的是减少参数量和计算量

实验结果

  • 作者对比了18层的神经网络和34层的神经网络,发现残差结构确实解决了网络的退化问题:

  • 作者还对比了在ImgaeNet上的测试结果,发现ResNet确实效果非常好:

论文地址

https://arxiv.org/pdf/1512.03385.pdf

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

CVPR2016:ResNet 从根本上解决深度网络退化问题相关推荐

  1. 网络退化现象和残差网络效果

    介绍 最近在网上看见了一个用神经网络实现"一个字符串的所有字母用它的后继字母代替(比如,a用b代替,b用c代替)"功能的代码.看见里面加了一个残差网络,就去看了一下残差网络的相关概 ...

  2. 深度网络pre-train对于深度网络的意义

    1 pre-train 带来更好的优化还是更好的泛化? pre-train是一个寻网络权值初值的过程,将pre-train的结果作为BP算法的权值的初值,能够解决深度网络在非凸目标函数上陷入局部最优的 ...

  3. 12层也能媲美ResNet?YOLOv4一作邓嘉团队提出ParNet:非深度网络!

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨happy 转载自丨极市平台 导读 是否有可能构建一个高性能的Non-deep(非深度)神经网络 ...

  4. 非深度网络 Non-deep Network:低延迟平行网络 ParNet,仅 12 层媲美 ResNet

    Non-deep Network Ankit Goyal1,2   Alexey Bochkovskiy2   Jia Deng1   Vladlen Koltun2 1Princeton Unive ...

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

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

  6. 网络退化梯度消失梯度爆炸

    ** 网络退化.梯度消失.梯度爆炸 ** 网络退化:在增加网络层数的过程中,training accuracy 逐渐趋于饱和,继续增加层数,training accuracy 就会出现下降的现象,而这 ...

  7. 残差连接 (及 梯度消失 网络退化)详解

    本文就说说用残差连接解决梯度消失和网络退化的问题. 一.背景 1)梯度消失问题 我们发现很深的网络层,由于参数初始化一般更靠近0,这样在训练的过程中更新浅层网络的参数时,很容易随着网络的深入而导致梯度 ...

  8. 基于深度学习的图像语义分割技术概述之背景与深度网络架构

    本文为论文阅读笔记,不当之处,敬请指正.  A Review on Deep Learning Techniques Applied to Semantic Segmentation: 原文链接 摘要 ...

  9. 深度网络学习调研报告

     深度网络学习调研报告 目录 1.前言...............................................3 1.1课题研究的背景及意义................. ...

最新文章

  1. 信息系统项目管理师--项目整体管理
  2. 并发基础知识 — 线程安全性
  3. tomcat c3p0 mysql_C3P0数据库连接池与tomcat一起使用时报错
  4. GCC __builtin_expect与kernel指令序列优化
  5. mysql.5.5.21_centos6下mysql-5.5.21的安装
  6. Python---实验九作业
  7. Eclipse4JavaEE安装SpringBoot
  8. NanShan即时通讯 ie6 ie7 ie8 不支持json 终极解放方案
  9. JAVA day03 数组,方法
  10. HTTP协议 通信过程介绍
  11. 线上只执行一次的脚本编写注意事项
  12. MySQL 创建注册页面_网站添加注册/登录界面
  13. 【转载】关于:读写xls文件,提供下载的一个小例子(jxl 的简单运用) - 读取文件...
  14. js根据银行卡号判断属于哪个银行,并返回银行缩写及银行卡类型--bin识别
  15. html播放flv直播源,http-flv 直播
  16. mysql导入GP_GP数据库gpload数据导入详细操作
  17. php爆路径方法总结
  18. OpenCV57:级联分类器的训练
  19. C++输入输出的格式控制2
  20. cdn缓存及缓存的清理

热门文章

  1. boost::type_erasure::less_than_comparable相关的测试程序
  2. boost::sort模块实现跨并行线程的整数排序速度基准的测试程序
  3. boost::proto模块实现在外部指定转换的示例的测试程序
  4. boost::hana::not_equal用法的测试程序
  5. ITK:指定区域裁剪图像
  6. VTK:小部件之ImageTracerWidget
  7. VTK:IO之ReadPlainTextTriangles
  8. OpenCV FLANN在数据集中搜索查询图片的实例(附完整代码)
  9. OpenCV基于LeNet-5和连接组件分析的数字识别的实例(附完整代码)
  10. Qt Creator形状