精细网络结构设计相关研究 - glqglq/ml_dl_wiki GitHub Wiki

组件

pooling

  • 局部信息很难提供更高层的语义信息,因此对feature map降维,进而增大后面各层kernel的感受野是一件很重要的事情。
  • pooling也可以提供一些旋转不变性。
  • max pooling更常用,更像是进行了一些特征选择,选取了分类辨识度更好的特征。

global average pooling

  • 会造成收敛速度减慢
  • 没有参数,减少参数量
  • 对整个网络从结构上做正则化防止过拟合
  • 保留了由前面各个卷积层和池化层提取到的空间信息
  • 更符合CNN的工作结构,把每个feature map和类别输出进行了关联,而不是feature map的unit直接和类别输出进行关联。

[2017-aixiv]MobileNet V1

Motivation

  • 神经网络太大,时间、空间效率低,难以部署。
  • 很多小网络论文只考虑大小,不考虑加速。

Related works

  • 量化哈希
  • 向量分解
  • 蒸馏
  • 剪枝
  • 直接设计小模型:
    • 网络分解:Inception、Flattened networks、Factorized Networks、Xception
    • bottleneck:squeezenet
    • 其余:structured transform networks、 deep fried convnets
    • 低比特网络

Method

  • depthwise separable conv:打破输出通道数和卷积核尺寸直接的交互(break the interaction between the number of output channels and the size of the kernel)。
    • depthwise conv:单个filter,是真正意义上的二维卷积,用于filte。
    • pointwise conv:多个1×1的filter,用于将depthwise layer的输出进行linear combine,生成新feature。
    • 时间复杂度:主要集中在pointwise conv(95%),可以用GEMM实现(不需要reordering)。
    • 空间复杂度:主要集中在pointwise conv(75%)。
  • 网络结构
  • Width Multiplier:每层输入输出的filter规约为αM、αN个filter。
  • Resolution Multiplier:β每层输入的feature map规约为βSize。

实验

  • 别用weight decay,少用正则化、数据增强,因为网络本来就很小。

[2018-CVPR]MobileNet V2

Motivation

  • 神经网络太大,时间、空间效率低,难以部署。
  • feature map经过激活层后称之为manifold of interest,可以理解为感兴趣流形或有用的信息,现有假设manifold of interest完全可以压缩到低维子空间。在V1版本中便可以通过width multiplier parameter来降低激活空间的维数使得manifold of interest充满整个空间。神经网络里的非线性变换会破坏这个,造成信道崩溃,但是某信道丢失的信息可以由别的信道弥补。
    • 如果manifold of interest经过ReLU后均为非零,意味着只经过了一个线性变换
    • 除非input manifold位于输入空间的低维子空间,经过ReLU后才能保持完整的信息
  • 在bottleneck中的1×1卷积后使用非线性层会降低模型表现:

Related Works

  • 手动架构搜索
  • automl:生成的网络太复杂
  • 剪枝
  • 直接设计小模型:大多数修改卷积。

Method

  • Inverted residual block(bottleneck with expansion layer):该block进入block后会先将特征维数放大,然后再压缩回去,呈现梭子的外形,而传统残差设计是沙漏形。升维后的relu信道损失少。 image

    • 使用shortcut:提升梯度反传能力。
    • 1×1的扩张层(expansion layer):目的是为了提升通道数,获得更多特征。因为Expansion layer 和 Projection layer都是有可以学习的参数,所以整个网络结构可以学习到如何更好的扩展数据和从新压缩数据,节约显存。
    • depthwise layer:
    • 1×1的线性层(projection/bottleneck layer):目的是压缩数据,让网络从新变小。从高维向低维转换使用ReLU激活函数可能会造成信息丢失或破坏,用线性分类器可以避免丢失信息。
    • 当内层深度为0时,由于快捷连接,底层的卷积就是身份函数。当扩展比小于1时,这是经典的残差卷积块。
    • 时间复杂度:和V1相比有所提升,但是V2的block允许更低的输入输出维度。
  • 网络结构:

    • 针对stride=1 和stride=2,在block上有稍微不同,主要是为了与shortcut的维度匹配,因此,stride=2时,不采用shortcut。除了最后的avgpool,整个网络并没有采用pooling进行下采样,而是利用stride=2来下采样。
    • 除第一层、最后一层外,我们在整个网络中使用恒定的扩展速率。
    • 使用relu6保证网络在低精度计算中的鲁棒性。
    • 5到10之间的扩展速率会导致几乎相同的性能曲线,较小的网络在较小的扩展速率下效果更好,而较大的网络在较大的扩展速率下性能稍好。
    • bn、dropout。

实验

推理

[2019-ICCV]MobileNets V3

Related Works

  • 小网络设计:ShuffleNet、SqueezeNet、CondenseNet、ShiftNet
  • 知识蒸馏
  • 量化

Method

  • depthwise conv使用senet:通过控制scale的大小,把重要的特征增强,不重要的特征减弱,从而让提取的特征指向性更强。
    • squeeze(gap):最终的scale是对整个通道作用的,这就得基于通道的整体信息来计算scale。另外作者要利用的是通道间的相关性,而不是空间分布中的相关性,用GAP屏蔽掉空间上的分布信息能让scale的计算更加准确。
    • excitation(dense+relu+dense+sigmoid):为了利用通道间的相关性来训练出真正的scale。一次mini-batch个样本的squeeze输出并不代表通道真实要调整的scale值,真实的scale要基于全部数据集来训练得出,而不是基于单个batch,所以后面要加个全连接层来进行训练。只有GAP的分支是完全没有反向计算、没有训练的过程的,就无法基于全部数据集来训练得出通道增强、减弱的规律。
  • Platform-Aware NAS来确定初始大网络(种子网络)结构:由于acc、lat在小网络中会不稳定地变化,需要更小的w=-0.15来弥补不同lat下acc变化较大较大带来的问题。
  • NetAdapt来确定最终小网络结构:
    • 算法:每步迭代直到达到target latency:生成一堆降低延时大于δ=0.01L(L是大网络)的候选、将大网络的权重截断后载入候选网络、finetune候选网络T=1000步获得metric、候选中挑选最优小网络。收敛后重新训练小网络。
    • metric:改为Δacc/Δlatency
    • 两个(倾向?):减少膨胀层的尺寸、减少所有block中的瓶颈层来维护残差连接。
  • 网络结构 image
    • 尾部:在mobilenetv2中,在avg pooling之前,存在一个1x1的卷积层,目的是提高特征图的维度,更有利于结构的预测,但是这其实带来了一定的计算量了,所以这里作者修改了,将其放在avg pooling的后面,首先利用avg pooling将特征图大小由7x7降到了1x1,然后再利用1x1卷积提高维度,这样就减少了7x7=49倍的计算量。并且为了进一步的降低计算量,作者直接去掉了前面纺锤型卷积的3x3以及1x1卷积,进一步减少了计算量,就变成了如下图第二行所示的结构,作者将其中的3x3以及1x1去掉后,精度并没有得到损失。这里降低了大约15ms的速度。
    • 头部:头部的filters两两之间有冗余,修改头部卷积核channel数量、使用不同的非线性函数(swish)来减少冗余。
  • swish的应用:
    • 公式:swish(x)=xσ(x)
    • 优化:由于σ计算代价大,swish需要优化。用RELU6(x+3)/6来代替σ。
    • 优点:优化后可以在任何软硬件平台进行计算;量化时消除了潜在的精度损失;使用h-swish替换swith在量化模式下回提高大约15%的效率。
    • h-swish在深层网络中效果更加明显。

[2018-CVPR]ShuffleNet V1

Motivation

  • 1*1卷积计算昂贵,用组卷积,但是每组卷积操作独立,特别是在小网络中更会削弱表示。

Method

  • shuffle组卷积:

    • 方法:分组卷积后进行shuffle。
    • 实现:对于一个卷积层分为g组,有g×n个输出通道。reshape为(g,n),再转置为(n,g),平坦化,再分回g组作为下一层的输入。
  • block:

    image

    • 计算量:ShuffleNet unit只需要hw(2cm/g+9m)FLOPS。
    • 由residual block改的。
    • 在第一个pointwise conv后加入channel shuffle。
    • 第二个pointwise conv用来恢复通道维度来和shortcut对齐。为了简化,后面不接shuffle操作,接了也没提升。
    • 3×3、第二个1×1卷积不用relu。
  • 网络结构: image

[2018-ECCV]ShuffleNetV2

Motivation

  • FLOPs相同,可能导致推理时间不同,FLOPs是间接度量,有以下若干原因。
    • memory access cost(MAC)不同:对于组卷积等操作,这在算力强的设备上可能有瓶颈。
    • 并行度
    • 平台底层加速实现。
    • FLOPs只考虑乘加,一些shuffle等操作没算上。
  • shufflenet中的pointwise组卷积和瓶颈结构增加了MAC。

Method

  • 四个减少MAC的守则
  • block设计:
    • channel shuffle用于两个分支的信息交互。
    • gap前新加的卷积层用于特征混合(mix up)。
    • 一半的特征直接送入下一个block,这可以看作是特征重用。随着层数增加,特征重用呈指数衰减,第i和第i+j个block之间直连channel数目为{[(1-c')c]^j}c。
  • 网络结构

[2016-arxiv]SqueezeNet