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

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

目录

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

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

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

    CVPR2016:ResNet 从根本上解决深度网络退化问题_第1张图片

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

过拟合

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

梯度消失/爆炸

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

深度网络的退化问题

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

    CVPR2016:ResNet 从根本上解决深度网络退化问题_第2张图片

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

     

    CVPR2016:ResNet 从根本上解决深度网络退化问题_第3张图片

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

 

残差结构

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

    CVPR2016:ResNet 从根本上解决深度网络退化问题_第4张图片

     

  • 我们可以看到,残差结构比正常的结构多了右侧的曲线,这个曲线也叫作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的统治力:

     

    CVPR2016:ResNet 从根本上解决深度网络退化问题_第5张图片

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

    CVPR2016:ResNet 从根本上解决深度网络退化问题_第6张图片

实验结果

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

     

    CVPR2016:ResNet 从根本上解决深度网络退化问题_第7张图片

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

    CVPR2016:ResNet 从根本上解决深度网络退化问题_第8张图片

论文地址

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



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

你可能感兴趣的:(#,深度学习-论文笔记,深度学习)