相关问题:

(1)网络的深度为什么重要?

因为CNN能够提取低维中维高维(low/mid/high-level)的特征,网络的层数越多,意味着能够提取到不同level的特征越丰富。并且,越深的网络提取的特征越抽象,越具有语义信息。

(2)为什么不能简单地增加网络层数?

对于原来的网络,如果简单地增加深度,会导致梯度弥散或梯度爆炸

(3)为什么在残差之前网络的深度最深的也只是GoogleNet 的22 层, 而残差却可以达到152层,甚至1000层?

深度学习对于网络深度遇到的主要问题是梯度消失和梯度爆炸,传统对应的解决方案则是数据的初始化(normlized initializatiton)和(batch normlization)正则化,但是这样虽然很大程度上解决了梯度的问题,深度加深了,却带来了另外的问题,就是网络性能的退化问题,深度加深了,错误率却上升了,而残差用来设计解决退化问题,其同时也解决了梯度问题,更使得网络的性能也提升了。

ResNet最根本的动机就是所谓的“退化”问题,即当模型的层次加深时,错误率却提高了,如下图:

使用Resnet50提取图像特征向量_解决方案

虽然通过上述方法能够训练了,但是又会出现另一个问题,就是退化问题,网络层数增加,但是在训练集上的准确率却饱和甚至下降了。这个不能解释为overfitting,因为overfit应该表现为在训练集上表现更好才对。
退化问题说明了深度网络不能很简单地被很好地优化。
作者通过实验:通过添加的层是恒等映射,其他层是从学习到的较浅模型的拷贝, 这种构造解决方案的存在表明,较深的模型不应该产生比其对应的较浅模型更高的训练误差。但是实验表明,我们目前现有的解决方案无法找到与构建的解决方案相比相对不错或更好的解决方案(或在合理的时间内无法实现)。

什么是恒等映射函数?

集合A到A自身的映射f,若使得f(x)=x对于一切x∈A成立,这样的映射f被称为A上的恒等映射。这里的函数f就是恒等映射

怎么解决退化问题?

深度残差网络。如果深层网络的后面那些层是恒等映射,那么模型就退化为一个浅层网络。那现在要解决的就是学习恒等映射函数了。 但是直接让一些层去拟合一个潜在的恒等映射函数H(x) = x,比较困难,这可能就是深层网络难以训练的原因。但是,如果把网络设计为H(x) = F(x) + x,如下图。我们可以转换为学习一个残差函数F(x) = H(x) - x. 只要F(x)=0,就构成了一个恒等映射H(x) = x. 而且,拟合残差肯定更加容易。

使用Resnet50提取图像特征向量_解决方案_02


其他的参考解释:

 

  • F是求和前网络映射,H是从输入到求和后的网络映射。比如把5映射到5.1,那么引入残差前是F'(5)=5.1,引入残差后是H(5)=5.1, H(5)=F(5)+5, F(5)=0.1。这里的F'和F都表示网络参数映射,引入残差后的映射对输出的变化更敏感。比如s输出从5.1变到5.2,映射F'的输出增加了1/51=2%,而对于残差结构输出从5.1到5.2,映射F是从0.1到0.2,增加了100%。明显后者输出变化对权重的调整作用更大,所以效果更好。残差的思想都是去掉相同的主体部分,从而突出微小的变化,看到残差网络我第一反应就是差分放大器...地址
  • 至于为何shortcut的输入时X,而不是X/2或是其他形式。kaiming大神的另一篇文章[2]中探讨了这个问题,对以下6种结构的残差结构进行实验比较,shortcut是X/2的就是第二种,结果发现还是第一种效果好啊(摊手)。

使用Resnet50提取图像特征向量_使用Resnet50提取图像特征向量_03


这种残差学习结构可以通过前向神经网络+shortcut连接实现,如结构图所示。而且shortcut连接相当于简单执行了同等映射,不会产生额外的参数,也不会增加计算复杂度。 而且,整个网络可以依旧通过端到端的反向传播训练。

ImageNet上的实验证明了作者提出的加深的残差网络能够比简单叠加层生产的深度网络更容易优化,而且,因为深度的增加,结果得到了明显提升。另外在CIFAR-10数据集上相似的结果以及一系列大赛的第一名结果表明ResNet是一个通用的方法。

深度残差学习

 

  • 残差学习
    根据多层的神经网络理论上可以拟合任意函数,那么可以利用一些层来拟合函数。问题是直接拟合H(x)还是残差函数,由前文,拟合残差函数F(x) = H(x) - x更简单。虽然理论上两者都能得到近似拟合,但是后者学习起来显然更容易。
    作者说,这种残差形式是由退化问题激发的。根据前文,如果增加的层被构建为同等函数,那么理论上,更深的模型的训练误差不应当大于浅层模型,但是出现的退化问题表明,求解器很难去利用多层网络拟合同等函数。但是,残差的表示形式使得多层网络近似起来要容易的多,如果同等函数可被优化近似,那么多层网络的权重就会简单地逼近0来实现同等映射,即F(x) = 0。
    实际情况中,同等映射函数可能不会那么好优化,但是对于残差学习,求解器根据输入的同等映射,也会更容易发现扰动,总之比直接学习一个同等映射函数要容易的多。根据实验,可以发现学习到的残差函数通常响应值比较小,同等映射(shortcut)提供了合理的前提条件。

原论文的中文翻译:

我们考虑H(x)作为几个堆叠层(不必是整个网络)要拟合的基础映射,x表示这些层中第一层的输入。假设多个非线性层可以渐近地近似复杂函数,它等价于假设它们可以渐近地近似残差函数,即H(x)−x(假设输入输出是相同维度)。因此,我们明确让这些层近似参数函数 F(x):=H(x)−x,而不是期望堆叠层近似H(x)。因此原始函数变为F(x)+x。尽管两种形式应该都能渐近地近似要求的函数(如假设),但学习的难易程度可能是不同的。

关于退化问题的反直觉现象激发了这种重构(图1左)。正如我们在引言中讨论的那样,如果添加的层可以被构建为恒等映射,更深模型的训练误差应该不大于它对应的更浅版本。退化问题表明求解器通过多个非线性层来近似恒等映射可能有困难。通过残差学习的重构,如果恒等映射是最优的,求解器可能简单地将多个非线性连接的权重推向零来接近恒等映射。

  • 通过shortcut同等映射

使用Resnet50提取图像特征向量_使用Resnet50提取图像特征向量_04

使用Resnet50提取图像特征向量_映射函数_05

F(x)与x相加就是就是逐元素相加,但是如果两者维度不同,需要给x执行一个线性映射来匹配维度:

使用Resnet50提取图像特征向量_映射函数_06

用来学习残差的网络层数应当大于1,否则退化为线性。文章实验了layers = 2或3,更多的层也是可行的。
用卷积层进行残差学习:以上的公式表示为了简化,都是基于全连接层的,实际上当然可以用于卷积层。加法随之变为对应channel间的两个feature map逐元素相加。

 

使用Resnet50提取图像特征向量_resnet_07

  • 网络结构
    作者由VGG19设计出了plain 网络和残差网络,如下图中部和右侧网络。然后利用这两种网络进行实验对比。

key point:

使用Resnet50提取图像特征向量_拟合_08

 实施
key point:

训练测试的multi-scale,BN,color augmentation. 测试时的10-cut.

实验

key point:

使用Resnet50提取图像特征向量_使用Resnet50提取图像特征向量_09

核心总结:

网络的深度对于神经网络的学习至关重要,网络的层数越多,意味着能够提取不同level的特征就越丰富,并且提取的特征越抽象,越具有语义信息。但是单纯的增加网络的深度,首先会造成梯度弥散预梯度爆炸,通过数据初始化,正则化在一定程度解决了该问题,但是继续随着深度增加会导致退化问题:即准确率达到饱和然后迅速下降,并且会导致更高的训练误差。

本文采用了深度残差网络来解决该问题:

通过恒等映射,将深层网络退化为一个浅层网络,这里主要解决的就是学习恒等映射函数。

使用Resnet50提取图像特征向量_拟合_10

但是直接让一些层去拟合一个潜在的恒等映射函数H(x) = x,比较困难,这可能就是深层网络难以训练的原因。但是,如果把网络设计为H(x) = F(x) + x,如下图。我们可以转换为学习一个残差函数F(x) = H(x) - x. 只要F(x)=0,就构成了一个恒等映射H(x) = x. 而且,拟合残差肯定更加容易。

根据多层的神经网络理论上可以拟合任意函数,那么可以利用一些层来拟合函数。问题是直接拟合H(x)还是残差函数,由前文,拟合残差函数F(x) = H(x) - x更简单。虽然理论上两者都能得到近似拟合,但是后者学习起来显然更容易。

作者说,这种残差形式是由退化问题激发的。根据前文,如果增加的层被构建为同等函数,那么理论上,更深的模型的训练误差不应当大于浅层模型,但是出现的退化问题表明,求解器很难去利用多层网络拟合同等函数。但是,残差的表示形式使得多层网络近似起来要容易的多,如果同等函数可被优化近似,那么多层网络的权重就会简单地逼近0来实现同等映射,即F(x) = 0。(逼近于0肯定要比逼近于y=x要容易

实际情况中,同等映射函数可能不会那么好优化,但是对于残差学习,求解器根据输入的同等映射,也会更容易发现扰动,总之比直接学习一个同等映射函数要容易的多。根据实验,可以发现学习到的残差函数通常响应值比较小,同等映射(shortcut)提供了合理的前提条件。