轻量化模型
Mobile系列
MobileNetV1
MobileNetV1之所以轻量,与深度可分离卷积的关系密不可分
深度可分离卷积 主要是两种卷积变体组合使用,分别为逐通道卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)。
逐通道卷积的一个卷积核只有一个通道,输入信息的一个通道只被一个卷积核卷积,这个过程产生的feature map通道数和输入的通道数完全一样
逐通道卷积虽然减少了计算量,但是这种每个通道独立的卷积运算失去了通道维度上的信息交互。因此需要Pointwise Convolution来将这些Feature maps进行组合生成新的Feature maps
逐点卷积的运算与常规卷积运算非常相似,其实就是1X1的卷积,将上一步的feature maps在通道方向上进行加权组合,生成新的feature map
深度可分离卷积的参数个数是常规卷积的约1/3,计算量也是常规卷积的约1/3
MBConv:深度可分离卷积的基本结构
MobileNetV2
V2 中主要用到了 Inverted Residuals 和 Linear Bottlnecks
ResNet 在模型中引入旁路并取得了很好的效果,因此到了 V2 的时候,作者也想引入进来
要把 ResNet BottleNeck Block 运用到 MobileNet 中来的话,如果我们还是采用相同的策略显然是有问题的,因为 MobileNet 中由于逐通道卷积,本来 feature 的维度就不多,如果还要先压缩的话,会使模型太小了,所以作者提出了 Inverted Residuals,即先扩展(6倍)后压缩,这样就不会使模型被压缩的太厉害
Linear Bottlnecks就是把 Inverted Residuals block 中的 bottleneck 处的 ReLU 去掉
那为什么要去掉呢?而且为什么是去掉最后一个1X1卷积后面的 ReLU 呢?因为在训练 MobileNet V1 的时候发现最后 Depthwise 部分的 kernel 训练容易失去作用,最终再经过ReLU出现输出为0的情况
1X1卷积降维操作本来就会丢失一部分信息,而加上 ReLU 之后那是雪上加霜,所以去掉 ReLU 缓一缓
MobileNetV3
在V2上的调整是基于NAS技术的:设计一个网络模型结构的集合,通过不同网络层的排列组合可以组合出许多许多的模型,再通过NAS搜索技术搜索出最佳的网络结构
原始的结构用 1x1 的卷积来调整 feature 的维度,从而提高预测的精度,但是这一部分也会造成一定的延时,为了减少延时,作者把 average pooling 提前,这样的话,这样就提前把 feature 的 size 减下来了(pooling 之后 feature size 从 7x7 降到了 1x1)。这样一来延时减小了,但是试验证明精度却几乎没有降低
换了个激活函数 h-swish:
ReLU6就是普通的ReLU但是限制最大输出值为6(对输出值做clip),如果对ReLU的激活范围不加限制,当激活值非常大,分布在一个很大的范围内时,低精度的float16无法很好地精确描述如此大范围的数值,带来精度损失
增加了 SE 结构,并且将含有 SE 结构部分的 expand layer 的 channel 数减少为原来的 1/4 以减少延迟
RepViT
轻量级 ViTs 优于轻量级 CNNs 的原因通常归结于多头注意力模块,该模块使模型能够学习全局表征。然而,轻量级 ViTs 和轻量级 CNNs 在块结构、宏观和微观架构设计方面存在值得注意的差异,但这些差异尚未得到充分研究。这自然引出了一个问题:轻量级 ViTs 的架构选择能否提高轻量级 CNN 的性能?
首先将训练条件与轻量级 ViTs 对齐,接着我们对 MobileNetV3-L 的块结构进行优化。进一步,我们在宏观尺度上进行设计,包括主干、降采样层、分类器和各阶段块数目比例。最后,我们在微观尺度上调整网络,包括卷积核大小选择和 SE [8] 层位置,下图展示了我们在每个步骤的中获得的延迟和精度结果