ResNet学习笔记

来源:互联网 发布:php编写新闻发布系统 编辑:程序博客网 时间:2024/05/22 01:45

  ResNet(Residual Neural Network)由微软研究院的何凯明大神等4人提出,ResNet通过使用 Residual Unit 成功训练152层神经网络,在ILSCRC2015年比赛中获得3.75%的top-5错误率,获得冠军。
  ResNet的参数量少,且新增的Residual Unit单元可以极快地加速神经网络的训练,同时模型的准备率也有非常大的提升。本笔记是在阅读KaiMing He大神的《Deep Residual Learning for Image Recognition》论文之后,对其知识架构的个人理解,并不是所谓的论文翻译.
  论文见:Deep Residual Learning for Image Recognition

一.概述        

  • 问题提出
       随着CNN网络的发展,尤其的VGG和GoogLeNet的提出,大家发现对于网络性能的提升网络的层数是一个关键因素: -网络越深性能也越好- 。但是随着网络层数的增加,问题也随之而来。
      首先一个问题是:vanishing/exploding gradients,即梯度弥散。这导致训练难以收敛,但是随着 BN的提出暂时解决了这个问题。
      可又一个问题暴露出来:随着网络深度的增加,系统精度得到饱和之后,准确度确在迅速的下滑,并经过实验分析,这个性能下降不是过拟合导致的,作者把这一现象称做"退化".
             这里写图片描述 

所以,Q:如何有效的解决网络深度的增加,带来的“退化”问题?成为继续提升网络性能的核心问题,同同事这也是 本论文的主要论点.
   A:首先我们知道出现"退化"的问题,主要是由于网络深度的增加,在网络训练(运用BP算法)的时候,梯度无法有效的传递到浅层(前面)网络,导致出现梯度弥散(vanishing)。针对这一问题在BN(BatchNormalization)中我们通过规范化每一层的输出数据来改变数据分布,这是一个向前的过程来解决梯度弥散问题,但是随着网络的深度进一步增加"退化"问题出出现,所以这说明是网络的架构出现了问题,仅仅通过一些优化方法是不足以解决所有的问题.
   基于这种分析,作者提出了ResNet网络,这也是DL界的一大变革吧.

接下来就是对这一网络结构的详细分析.

二.网络结构

2.1 网络结构核心–残差网络

2.1.1源:Highway Network 

  在ResNet之前,瑞士教授Schmidhuber提出了**Highway Network,**ResNet的原理和他很像,当然Schmidhuber教授还有着一个更出名的发明–LSTM网络。
   Highway Network相当于修改了每一层激活函数,此前的激活函数是对输入信号做了非线性变换y=H(x,W), 在Highway Network中则允许保留一定比例的原始输入x,即y=H(x,W1)T(x,W2)+xC(x,W3),这里T为变换系数,C为保留系数。在这样的设定下,前面一层的信息,有一定比例的可以直接传输到下一层(不经过矩阵乘法和激活函数变换),如同网络传输中的一条高速公路,因此得名Highway Network。Highway Network主要通过gating units学习如何控制网络中的信息流,即学习原始信息应保留的比例。这个可学习的gatting机制,正是借鉴Schmidhuber教授早年的的LSTM网络中的gatting。这正是Highway Network的引入,使得几百层乃至上千次的网络可以训练了。

2.1.2残差网络详解:

  可能是由于Highway Network网络中信息传输方式的灵感,作者针对“退化”问题,提出了-残差网络-的概念:
残差结构如下:
            这里写图片描述
            
假设:如果多层非线性层叠加可以渐进逼近复杂的函数,那么也能渐进逼近残差函数:H(X)-X.
  (这一想法源于图像处理中的残差向量编码,通过一个reformulation,将一个问题分解成多个尺度直接的残差问题,能够很好的起到优化训练的效果。)
结构实现:通过增加一个identity mapping(恒等映射),将原始所需要学的函数H(x)转换成F(x)

这样,可以用多层网络来逼近残差函数:
                  F(X):=H(X)−X

从而原来的网络结构就变成了:
                   F(X)+X
              (所以也就有了上面的结构)  

对结构的几点说明:                 
  1.shortcut connection将这个block的输入和输出进行一个element-wise的加叠,这个简单的加法并不会给网络增加额外的参数和计算量,却可以大大增加模型的训练速度、提高训练效果,并且当模型的层数加深时,这个简单的结构能够很好的解决退化问题.

  正如前言所说,如果增加的层数可以构建为一个 identity mappings(恒等映射),那么增加层数后的网络训练误差应该不会增加(与没增加之前相比较)。性能退化问题暗示多个非线性网络层(普通卷积层)用于近似identity mappings 可能有困难。使用残差学习改写问题之后,我们的优化目标可以理解为从  最优化F(X)=H(X)变成了F(X)=H(X)−X , 所以说如果identity mappings 是最优的,那么使用残差后我们的优化问题变得很简单,直接将多层非线性网络参数趋0即F(X)=0。
  
  实际中,identity mappings 不太可能是最优的,但是上述改写问题可能对问题提供有效的预先处理 (provide reasonable preconditioning)。如果最优函数接近identity mappings,那么优化将会变得容易些。
 
  上述内容的理解来自于EmbeddedApp的博客EmbeddedApp-系统学习深度学习(二十)–ResNet,DenseNet,以及残差家族 
  不过我对于这点还是有点疑问,毕竟如果最优变成恒等映射,那么我们的学习过程还有意义么,当然他说了实际中其实最优并不是恒等映射,但是网络的提出从某种程度上可以说是基于恒等映射的.比较郁闷,希望在接下来的学习中,对于这个问题又更清楚的理解吧.

  2.Plain Network 主要还是根据 VGG 网络,采用3*3滤波器,遵循两个设计原则:1)对于相同输出特征图尺寸,卷积层有相同个数的滤波器;2)如果特征图尺寸缩小一半,滤波器个数加倍以保持每个层的计算复杂度,通过步长为2的卷积来进行降采样。
需要指出,我们这个网络与VGG相比,滤波器要少,复杂度要小。

所以总结一下:Residual Network 主要是在 上述的 plain network上加入 shortcut connections.

作者在提出这个观点后就开始设计实验验证,不过这里我先讲下作者在实验中对于shortcut connection连接方式的几种改进.

2.1.3shortcut connection连接方式改进

方式一:
                y=F(X,Wi) + X
                
其中F(X,Wi)=W2σ(W1X),如上图上描述的,表示多个非线性卷积层的叠加,σ表示非线性激活函数ReLU,F+X表示shortcut connection,对应每一个像素相加。

         这里写图片描述
         
注:该网络结构相对于plain Net没有增加任何参数
  
方式二:
               y=F(X,Wi) +WsX
               
其中,如果想要改变输入输出的channels个数,则可以通过线性变换Ws(这里借鉴了VGG和GoogLeNet理都用到的1*1的卷积核)来实现shortcut connection。

关于F(X,Wi)论文中也提到,也不要局限于上面提到了2层卷积的连接,可以更加变化丰富多样些.

     这里写图片描述

注:其中一个这样的小单元,称之为一个block。在构建深层的网络结构时,作者将第二种结构称之为bottleneck

三.实验

3.1设计不同网络结构:

为了说明残差结构的优越性,作者设计了三种不同的网络结构来对比分析,通过最后的准确率以及当很深很深之后"退化"是否出现来证明残差网络的好.

   这里写图片描述
   
左边: VGG-19 Model(19.6billion FLOPs)  

中间: 普通的网络:使用多个3*3的小卷积核(以VGG网络的思想设计),遵循着两个设计原则
  
       1)对于相同的输出特征图尺寸,层与滤波器的个数是相同的            
       2) 如果输出特征图的尺寸减半,那么滤波器的个数加倍,保持时间复杂度网络共34层,以全局平均池化层和1000个分类的softmax层结束. 
      普通的网络需要(3.6billion FLOPs)
      
右边: residual model:这是建立在普通网络的基础上的,可以看到网络的旁边多了很多前馈线,我们把这些前馈线也称之为shortcut或skip connections.,这些前馈线代表的是恒等映射。  

   前馈线应用会遇到两种情况: 
    
   1. 输入和输出的维度一致,那可以直接连接
   2. 如果输出的维度增加了,有两种办法:
      1)恒等前馈线不足的维度添加padding,padding的值为0  
      2)借鉴Inception Net的思想,经过1*1卷积变换维度

3.2 Implemenation

训练说明: 

  • 随机resize 到256,480
  • 随机裁剪224x224
  • 随机水平镜像
  • 减去均值
  • 卷积操作之后,非线性激励函数之前,使用BN(BatchNormalization)操作
  • 使用SGD优化,mini-batch=256
  • 学习率=0.1,然后当误差不下降后,降低10倍
  • 迭代次数60x104
  • 没有使用dropout操作

测试说明:

  • 对比了标准的10-crop测试(4个角落,中间位置,乘以水平镜像)
  • 采用fully convolutional 的形式,对最后的结果取平均(将图像的短边缩放到{224, 256, 384, 480, 640} 之一)

3.3 ImageNet Classification

3.3.1 ResNets与普通网络的对比

注意ResNets相对于普通网络是没有额外的参数

这里写图片描述 

            这里写图片描述 
            
  左边是普通网络随着迭代次数的增加,plain-18和plain-34随着迭代次数的增加,训练误差和验证误差的 变化,加粗的是验证误差,细线为训练误差,可以看到无论是训练误差还是验证误差,随着迭代次数的增加,plain-34都比plain-18要大,这就是我们一开始说的degradation问题.
  右边是residual net(使用的是零填充),可以看到随着迭代次数的增加 训练集和验证集的误差都继续下降了,说明residual net结构产生的效果确实比较好。
说明:

  • 两者的基础网络是相同的,resNet同plainNet
  • 不同的是ResNet使用了shortcut connection:使得每两个卷积增加了一个shortcut connnection
  • 所有的shortcut 采用Identity Mapping,如果维度增加了,则采用0补足,从而相对于plainNet不会带来任何额外参数
  • 结果ResNet效果都要比plainNet要好。
         1)通过table2,可以看出resNet可以比较好的控制“退化”问题
         2)top-1 error的对比更能体现残差在提高网络深度方面更加有效
         3)收敛速度:通过对比18-layer发现resNetplainNet的最终精度差不多,说明网络深度不是       特别深的时候,SGD能然可以对plainNet找到一个不错的最优解,但是Resnet提供了一种       收敛速度更快的结构

      
    Q:作者指出优化难度好像并不是由于梯度消失引起的?
    A:支持这种观点可以通过上述对比实验可以看出:
      实际上,plainNet-34 仍然可以达到具有竞争力的结果,也可以指出优化过程仍然起到了作用。 因此,作者得出,这种深度的plainNets的收敛可能是指数级别的(非常慢)速率,导致训练误差偏高【作者也进一步证明了通过更多的迭代次数(3x),仍然观察到了退化现象】

     
    作者还就不同的shortcuts connection 做了比较,不过这种结构的细微差别并不是解决“退化”问题的本质因素,几种结构我们在上面已经说过了,这里不再说了.

3.3.2 评估residual net在ImageNet数据集上的表现:

这里写图片描述

四.参考资料

1.http://blog.csdn.net/whz1861/article/details/78229124
2.http://blog.csdn.net/App_12062011/article/details/62221296
3.http://blog.csdn.net/u011974639/article/details/76737547
4.http://blog.csdn.net/wspba/article/details/56019373

原创粉丝点击