ML

Cnn Overview 01(Long)

Posted by keming on April 20, 2018

<本文受 英文论文 的启发,除加入自己的理解外,编排插图均与此文一致。>

1. Introduction

1.1 Motivation

  • 神经网络这些年的发展主要体现在CNN上,大家把它当做黑箱使用。所以一直以来有两个问题:
    1. 网络到底学到了什么?
    2. 在结构选择上,为什么一种结构要好于另一种?
  • 此外,更深的研究在于减少其数据驱动的设计。虽然有研究致力于探索网络内部,但目前的结果还局限于通过中间过程的具象化来理解ConvNets不同层的作用。

1.2 Objective

  • 要解决这些问题,就要用多层卷积结构回顾近些年的成果。这些典型结构将通过不同的基于生物学发现和健全理论的设计来讨论;还会讨论通过具象和实验研究理解ConvNets的方法;终极目标是聚焦于网络中每一层结构的作用;还会讨论一些开放问题。

1.3 Outline of report

  • Chapter2 描述大量的多层神经网络结构并展示目前计算机视觉应用最成功的结构。
  • Chapter3 聚焦于结构中的组件,并进行理论分析。
  • Chapter4 讨论ConvNets的设计趋势、网络的理解和一些剩下的关键突出缺点。

2. Multilayer Networks

2.1 Multilayer architecture

  • 在深度学习之前,计算机视觉最好用的方法分为两个步骤:
    1. 根据任务目标,从输入数据手动转换数据提取特征,以便被分类器使用。
    2. 用转换好的数据训练分类器(如SVM)。
  • 任何分类器都会被第一步的手动特征所严重影响。表示学习将两步合为一步,学习端到端的映射,这种方法在多层网络上被称为深度学习。
  • 多层结构可以定义为允许从输入数据提取多层抽象特征信息的计算模型。一般深层结构被设计为放大输入数据在高层的重要方面,而对不重要方面的改变很鲁棒。刚开始大家只是简单地堆叠线性和非线性函数,经过了这些年,才有了各种的结构。

2.1.1 Neural networks

  • 一些基础知识:

imgimgimg

  • 依赖于堆叠RBM的神经网络在人脸识别中进行降维算是第一个成功应用,这里用的是自编码器,其分为两个部分:编码器和解码器。

img

  • 除了基于RBM的,后来又有了很多自编码器,都有不同的正则化方法来避免学到平凡解。比如Sparse Auto-Encoders(SAE),Denoising Auto-Encoders(DAE),Contractive Auto-Encoders(CAE)。
    1. SAE通过惩罚负值来使中间特征的维度大于输入,增强稀疏性。
    2. DAE要从人工噪声的数据中重构一个干净的输入,改变了重构的目标,增强特征鲁棒性。
    3. CAE建立在DAE之上,进一步惩罚那些对输入噪声敏感的单元。

2.1.2 Recurrent neural networks

  • 基本的RNN是这样:

imgimg

  • 隐层单元的输入是这一刻的输入和上一刻的隐层输出。看起来很棒的结构,却搞不定长程依赖,主要是训练时容易造成梯度爆炸和梯度消失,因为后向传播的梯度和从最后的状态一直乘以网络权重乘到最开始的状态。
    1. 权重数值小,梯度就会消失。
    2. 权重数值大,梯度就会爆炸。

为了解决这个问题,引入了LSTM。LSTM包括输入门、遗忘门、输出门:

  • 输入门img
  • 遗忘门img
  • 其当前候选单元img
  • 记忆单元img
  • 输出门img
  • LSTM的输出为img
  • 总体来看:img

2.1.3 卷积网络

  • 卷积网络的成功得益于其局部性设计,两大设计思想:
    1. 2D图像的局部像素高度相关,所以局部连接优于全连接;权值共享、一个通道的特征是同一个卷积核的结果。这个设计大量减少了参数量。
    2. 池化步骤提供了某种程度上的转换不变性,值得注意的是,它可以让网络看到更大的输入区域,当然分辨率也会变小。这样随着网络越深,越能提取出抽象特征。(比如底层是边,高层的全局的高级特征。)

img

  • 最早的CNN是Neocognitron,它和现在的CNN不同,它被设计来做自组织映射,不需要标签,学习的是连续层之间的局部连接。

img

  • 现在我们熟知的CNN是Lenet的构造,包括:
    1. 卷积层
    2. 非线性映射
    3. 归一层
    4. 池化层
  • 这些结构都在Neocognitron出现过,Lecun的贡献主要是把后向传播应用于卷积参数的学习。
  • 卷积结构虽然比全连接的网络少很多参数,但仍然严重依赖于数据。这也是为什么2012年Imagenet数据应用和计算资源进步之前CNN没有被广泛应用的原因。这之后涌现出大量在Imagenet上成功的CNN网络,它们大多基于CNN结构模块的变化。

2.1.4 Generative adversarial networks

  • GAN是2014年提出的,没有提出新的网络结构,现广泛用于没有标签的无监督学习。
  • 生成器G(z;θ g ),判别器D(x;θ d )互相对抗,原始数据作为real标签,生成的数据作为fake标签,当判别器无法判别这两类(50%-50%)时,生成器就成功了。

img

  • 刚开始G和D都是全连接的网络,后来各种结构都被用上。

2.1.5 Multilayer network training

  • 有监督的学习过程完全使用loss的梯度下降进行后向传播,

img

  • 加上动量来控制下降的方向:

img

  • 也可以控制学习率,事先制定的schedule并不好用,适应性改变的学习率有Adagrad、Adadelta、Adam这些方法,主要思想是在参数频繁变化时提供小的更新量,不频繁时有更大的更新量。
  • 而梯度下降的缺陷在于对大量标签数据的依赖。有个方法是使用无监督学习,在训练浅层网络时流行的办法是基于Predictive Sparse Decomposition(PSD)的,PSD学习的是能重构图像的特征,基于稀疏编码算法。
  • 一般稀疏编码的loss是img,Y是编码。
  • 而PSD的loss是img,这里img
  • 可以看到有个第一范式的正则化表现稀疏,F学习Y。
  • PSD方法中,在输入图像的不同部分学习到的核不同。

2.1.6 A word on transfer learning

  • 在多层网络结构的应用中有个意外之喜:在不同任务和不同数据上学习到的特征有适应性。比如用Imagenet数据训练的网络应用于Caltech-101数据集的识别,包括目标识别和基于视频的任务。说明他们的抽象和全局都有相似性。
  • 迁移学习有几个基本结论:
    1. 只fine tuning高层参数,比fine tuning全部网络效果更好。
    2. 任务相似度越低,迁移效果越差。
    3. 即使在新的任务上fine tuning之后,网络在原任务上的性能也不会太差。
  • 最近的成果把学习任务分成了两步:
    1. 快速学习:像往常一样,网络对一个特定的任务进行快速学习。
    2. 全局学习:在不同任务间最小化loss,更新参数。

2.2 Spatial convolutional networks

  • 理论上,卷积能应用于任意的维度,而二维卷积尤其适用于单个图像,在大量数据和强大算力的帮助下,ConvNets在这些年有各种应用。这部分讲这些卓越的2D ConvNets结构,它们的组成比Lenet更加新颖。

2.2.1 Key architectures in the recent evolution ofConvNets

  • AlexNet重燃了业界对ConvNets的兴趣,它在当年的ImageNet取得了突破性的最好成绩,结构包括5个卷积层和3个全连接。

img

  • 受限于当年的硬件条件,AlexNet将一个模型分拆成两个图放在两个GPU上训练。它的成功有以下几个关键点:
  1. 用relu代替sigmoid这类饱和非线性函数,而之前Lenet是用的sigmoid,这样减少了梯度消失问题。
  2. 在最后一层全连接使用dropout,训练时随机丢弃某个设定比例的神经元,每次训练都是稍有不同的结构,打破了局部单元之间的关联,减少了过拟合。
  3. 使用了数据增强。比如训练随机偏移和翻转的图像。
  4. 训练时使用动量和预先设定的学习率衰减,加快收敛速度。
  5. AlexNet的成功引发了大量理解ConvNet的文章,有的是通过可视化卷积网络,如DeConvNet,有的是对体系结构进行系统探索。其中一个直接结论就是:更深的网络能达到更好的结果。比如19层的VGG-Net,完全使用AlexNet的方法堆叠的更深,只是将11* 11的卷积核改为了3* 3,这就使其在更深的网络中不需要学习急剧增多的参数。当然因为用了更小的卷积核,每层需要的卷积核数量更多。
  6. VGG-Net是AlexNet之后最早也是最简单的深度结构,之后有了著名的22层GoogLeNet。因为inception模块的提出,GoogLeNet需要的参数更少。下图是inception模块和GoogleNet:

img

  • Inception模块中的思路其实是跨通道进行pooling,这个思想受益于NiN。这个网络是第一个不再简单堆叠卷积层和池化层的例子,随后又有了ResNet,它是一个超过150层的新颖结构。
  • 它学习的是残差F:img

img

  • 这种残差结构使其能学习更深的结构而不会遇到梯度消失的问题。最近在Resnet之上又构造了DenseNet网络,它将残差这种思想走到了极致:

img

img

  • 因为这种避免冗余的结构,DenseNet可以在每层使用更少的卷积核,同时梯度的后向传递也更加顺利,同Resnet对比,DenseNet需要的参数更少且有效避免了过拟合。

2.2.2 Toward ConvNet invariance

  • 深度网络面临的最大挑战之一就是学习参数时对大量数据的依赖。即使是像ImageNet这样超过百万的数据集,对于深度结构来说也还是太小。方法:
  • 通过随机的翻转、旋转、抖动进行数据增强,这样训练处理出来的网络就对这些变换具有更好的抵抗性,学习了不变的特征。AlexNet能够成功,这个方法有巨大贡献。
  • 因此,除了前面提到的那些让网络结构更容易训练的方法,其他工作致力于研究能产生更好训练的模块。这个部分介绍了一些能直接从原始数据学习不变特征的方法。
  • 一个使ConvNet不变性最大的方法是Spatial Transformer Network (STN),模块分为三个部分:Alocalization net、a grid generator、a sampler。
    1. localization net,它经常是一个2层的神经网络,将特征映射U作为输入学习转换参数θ。如仿射变换Tθ允许网络学习各种变换(翻转平移等)。
    2. Grid generator此时有了转换参数,有了预先设定的输出尺寸H* W,就能根据每个输出坐标(xit, yit)计算输入坐标(xis, yis):img
    3. sampler有了输入特征映射U,有了grid,就能完成从xis到xit的转换。
  • 在ConvNet的任何一层都可以加入这个结构,因此就提升了网络的不变性和准确率。

img

  • 同样是为了提升网络的不变性和性能,两个同时期的DeformableConvNet和Active ConvNet介绍了一种灵活的结构,它们为了在卷积时能学习到感兴趣区域(ROI),回避了刚性窗口的使用。这种方法类似与STN中localization net和Grid generator的功能。为了确定每层的ROI,对卷积模块进行了修改,以从最初的刚性窗口学习到补偿值。
  • 刚性窗口进行卷积的标准定义为:

img

  • 加入补偿后变成:

img

  • 为了学习这个补偿,Deformable ConvNets中加入了一个子模块。和STN分别学习转换和权重不同,Deformable ConvNets是同时学习的,因此会更快也更容易应用在各种结构中。

img

2.2.3 Toward ConvNet localization

  • 除了像目标识别这样简单的分类任务,ConvNets也已经应用于需要精确定位的任务,如语义分割和目标检测。Fully Convolutional Network (FCN)是最成功的语义分割网络,它没有利用全连接层,而是将其换感受野覆盖整个特征映射的卷积层。重要的是,网络在最后一层学习一个上采样器或反卷积来恢复图像的分辨率。

img

  • 在FCN中,分割被转换为每个像素的分类问题。实际上就是在每个像素后跟一个softmax层,把相同类的像素进行group就完成了分割。
  • FCN结构中,人们发现在上采样步骤利用底层的特征信息非常重要。因为底层的特征信息包含更好的纹理细节,这有利于精确的分割。相较于分类,分割问题中的纹理细节更为重要。学习反卷积器的一种方法依赖于atrous或者dilated卷积,换句话说就是稀疏的上采样器,它会在保持参数量可管理的情况下恢复较高的分辨率。
  • 对于目标定位,最早的ConvNet框架是Region CNN(R-CNN)。它包含区域的生成方法和CNN的结构,虽然想法很简单,但是效果确实不错。方式大概是:
    1. 用已有的算法取得可能存在目标的区域(候选区域)。
    2. 将这些区域处理成网络的输入大小,并提取特征。
    3. 将这些特征用SVM进行分类,并在后处理步骤用non-maximum suppression(非最大抑制)进行细化。
  • 在这个最初版本,RCNN只是用ConvNets提取特征。而它的成功也导致了对ConvNets的更多利用,比如后来的Fast R-CNN,Faster R-CNN,Mask R-CNN。
  • Fast R-CNN提出了通过网络传播独立计算区域的提议,以在最后的特征映射层中提取它们的对应区域,这样避免了每个区域都进行一次特征提取的耗时。Fast R-CNN还改变了网络的最后一层,使得既可以进行分类,又可以回归出精细框的坐标,这样又避免了后处理的耗时。
  • 实际上,R-CNN和FastR-CNN最耗时的部分都在第一步的候选区域获取,这一步不属于ConvNets。
  • Faster R-CNN把ConvNets用到了极致,它在ConvNet最后的卷积层那里加入了一个子网络叫Region Proposal Network (RPN)。RPN把学习区域获取这一步作为了优化网络的一部分,它是包括一层卷积和一层全连接的小的ConvNet,输出潜在目标的位置和目标分数(可能性)。使用迭代的两步完成训练:
    1. 用RPN单元完成特征提取过程的优化。
    2. 保持这些区域不变,进行目标分类和边界框回归的finetune。
  • 最近,mask R-CNN通过在被检测到的对象周围添加紧密的掩膜,来增强Faster R-CNN分割区域的能力。为此,mask R-CNN把分割分支加入到Faster R-CNN的分类和边界框回归分支,分割分支可以是一个小的FCN,它用来对边界框里的像素进行二分类(前景与背景)。
  • 下图是这四种网络:

img

2.3 Spatiotemporal convolutional networks

  • 以上的这些应用促进了基于图像任务的进步,如视频分析。通常时空的应用只是简单地将空间上的卷积扩展到时间域。有三种不同的结构:基于LSTM、3D卷积、双流卷积。

2.3.1 LSTM based spatiotemporal ConvNet

  • 基于LSTM的时空卷积算是2D扩展的早期尝试,分为三步:
    1. 每一帧都用CNN处理,生成最后的特征。
    2. 不同时间步的特征喂入LSTM。
    3. 这些LSTM的输出要么做均值,要么线性组合后输入softmax进行预测。
  • 网络的目标是逐步整合时间上的信息,不受限于严格的输入大小(时间上的长度)。这种体系结构的好处之一就是使网络能够生成可变大小的文本描述(即LSTMs擅长的任务)。虽然这样可以收集时间上的信息,但它不能识别更细粒度的运动模式;同时这种模型比较大,通常需要大量数据且难以训练。
  • 目前,除了视频与文字分析整合(视频描述)这种情况,LSTM基本没有成功过。

img

2.3.2 3D ConvNet

  • 第二种方式非常直接,它直接对(x, y, t)做处理,进行三维卷积。
  • 最初一些尝试是在第一层或是最潜的几层进行三维卷积,当卷积第一层时,会在连续的三或四帧应用卷积核。为了捕捉更长的动作,会有很多个这样的流并行,这种堆叠提升了网络的时间感知域。但是由于只做第一层,这样并不会比直接用二维卷积处理原始帧有什么改进。
  • 更强的方法是用现在广泛使用的C3D网络,它在所有层都使用三维卷积和池化,从二维到三维导致了参数量的急剧爆炸,可以使用很小的时间步(3* 3* 3)来补偿。
  • 最近有一个稍微不同的方法,改进了ResNet,使之成为Temporal ResNet (T-ResNet),T-ResNet利用1* 1* T滤波器来增强残差单元,这个滤波器沿时间维度应用一维滤波操作。
  • 3D ConvNet的最终目的是通过空间上的卷积来直接处理时间上的信息,以同时捕捉外观和动作。现在的主要问题就是需要的参数量太大。

2.3.3 Two-Stream ConvNet

  • 第三种方法就是双流设计,根据生物视觉系统的研究,分成了外观和动作两个流。外观的那个流处理的是RGB数据,动作的流处理的是光流的堆叠,标准的设计如图:

img

  • 两个流都是标准的二维卷积网络,它们分别进行分类,最后融合成最终的结果。
  • 对双流设计的改进在与:
    1. 单个流的ConvNets用更复杂的结构。
    2. 用不同的方式连接两个流。
  • 最近的I3D,既在单个流上用了三维的filter,又用了双流结构,然而除了网络在基准动作识别数据集上获得稍好的结果之外,作者并没有提出引人注目的论据来支持对冗余光流的需求。难以说明光流的好处。
  • 目前,这种方式是用的最广的,因为在大量动作识别基准上,双流的变换取得了最好的结果。

2.4 Overall discussion

  • 多层表示已经在计算机视觉中扮演重要角色。即使是广泛应用的手工特征SIFT也可以被看做是一个潜层的多层表示。此外,最先进的识别系统也会先使用手工特征,再接着进行编码,使用空间池化和分类器,这也是一种多层表示。现代的多层结构推动了分层数据表示的思想,避免手动设计,采用基于学习的方法。
  • 总的来说,虽然处理多层网络的文献非常多,每个派别都主张一种架构比另一种架构的好处,但一些常见的“最佳实践”已经出现。突出的例子包括:
    1. 大多数体系结构对四种常见构建模块(即卷积,修正relu,归一化和池化)的依赖。
    2. 具有小型卷积内核(控制参数量)的深层体系结构。
    3. 残差连接以应对误差后向传播的问题。
    4. 对输入数据的良好表示是分层抽象的。
  • 达到良好结果的同时,仍具有缺陷:
    1. 无法理解这种特征表示
    2. 对大量数据的依赖
    3. 难以支持精确的表现范围
    4. 缺乏清晰的超参数选择方案
  • 而关于对网络的理解,如何选择网络结构,在下一章。