精细网络结构设计相关研究 - 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)。
- 网络结构
- 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信道损失少。

- 使用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中的瓶颈层来维护残差连接。
- 网络结构
- 尾部:在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:

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

[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。
- 网络结构