GhostNet由华为诺亚方舟实验室于2019年11月底提出,投稿于cvpr2020,后面2022年,2024年相继提出更新版本GhostNetv2和GhostNetv3。
它们参数量、复杂度及ImageNet的top1结果对比情况如下:
文章目录
- 1、GhostNetv1
- 1.1 Ghost Module
- 1.2 实验
- 2、GhostNetv2
- 2.1 DFC注意力模块
- 3、GhostNetv3
1、GhostNetv1
论文地址:https://arxiv.org/abs/1911.11907
代码:https://github.com/huawei-noah/ghostnet
由于内存和计算资源的限制,深度学习模型在嵌入式移动端部署是比较困难的,它要求模型既要计算量小又要精度高。以往的方式大多是通过减少模型的冗余特征来缩小模型,例如剪枝、模型压缩等,这些方式都会一定程度上损失精度。作者意识到特征图的冗余性是精度的必要保证,一定程度的特征冗余是对模型有利的。作者通过分析ResNet50某层生成的特征图看到,特征图之间的冗余,一个特征图可通过另一个特征图简单变换就可以得到,如下图:
所以作者想通过简单的操作替代常规卷积生成的冗余特征,这个简单的操作就是某种线性变换(其实卷积就是一直线性变换),而这种线性变换通过作者提供的代码可以看出就是depthwise卷积。 题外话,网上很多人说这个改进很“灌水”,但我认为能从特征图冗余性出发考虑改进的点很新颖,为了精简模型,大家默认做法都是尽量去掉冗余特征图,而作者却认为冗余特征图也需要保留,虽然作者提出的改进的方式没有太多创新性,但能发现从哪里改进,这才是论文最大的贡献。
1.1 Ghost Module
论文最大创新点就是提出了Ghost module,它和常规卷积的对比如下图所示:
对于相同的输入X∈Rcxhxw,输出Y∈Rnxh’x w’ ,上图(a)的常规卷积f可表示为f∈Rcxkxkxn,而图(b)的Ghost模块中卷积f’可表示为f’∈Rcxkxkxm,这里m≦n,代码中m等于n/2,后面的Ф操作是对前一层特征图结果的线性变换,最后两者再concat组合。看代码比较清晰,如下图:
在得到相同通道输出条件下,和常规卷积比较,Ghost确实可以减少参数量,也加深了网络深度,这可能就是网络能保持精度不下降的原因吧。
Ghost bottleneck的结构如下:
左图为stride=1,即输入输出特征图大小一致,右图为stride=2,即对输入特征图做两倍下采样。
整体GhostNet结构如下:
1.2 实验
GhostNet与其他轻量级模型在ImageNet数据集上的比较结果:
GhostNet与其他轻量级模型的TFLite版本在基于arm的手机端推理耗时情况如下,可以看出,GhostNet是比MobileNetv3又快又好的。
2、GhostNetv2
论文地址:https://arxiv.org/abs/2211.12905
代码:https://github.com/huawei-noah/Efficient-AI-Backbones/tree/master/ghostnetv2_pytorch
GhostNetv2发表于NeurIPS 2022,是GhostNet的改进版本,作者注意到卷积运算只能捕获窗口区域的局部信息,阻碍了性能的进一步提高,所以在卷积中引入自注意机制捕获全局信息,为了不增加耗时,作者提出了DFC attention模块,该方法基于全连接层,不仅可以在普通硬件上快速执行,而且可以捕获远程像素之间的依赖关系。通过引入DFC attention得到GhostNetv2,在ImageNet数据集上精度及推理耗时都得到了进一步改进,如下图:
基于注意力的方面最近被引入图像识别领域,比如ViT、MobileViT等,典型的注意力模块通常具有与特征大小相关的二次复杂度,这导致在下游任务如目标检测/分割等不能应用高分辨率去推导。作者为了验证加入注意力机制的影响,为GhostNet模型加入了MobileViT中使用的自注意力模块,并使用TFLite工具测量华为P30(麒麟980 CPU)上的延迟。结果表明加入的注意机制只增加20%的理论FLOPs,但在移动设备上却需要2倍的推理时间。理论复杂度与实际复杂度之间的巨大差异表明,有必要设计一种硬件友好的注意力机制,以便在移动设备上快速实现,所以作者后面提出了DFC注意力模块。
2.1 DFC注意力模块
作者在论文中给出了DFC注意力的示意图,如下图所示
操作流程和下面的框架流程图也一致;即特征图先经过一个下采样,然后经过1x1点卷积,然后用水平方面的全连接和垂直方向的全连接提取两个方向上的重要程度,最后经过sigmoid激活将数值变成0到1的范围,这个DFC attention的结果最后会作为权重同Ghost Module的结果相乘得到最终的结果。
直接看代码更容易理解,代码中水平方向全连接以及垂直方向全连接用了(1,5)大小的卷积和(5,1)大小的卷积代替。
GhostNetv2和其他轻量化模型在ImageNet数据集上表现为:
可以看到GhostNetv2相较于v1版本是有提升,但不多。
3、GhostNetv3
论文地址:https://arxiv.org/abs/2404.11202
代码:https://github.com/huawei-noah/Efficient-AI-Backbones/tree/master/ghostnetv3_pytorch
轻量型模型主要是为了能在边缘设备上应用而设计的,然而目前轻量型模型的设计及训练方式还是沿用之前的传统神经网络经验,这忽略了它们之间模型容量的差异性,不同的模型容量可能具有不同的学习偏好,直接沿用训练传统模型经验可能阻碍轻量型模型的性能提升。
作者通过实验发现,重参数化、知识蒸馏对训练高性能轻量型模型非常重要,但是像训练传统模型那样的数据增强方法如:Mixup和CutMix会使得模型性能下降。具体如下:
重参数化设计
GhostNetv3通过在训练中增加多个分支,推理时通过重参数化将分支合并的策略,如下图所示,对于3x3的Depthwise卷积,训练时通过增加多个相同的分支,并且增加identity分支,推理时通过重参数化合并成单个3x3的Depthwise卷积;对于1x1的卷积也采用相同的做法。
通过增加分支,训练中可以学习到多样化的特征,提升模型的特征表达性,推理时重参数化为一个分支,不增加模型推理耗时,实验中作者发现直连(identity)分支对提升模型性能具有正面作用。下表是GhostNetv3不同规模模型不做重参数化和做重参数化的性能对比情况,可以看出,模型做了重参数化提升很大。
知识蒸馏
为进一步提升模型性能,GhostNetV3采用了知识蒸馏技术,通过模仿教师模型的输出分布,指导小型模型学习到更丰富的特征表示,提升了模型的性能。作者以ResNet-101(77.4%),DeiT-B(81.8%),BeiTV2-B(86.5%)分别作为教师模型,指导GhostNetV3学习,实验结果如下:
可以看到,GhostNetV3是上限性能取决于教师模型的性能。
学习策略
模型训练时的学习率是非常重要的,学习率下降策略通常有step下降和余弦下降策略,以及weight decay参数对模型正则化的影响,指数移动平均(EMA)最近成为一种有效的方法来提高验证精度和增加模型的鲁棒性。作者旨在这些训练策略上找到最优组合,提升模型性能。
数据增强
基于训练传统深度学习模型的经验,数据增强能提升模型性能,常见数据增强有AutoAug方案,RandomAug方案,Mixup,CutMix,RandomErasing等,作者评估了上述数据增强的各种组合,分析了几种常用的数据增强方法,用于训练传统模型如Mixup和CutMix的数据增强方式,不合适用于训练轻量型模型。
GhostNetV3及其他轻量级模型的FLOPs比较,以及其TFLite版本在windows CPU和华为手机Mate40Pro(麒麟9000CPU)的耗时情况如下图所示:
GhostNetv3和其他轻量级模型在ImageNet数据集上的比较情况如下: