CNN-Architecture

1.0 Base Knowledge

CNN(Convolution Neural Network,卷积神经网络)作为一种经典的 DNN 结构,上世纪90年代就已经被提出了,却沉寂近20年。有趣的是,在2012年 AlexNet 大放异彩后,CNN 在随后几年近乎卷席了整个图像处理领域,很有点戏剧性。近些年,CNN 在语音处理、NLP 领域也发展迅速。随着时间的推移,CNN的架构不断更新迭代,本文将详细介绍CNN相关发展历程。

CNN其实可以看作DNN的一种特殊形式。它跟传统DNN标志性的区别在于两点,卷积核(Convolution Kernel) 以及 池化层(Pooling)。

1.1 Convolution Kernel

说起 Convolution Kernel,首先要解释一下 Convolution(卷积),可以参考guide。一般我们接触过的都是一维信号的卷积,也就是

在信号处理中,$x[n]$是输入信号,$h[n]$是单位响应,于是信号$y[n]$就是输入信号$x[n]$响应的延迟叠加。这也就是一维卷积本质:加权叠加/积分。

那么对于二维信号,比如图像,卷积公式就成了如下公式:

假设现在 Convolution Kernel 大小是,我们就可以化简上式为:

公式看起来很复杂,用图来解释就很简单了,假如 Convolution Kernel 如下图:

那么,从 Input Image 到 Output Image 的变化如下:

可以看出,其实二维卷积一样也是加权叠加/积分。需要注意的是,其中 Convolution Kernel 进行了水平和竖直方向的翻转。

  • 卷积核的意义

    Convolution Kernel 其实在图像处理中并不是新事物,Sobel 算子等滤波算子,一直都在被用于边缘检测等工作中,只是以前被称为 Filter。图像处理的同学应该有印象。

    Convolution Kernel 的一个属性就是局部性。即它只关注局部特征,局部的程度取决于 Convolution Kernel 的大小。比如用 Sobel 算子进行边缘检测,本质就是比较图像邻近像素的相似性。

    也可以从另外一个角度理解 Convolution Kernel 的意义。学过信号处理的同学应该记得,时域卷积对应频域相乘。所以原图像与 Convolution Kernel 的卷积,其实对应频域中对图像频段进行选择。比如,图像中的边缘和轮廓属于是高频信息,图像中区域强度的综合考量属于低频信息。在传统图像处理里,这些物理意义是指导设计 Convolution Kernel 的一个重要方面。

  • CNN 的 Convolution Kernel

    CNN 中的 Convolution Kernel 跟传统的 Convolution Kernel 本质没有什么不同。仍然以图像为例,Convolution Kernel 依次与 Input 不同位置的图像块做卷积,得到 Output,如下图。

    同时,CNN 有一些它独特的地方,比如各种定义,以及它属于 DNN 的那些属性:

    1. CNN 可以看作是 DNN 的一种简化形式,Input 和 Output 是 DNN 中的 Layer,Convolution Kernel 则是这两层连线对应的w,且与 DNN 一样,会加一个参数 Bias
    2. 一个 Convolution Kernel 在与 Input 不同区域做卷积时,它的参数是固定不变的。放在 DNN 的框架中理解,就是对 Output Layer 中的神经元而言,它们的w和b是相同的,只是与 Input Layer 中连接的节点在改变。在 CNN 里,这叫做 Shared Weights and Biases
    3. 在 CNN 中,Convolution Kernel 可能是高维的。假如输入是m n k维的,那么一般 Convolution Kernel 就会选择为d d k维,也就是与输入的 Depth 一致
    4. 最重要的一点,在 CNN 中,Convolution Kernel 的权值其实就是w,因此不需要提前设计,而是跟 DNN 一样利用 GD 来优化
    5. 如上面所说,Convolution Kernel 卷积后得到的会是原图的某些特征(如边缘信息),所以在 CNN 中,Convolution Kernel 卷积得到的 Layer 称作 Feature Map
    6. 一般 CNN 中一层会含有多个 Convolution Kernel,目的是学习出 Input 的不同特征,对应得到多个 Feature Map。又由于 Convolution Kernel 中的参数是通过 GD 优化得到而非设定的,于是w的初始化就显得格外重要了
  • CNN 的 Pooling

    Pooling 的本质,其实是采样。Pooling 对于输入的 Feature Map,选择某种方式对其进行压缩。如下图,表示的就是对 Feature Map 2 * 2邻域内的值,选择最大值输出到下一层,这叫做 Max-Pooling。于是一个的 Feature Map 被压缩到了

    除此之外,还有Mean-Pooling,Stochastic-Pooling 等。它们的具体实现如名称所示,具体选择哪一个则取决于具体的任务。

    Pooling 的意义,主要有两点:

    第一个显而易见,就是减少参数。通过对 Feature Map 降维,有效减少后续层需要的参数

    另一个则是 Translation Invariance,也就是增大感受野。它表示对于 Input,当其中像素在邻域发生微小位移时,Pooling Layer 的输出是不变的。这就增强了网络的鲁棒性,有一定抗扰动的作用。

1.2 The way of convolution

  • Convolution


  • DepthWise Convolution

    DepthWise卷积主要还是为了减少网络的参数,使网络能够更好地部署到移动端。


  • Deformable Convolutional

    再接着,为了解决图像中可能呈现的不同大小、姿态、视角变化甚至费缸体变形,微软亚洲研究院(MSRA)提出了可变性卷积网络(Deformable Convolutional Networks)。

    标准的卷积中一般都是正方形,这种规则的采样是网络难以适应几何形变的主要原因。为了削弱这个限制,对每个点的位置都增加一个偏移变量,通过这个变量,卷积核可以在当前位置附近随意采样,不再受限于之前的规则格点。如下图:

    DCN中增加的偏移量是网络结构的一部分,通过另一个平行的标准卷积单元计算得到,进而也可以通过梯度反向传播进行端到端的训练。从下图更加直观的看到加入偏移后,卷积位置的变化特点:

    这种卷积结构在分割以及检测任务上都非常有效。笔者认为这种思想和Attention的思想(下面网络结构会介绍)有异曲同工之妙,都是想要在图像中找到关键信息,然后抑制无效信息。


  • Dilated Convolution

    Dilated Convolution(空洞卷积)设计之初最主要用于分割任务。传统的分割任务都会有pooling操作,这样是为了降低尺寸同时增大感受野,然后进行反卷积将feature map 还原到原尺寸,但是这个过程有一定的信息损失,所以空洞卷积应运而生。空洞卷积示意图如下:

    间隔大小取决于空洞率。DC最大的优势就是在不进行pooling操作的同时,扩感受野,相当于获得了多尺度的特征,因此在分割任务中很有效。

    但是最初的网络设计会导致The Gridding Effect。后面也有对此进行优化的文章Understanding Convolution for Semantic SegmentationRethinking Atrous Convolution for Semantic Image Segmentation

1.3 Upsampling

这里指的上采样(upsampling)是指为了让经过pooling操作的feature map恢复原有尺寸的operation。我总结是有两种方式,一种是untrainable的方式,如插值,还有一种是trainable方式,transposed convolution(转置卷积),也有人称作deconvolution,但是stanford class称不太准确。个人理解deconvolution是用已经训练好的kernel将output恢复到input的过程,常用于CNN可视化;而网络中常用到的这种operation只是为了恢复尺寸,用的仍然是普通的conv,只不过有一定的策略,下面会解释。

  • 插值

    插值操作不需要训练,权重由认为预先定义。常用的方式有nearest interpolation、bilinear interpolation、bicubic interpolation。

    1. nearest interpolation :将离待插值最近的已知值赋值给待插值。
    2. bilinear interpolation :根据离待插值最近的 2*2 个已知值来计算待插值,每个已知值的权重由距离待插值距离决定,距离越近权重越大。
    3. bicubic interpolation :根据离待插值最近的 4*4 个已知值来计算待插值,每个已知值的权重由距离待插值距离决定,距离越近权重越大。
  • Transpose

    Transpose是卷积操作的逆操作。策略有很多,具体参考动图

1.4 Conclusion

卷积方式是构成卷机网络的基石。随着研究的推进,已经不是简单的卷积结构堆叠能够完成所有的任务了。不同卷积方式构成的CNN网络有着不同的作用,所以在面对不同的任务是,选择合适的卷积方式就显得十分重要了。

2.0 The Development of Architecture

2.1 Summarize

CNN 的架构发展可以参考刘昕博士总结的图

下图中的坐标轴我们可以看出横坐标是操作的复杂度,纵坐标是精度

LeNet-5 是最经典的 CNN 架构,上面介绍的 Convolutional Kernel 和 Pooling 它都有了。它在1998年由 LeCun 提出,用于对“Mnist手写数字数据集”进行分类。不过效果并不比当时手工设计的特征有明显提升,因此并没有太大反响。

十来年后,Alex Krizhevsky 在2012年提出 AlexNet,凭借它在 ILSVRC2012 的 ImageNet 图像分类项目中获得冠军,且错误率比上一年冠军下降十多个百分点。举圈震惊。

随后几年,CNN 卷席整个图像处理领域,ILSVRC 每年被刷榜,也就出现了我们常见的这张错误率下降趋势的图。当然,也伴随着如图所示的 Layer 数的激增。

2.2 LeNet

LeNet5 是 LeCun 在1998年“Gradient-Based Learning Applied to Document. Recognition”中提出的网络架构。用于对“Mnist手写数字数据集”进行分类。其具体的结构如下图:

  • input 是一个手写图像。

  • C1 层由6个 Feature Map 组成,其中每个神经元与 Input 的的邻域相连。这些连接对应的w就是上面所说的 Convolution Kernel。当然,与 DNN 一样,这里还有一个参数 Bias b。所以,此层有(55+1)6=156个参数。而如果不使用共享权重,则会需要(5x5+1)x(28x28)x6 = 122304个参数。

  • S2 层即下采样层,对应着现在的 Pooling 操作后的层。其依然是6个 Channel,每个神经元与上一层2 \times 2的邻域相连。作者在此层进行的操作是加权平均,再加上 bias,并将结果输入到激活函数 Sigmoid 函数中。因此,此层共有2*6=12个参数。

  • C3 层由16个 Feature Map 组成,其中每个神经元与 S2 的5*5的邻域相连。不过,当时作者对连接进行了一些设计,让每个 Feature Map 仅与上一层部分 Channel 相连。只是这种 trick 现在也很少用到,这里就不细讲了。

  • S4 层也是下采样层,与 S2 是意义一样。由于有16个 Channel,因此共2*16=32个参数。

  • C5 层由120个 Feature Map 组成,其中每个神经元与 S4 每个 Channel 的的邻域相连。恰巧,这里 C3 的每一个 Feature Map 都是1*1,显得好像跟 S4 是全连接,不过这仅仅是恰巧罢了。

  • F6 由84个神经元组成,与 C5 全连接。并将结果输入到激活函数,得到每个神经元的状态。这里激活函数使用的是双曲正切函数(tanh)。此层共(120+1)84=10164个参数。而之所以使用84个神经元,是因为有人曾将 ASCII 码绘制于12 7的 bit-map 上,如下图,作者希望此层的输出有类似的效果。

  • Output 是10个神经元,分别代表十个数字。作者还使用欧式径向基函数(Euclidean Radial Basis Function)对数据进行了一些变换,有兴趣的同学可以自行参考原文。

网络结构设计好之后,选择 Loss Function,并利用 GD 学习网络参数,这些都是套路了。最后,LeNet-5 每一层的输出可以用以下这张图来辅助理解。

2.3 AlexNet

AlexNet 是 Alex Krizhevsky 于2012年在“ImageNet Classification with Deep Convolutional Neural Networks”中提出的网络架构。Alex Krizhevsky 凭借它在 ILSVRC2012 的 ImageNet 图像分类项目中获得冠军,错误率比上一年冠军下降十多个百分点。其具体的结构如下图,第一个图为作者论文中的辅助理解的图示,第二个图为将 AlexNet 每一层的细节进行总结的图。

从上图可以看出,AlexNet 在结构上没有大改变。它真正区别于传统 CNN 的,在于对网络参数的选择上,而其中很多方法如今依然在用:

  1. 不同于传统 CNN 使用 Sigmoid 或者 Tanh 作为激活函数,AlexNet 使用的是 Relu。Relu 能有效抑制 Gradient Vanish 以及 Gradient Explode 的问题,现在仍然是最常用的激活函数。
  2. AlexNet 开始使用了 Droupout 来防止过拟合,这是一种简单且有效减少过拟合的方法,如今依然是手常用方法之一。
  3. AlexNet 使用 LRN(Local Response Normalization)对网络中的数据进行归一化。当然现在 LRN 已经不太使用,使用的较多的是效果好得多的 Batch Normalization。但是 AlexNet 当时已经开始注意对数据进行归一化,这一点还是很厉害的。
  4. AlexNet 使用了 GPU 来加速网络中的运算,现在 GPU 来加速计算已经是标配了

AlexNet 中这些技巧,很多已经成了现在的标准方法,足见其影响力之大。

2.4 VGGNet

VGG与Alex很相似,都是卷积池化-卷积池化-…-全连接的套路,不同的是kernel大小,卷积stride,网络深度。

VGGNet将小卷积核带入人们的视线,分析一下卷积核的区别和优势:

在上面提到的第一个卷积层使用的kernrl大小为11$\times$11,stride为4,中间一些层用的都是5$\times$5卷积核,而现在VGGNet中卷积核大小为3$\times$3,stride为1。

直观上我们会觉得大的卷积核更好,因为它可以提取更大区域的信息,但是实际上,大的卷积核可以用多个卷积核叠加代替。这样的替代方式可以有两点好处:

  • 减少了参数的个数

两个串联的小卷积核需要3$\times$3$\times$2=18个参数,一个5$\times$5=25的卷积核则有25个参数。

三个串联的小卷积核需要3$\times$3$\times$3=27个参数,一个7$\times$7=49的卷积核则有25个参数。

大大减少了参数

  • 引入了更多的非线性

多少个串联的小卷积核就对应着多少次激活的过程,而一个大的卷积核就只有一个一次激活的过程。引入了更多的非线性变换,也就意味着模型的表达能力会更强,可以去模拟更高维的分布。

VGGNet相比于AlexNet层数更深,参数更多,但是却可以更快的收敛。

2.5 GoogLeNet

GoogLeNet 其实属于 Inception 网络结构系列,其启发是 NIN(Network In Network),而后整个 Inception 系列共发展出四个版本。这里,先简单介绍这几种结构。


  • NIN

  NIN 出自文章“Network in Network”,主要是提出了两点新的构想,以下简单描述:

  1. 使用多层$1\times 1$的 Convolution Kernel,来代替传统 CNN 一层的若干个$N \times N$的 Convolution Kernel。原因在于,单层的 Convolution Kernel + Activation 只是扩展的线性变换,表达能力有限;但是多层 Convolution Kernel + Activation 的堆叠,后面几层的抽象能力会大大增强,所以表达能力比以前强,而参数可能还比以前少
  2. 使用 Global Average Pooling 代替传统 CNN 中最后一层的 Fully Connected 层,其中 Global Average Pooling 表示取每个 Feature Map 的均值。因此,对多类分类,最后一层的每个 Feature Map 即对应一个类别,在大大减少了 CNN 参数的同时,强制 Feature Map 学习不同类别的特征

  • Inception V1,BN,V3,V4
  1. GoogLeNet 就是 Inception V1,出自2015年的“Going Deeper with Convolutions”。它继承并扩展了 NIN 中使用小 Convolution Kernel 来代替或者表示大 Convolution Kernel 的思想,在网络能力不减的情况下大大降低参数量
  2. Inception BN 出自2015年的“Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift”。在本文中,作者提出了大名鼎鼎的 Batch Normalization,现在是 DNN 调参的一个重要手段,提高了 DNN 对参数的稳定性。
  3. Inception V3 出自2016年的“Rethinking the Inception Architecture for Computer Vision”。其在 Inception V1 的基础上,利用 Factorization 进一步降低 Convolution Kernel 中的参数数量
  4. Inception V4 出自2016年的“Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning”。如其名所说,它就是结合了 Inception 和 ResNet 的思想。

可以看出,除了 Inception BN 主题有点跑偏,其他的 Inception 都是在 GoogLeNet 的基础上的改进。所以,以下我会详细介绍 GoogLeNet。

  • InceptionV1(GoogLeNet)

来自于文章《Going deeper with convolutions

GoogLeNet 最大的特点就是下面这种结构,暂且称之为原始的 Inception。

可以看出它本质跟 NIN 一样,使用 Network 来代替原来的一个 Convolution Kernel。但跟 NIN 只使用$1\times 1$不同,这里使用了更大的 Convolution Kernel,以及 Pooling Layer,原因在于提取视野更大、或者提取类型不同的特征。但是由于这种 Network 的参数会非常大,所以作者先进行了降维,就得到了真正的 Inception 结构,如下图:

$1\times 1$Kernel 在这里的作用就是为了在叠加 Inception 模块时,不至于让网络参数数量爆炸,所做的降维。在理解了 Inception 模块后,整个 GoogLeNet 的结构上就很容易看懂了,基本就是 Inception 模块、Pooling Layer 的不停叠加而已。其结构如下图(大图预警):

上图中我们能看到有一点比较特殊,就是除了最上层的 softmax2 分类器外,中间还有一些层连接了分类器(softmax0、softmax1)。

按照作者初期的说法,这是因为网络太深,Gradient Vanish 导致无法高效的更新参数,所以加了两个较浅的分类器辅助 BP 以加快网络收敛速度。可是在 Inception V3 中,作者发现其实它们对网络收敛速度并没什么帮助,更多的是起到了 Regularizer 的作用。

Inception 提出了新的 CNN 结构,并在 ILSVRC2014 使错误率再创新低。可它在深层网络 Gradient Vanish 的问题上并未找到好的解决办法,这就制约了网络进一步的加深。就在大家看似都一筹莫展时,另一个大佬微软笑着掏出了 ResNet。在介绍完所有inception网络之后会介绍ResNet。


  • InceptionV2(BN) and InceptionV3

来自于文章《Rethinking the Inception Architecture for Computer Vision》和《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

V2和V3都出自于同一篇文章,只是里面的Inception架构有所不同,思路大致相同,在这里就不严格区分。

在V2模型中,主要针对V1进行了两点改进:

  1. 加入了Batch Normalization层,减少了Internal Covariate Shift(内部数据分布发生变化),使每一层的输出都规范化到一个N(0, 1)的高斯分布;
  2. 用多个更小的3*3的kenel代替较大的kernel,即降低了参数数量,也加速了运算。

值得注意到的是,在加入BN层之后,网络在做卷积运算时可以不用添加bias参数。原因会在另一篇介绍BN的文章中做具体证明。

具体的inception结构如下:

在v3模型中,一个重要的改进是分解操作(Factorization),即将n*n的卷积操作分解为1*n和n*1的卷积。如下图:

结构图如下:


  • InceptionV4

InceptionV4结构是吸纳ResNet精华,结合之前构建Inception的思想,开发出了InceptionV4网络,同时还设计了更深更优化的Inception-ResNet-V2模型。

Inception-resnet-v1 and Inception-ResNetv2都是用的这个结构图,区别在于下图的注释中,

上图具体提到的Inception结构请在论文中查看。

个人觉得到V4这个结构,越来越复杂,其实也很难从理论上解释哪个结构好,哪个结构差,都是以结果论英雄。那么,对于那些没钱买机器的小团队就只能跟着大佬走了。

2.6 ResNet

ResNet 出自“Deep Residual Learning for Image Recognition,2016”。它源于作者一些实验:在 Relu、BN 已经缓解了深层的网络无法收敛的问题后,随着网络层数的增加,训练和测试错误率仍然呈现先减后增的趋势。这时,就不再是过拟合的问题,而表明太深的网络其参数难以优化。比如对于恒等变换$H(x)=x$,更深的网络其对此函数的拟合效果甚至不如较浅的网路。

为了解决上述$H(x)=x$难以拟合的问题,作者提出了一种设想:我们不去拟合$H(x)$,改之去拟合$F(x)=H(x)-x$。而最终网络输出的是$F(x)=H(x)+x$,如下图:

这种做法会涉及到两个问题:

  1. 在恒等变换中我们拟合的函数变成了F(x)=0,它为什么比原始的H(x)=x更容易拟合呢?作者表示,此时参数们只需要逼近0即可,这看起来比优化到其他值简单(这个虽然抽象,但似乎还有点道理)
  2. 实际情况中$H(x)$不太可能都是恒等变换,这种拟合残差的做法为何有好处呢?作者表示,首先我们要假设它更好优化,其次我们的实验证明了它确实效果更好。

RessNet 在起初时的理论匮乏。其实在后续,分析其理论依据的文章也相继有提出,如:

  1. 在“Identity Mappings in Deep Residual Networks,2016”中,作者从实验和理论两方面来说明为什么 ResNet 使用 Identity Mappping 来计算残差是合理的,且稳定性更强,如下图。
  1. 在”Residual Networks Behave Like Ensembles of Relatively Shallow Networks,2016“中,作者则用实验表明 ResNet 可能效果显著的原因在于其 Ensemble 的性质,即它的 Shortcut 层可以看作多种不同的路径的 Ensemble,如下图。同时作者也表示 ResNet 真实选择路径时其实选的都是较短的路径,因此本质上并不算解决了深层网络 Gradient Vanish 的问题

无论如何,ResNet 虽然理论不足,却被大量检验证明能有效改善网络参数的优化,一方面是即使网络深度剧增依然能够很好的学习参数,保持较好的网络分类效果;另一方面,参数收敛速度也更快。最终的 ResNet 架构如下,可以看出层数已经超深了(大图预警)

2.7 Xception

总的来说,Xception网络基于Inception系列网络结构的基础上,结合depthwise separable convolution。

首先对于原始的inception模块,可以表示成如下:

模块中,基本上先通过一系列1x1卷积降维,然后再通过3x3卷积提取特征。如果我们将上述结构再进行简化,可以得到如下简化结构:

从上图中我们可以看出,1x1卷积将输入数据的channel维度上进行了拆解,再输送到空间卷积3x3,改写成下图:

可以考虑一种更加极端的情况:3x3卷积在1x1卷积后的每一个通道上运行,则有:

其实这个思想跟depth wise非常相似,只是顺序不同

  • depth wise separable convolutions:先进行channel-wise 空间卷积,然后1x1卷积进行融合

  • Inception:先进行1x1卷积,然后进行channel-wise空间卷积

  • depthwise separable convolution:两个操作之间没有激励函数

  • Inception:两个操作之间,添加了ReLU非线性激励

作者提到,前两个区别影响不大,因为模块是堆叠起来的,多层堆叠后顺序的影响不大了。但后两个影响还是比较明显的,

整体模型如下:

整体效果比inceptionV3略胜一筹。具体实验验证参考原文吧。

2.8 DenseNet

  • Dense Block

如图所示就是Dense Block,它包括输入层在内共有5层,H是BN+ReLU+3$\times$3Conv的操作,并不改变feature map的大小。对于每一层来说前面所有层的feature map都直接被拿来当做这一层的输入。grouth rate就是除了输入层之外,每一层feature map的个数。它的目的是,使得block中任意两层能够直接沟通。

在Dense Block输出的地方还有一个bottleneck layer中的操作是一个1$\times$1的卷积,卷积核共有4K个,降低channel维度,也减少了模型参数。

在transition layer中进一步压缩的操作称为compression,减少$\theta$%的feature map数量,论文中使用的是$\theta$=0.5

  • DenseNet

DenseNet其实就是若干个DenseBlock串联起来而得到的,在每个DenseBlock之间有一个Conv+Pooling的操作,也就是上面所说的是transition layer。transition layer存在的意义就是实现池化层。

  • 为什么ResNet到DenseNet

ResNet直接通过“summation”操作将特征加起来,一定程度阻碍了网络的信息流。DenseNet通过连接操作来结合feature map,并且每一层都与其他层有关系,都有“沟通”,这种方式使得信息流最大化。

2.9 SENet

  • Squeeze-and-Excitation Networks 主要利用attention机制来构造网络。SE-block如下图。
  • 图中的 $F_{tr} = \rm{X} \to \rm{U}$ 就是普通的卷积网络操作。$F_{sq}(\cdot)$是Global Average Pooling,也就是作者称的Squeeze过程。然后将$1\times 1 \times C$的vector通过$F_{ex}(\cdot,\rm{W})$即两级全连接层,,也就是作者称的Excitation过程。最后用sigmoid(文中提到的self-gating mechanism)限制到$[0,1]$的范围,把这个值作为scale乘到U的C个通道上。作为下一级的输入数据$\widetilde{\rm{X}}$。

  • 简而言之,模块的核心思想就是想通过控制scale的大小,把重要特征增强,不重要的特征减弱,从而提取更好的特征。

  • $F_{sq}(\cdot)$的实现方式有很多,论文利用如下公式:

  • 将SE-block加到inception结构和resnet结构中组成SE-Net,如下图:
  • 论文中还有SE-block的很多种形式,如下:
  • 文中的实验也做得十分到位,干货十足,有理有据,值得学习一下。

2.10 RAN

Residual Attention Network for Image Classification提出了一种基于attention机制的网络,和SE-NET又有些不一样。

  • 提出一种可堆叠的Residual Attention Module模块,可以通过模块堆叠可以达到比较深的层次。
  • 提出一种基于Attention的残差学习方式,因为直接进行Attention Module的堆叠使得性能下降。

  • 具体的结构通过如下图可以看得非常清楚:

  • Attention Module如下图:

    值得注意的是Soft Mask Branch最后的激活函数是sigmoid,其目的就是将像素值压缩在[0,1]范围,对结果比较重要的像素权重高,对结果不重要的权重低。但是注意到连续多个的Module直接相乘会导致feature map的值越来越小,使网络性能降低,所以在这里借鉴ResNet等映射方法,最终的输入为(1+M(x))*T(x)。

  • 其效果如下:

2.11 NonLocalNet

Non-local Neural Networks提出了一个新的block,可以捕获远程的依赖关系。与其说提出一个模型,不如说是基于前面工作提出的一个思路,根据这个思路可以设计出很多具体的实例模型。

a non-local operation computes the response at a position as a weighted sum of the features at all positions in the input feature maps

  • 抽象来说,可以用下面公式来表示Non-local思想。

    其中$i$ 表示输出position(可以表示空间的,时间的或时空连续的)的index, $j$表示所有可能position的index。$\rm{x}$表示输入的信号(可以是图像,序列,视频,经常是featuremap)。$f$是用来计算一个scalar(用来表征position之间的关系)。$g$用来估计一个输入信号在position$j$的表示。然后对整个结果进行标准化。

  • 实例化,将上面抽象的idea转化为具体的模型。

    令$g(\rm{x}_j) = W_gx_j$,其中$W_g$是一个参数矩阵,例如1*1的卷积层。

    $f(\rm{x}_i,\rm{x}_j) = $有很多表示方法,具体参见原文。

  • 上面都是理论分析。运用到神经网络中如下图,也是论文中做实验用到的block。这样就方便将这个block运用到其他网络。

    其中$ z_i = W_z \rm{y}_i + x_i$,这里是用了resnet的skipconnection结构。

  • 然后作者利用这个block重新build一些模型进行测试,当然效果都还不错。

2.12 WCD

WCD是AAAI2019的一篇关于神经网络结构的工作。思路和attention机制有些类似。

  • WCD主要思想如下:

    1. 首先对前一层输出的通道进行评级,为每一个通道进行打分。打分通过全局平均池化得到的。
    2. 然后,生成一个mask,抑制部分节点,保留部分节点。
    3. 最后,使用一个额外的随机数生成器来进一步为下一层过滤通道。
  • WCD不依赖任何参数,仅用少量的计算成本就可以添加到训练阶段的网络

  • WCD仅作用于训练阶段,不影响inference。
  • 和SENet非常类似,WCD只不过当作训练阶段的小插件。

2.13 BagNet

BagNet是ICLR2019的一篇关于CNN可视化的工作,关注度比较高。作者发现基于小型局部图像特征分类的简单模型可以在ImageNet上实现惊人的高准确率。论文作者认为,这表明过去几年DNN的进步大部分是通过调参取得的。

  • 下面是整个模型的pipline:

    1. 将输入图像截取为33*33像素的图像块;
    2. 在每一个截取的图像块上使用深度网络(1*1卷积)获得类别向量;
    3. 按空间对所有输出的类别向量进行求和(所有截取的图像块);
    4. 通过类别向量最大的元素预测类别。
  • BagNet 在使用 33×33 像素的图像块时效果好于 17×17 的图像块(80%)。所以深度网络确实抽取了有用的空间信息(9x9 vs. 17x17 vs. 33x33),但可能不是我们以前想像的全局空间范围(例如 112×112 或 224×224).

  • BagNet 模型的空间敏感特征并不会超出 bagging 步骤,这就引出了一个问题:深度网络最强大的能力是否还仅来自于对局部特征的处理。深度网络仅仅和这种不考虑全局空间信息的 BagNet 相同吗?如果是的话,那么深度卷积网络还有很长的路要走。

  • 论文给出的模型细节不是很具体,源码也没有给出如何训练出来模型的,难以复现,但是大致的思路就是把一整张图像分成局部进行分类,忽视掉空间信息。和CNN的思想有些背道而驰的意思。

2.13 SBNet(2019.03.20)

SBNet是cvpr2018的一个工作,主要目的为了推理加速,更加适应于移动端部署,思路和上面的bagnet有些相似之处,都是将目标分割成几个部分做判断。

  • 思路主要是根据已知或者预测的binary mask(attention),对feature map进行blockwise 分解,生成稀疏块以及对应的 tile indices。

    将这些稀疏块聚集在一起形成新的tensor,通过卷积操作后将结果分散回原先的位置,并更新原始tensor

  • 可以看到,只对mask对应的稀疏块进行卷积,大大提高了系统的运行效率。

  • 作者拿出自动驾驶的3D场景数据进行了mask分析。个人觉得在2d部分同样也应该work。
  • idea非常有趣,但是需要更进一步的验证和运用。相信在工业上的运用应该会很广泛。

3.0 Model Compression

3.1 Summarize

模型压缩是非常有落地价值的研究方向。因为对于移动端的部署具有重要的意义,有效的降低了计算资源的消耗,使得基于深度学习的方法能够大面积运用。

模型压缩大致可以分为两种思路:

  • 前端压缩:知识蒸馏,结构设计,剪支处理。
  • 后端压缩:低秩近似,未加限制的剪支,参数量化,二值网络。

3.2 SqueezeNet

SqueezeNet这个算是比较偏早期的工作。想法也比较简单,尽可能使用1*1和3*3的卷积模块。

  • SqueezeNet提出了fire module。如下图:

  • 整体的网络架构基本都是由fire module组装。

3.2 MobileNet

MobileNet是google系的轻网络。

  • 采用深度可分离卷积(DepthWise可以在减少参数的同时提升运算速度。但是由于每个channel的feature map只被一个卷积核卷积,所以channel之间的信息无法得到交流。所以之后会有一个PointWise层(1*1卷积核的卷积层),来搭建channel之间的信息交流。
  • 采用stride=2的卷积替代pooling层。提升运算速度,这个idea还是比较work的。
  • 具体的模块见上面卷积的那一部分,图示比较清楚了。
  • MobileNet的具体模型如下图。

3.3 MobileNetV2

MobileNetV2是针对MobileNet的改进。

  • 采用inverted residuals。在resnet中,res block先经过1*1降channel的维数,然后再经过3*3的卷积层,最后经过1*1再讲channel扩张到原维数。而inverted residuals则是反其道而行,先扩张后压缩。之所以会选择这种方式,是因为MobieNet采用DW方式提取特征,特征量已经压缩,如果再压缩,信息量急剧下降,会导致结果变差。两者的比较如下图。

  • 采用linear bottlenecks。ReLu激活函数的半抑制性会一定程度的阻碍信息的流通,因此在block的最后一层会使用线性函数来保留整个特征的信息。不仅如此,还借鉴了resnet的shortcuts增加信息的流通。block对比图如下:

  • 网络的模型如下表:

3.4 ShuffleNet-v1

ShuffleNet-v1是face++团队推出的基于移动端的轻量级网络。主题思路是利用group convolution。

  • 采用group convolution减少大量参数。但是单纯的group和DW存在信息阻塞。
  • 采用channel shuffle来增强信息交流。论文中也给出了实验得结果,确实能够提高性能。

  • 采用concat替代add的channel叠加操作。增加信息量。

  • ShuffleNet的模型如下表:

3.4 ShuffleNet-v2

ShuffleNet-v2是基于ShuffleNet-v1的网络。

  • 论文提出影响神经网络速度的四个因素。

    1. FLOPs(FLOPs就是网络执行了多少multiply-adds操作)
    2. MAC(内存访问成本)
    3. 并行度(如果网络并行度高,速度明显提升)
    4. 计算平台(GPU,ARM)
  • 基于此,提出了四种思路:

    1. 输入输出的channel相同时,MAC最小
    2. 过度的组卷积会增加MAC
    3. 网络碎片化会降低并行度
    4. 元素级运算不可忽视
  • ShuffleNet V2提出channel split。将输入的channel分为两部分,其中没有做任何操作的一部分与经过几层卷积操作的channel组合,之后再shuffle,见下图c。对下采样的block,见图d,少了channel split。这两个block组成了ShuffleNet V2。

  • 具体的网络结构如下:

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2019 JimmyYoung's Blog All Rights Reserved.

UV : | PV :