概要
在轻量型神经网络架构中,结合 inverted bottleneck 与 depth-wise convolution 的 MobileNet 与其衍生的 EfficientNet 系列堪称经典之作。然而,FLOPs 与推理速度并不成正比关系,实际上 MobileNet 运行在 GPU/ TPU/ DSP 这类硬体上在大多数的时候其实比一般的 ResNet 来的慢。因此, MobileNet 系列可以说有两个缺点:
- 已训练模型部属在GPU类的环境下运行效率低下
- 训练时通常都是GPU类环境,因此时程也会拉得比较久
前段时间,EfficientNet 的原作提出了EfficientNetV2,给轻量型神经网络家族提供了新的研究方向,在精实的架构下提升MobileNet 在 GPU类环境下的运行效率。除了使用 training-aware NAS并加入对 GPU有善的building block外,训练网路时会对数据大小与正则化方案进行动态调配 ,在维持强大模型效果的同时,大幅减少模型收敛所需的训练时间。
这篇文章主要介绍 EfficientNet V2的改进与强大背后的一些信息。文章整体分三个部分,第一部分介绍 low FLOPs网路架构设计,主要介绍 MobileNets V1 到 V3 与 EfficientNet V1。第二部分以 roof-line model介绍为何 FLOPs低不一定运行速度快。第三个部分正式介绍 EfficientNet V2的真正的价值。
开始前,先看一下EfficientNet V2的效率图,如图1和表1所示。
EfficientNet V2的数据看起来真的很强、很虐,但实际上并不能说是真正全盘辗压V1,美好数据隐藏的细节就藏在 latency与 throughput 的计算上。
低FLOPs/MAdd架构
在CV领域,神经网路架构随着硬体加速元件的发展让网路参数与运算量也不断飙升。随后,在追求网路强大之余,开始有关注于运行于 Mobile device 的轻量网络设计。这些设计在前期主要的目标是降低 FLOPs或是 MAdds (可以直观理解为四则运算的数量),这时期 (2017–2019年) 的知名架构包含MobileNet (V1-V3)、 ShuffleNet (V1-V2) 、 EfficientNet 等等。
MobileNet V1
MobileNet 最核心的内容是使用 depth-wise separable convolution作为主要的计算单元。一般的 convolution 是在一个3D的 kernel 中同时考虑的 space 与 channel 之间的关联,进行的矩阵乘法较为耗时。而 Seperable convolution 事先考虑 space 的关联(depth-wise convolution),再考虑channel间关联(pointwise convolution),这样将一个大的矩阵乘法变成两个小的矩阵乘法,这一行为的结果与普通卷积相似却大幅地降低运算量。
MobileNet V2
后续改进的 MobileNet V2则是加入了 inverted bottleneck block,先用 point-wise convolution 将 channel 拉高后才做过 depth-wise convolution,最后一样用 point-wise convolution 将 channel 恢复。另外,也移除了最后的 ReLU (作者认为会降低表达能力)。
MobileNet V3
至于最后的MobileNet V3使用了NAS来搜索架构,在 building 上的差别是加上了SE(squeeze-and-excitation)。SE block考量特征 channel 间的相关性进行评估,把重要的特征进行强化来提升准确率。不论是概念上或是架构上都有很强的 attention 的意味,是近几年很常被使用的技巧。
EfficientNet V1
EfficientNet 的 building block 设计延续 MobileNet V3,但是使用了MnasNet 的NAS方法,同时将运算资源的观测从 latency 改成FLOPs,即对于某个网路 、目标FLOPs ,使用一个超参数控制 accuracy 与 FLOPs 的 trade-of 最佳化。
整体上来说,EfficientNet V1可以说是目前(2021年)在CPU上最强的轻量级网络架构之一。
FLOPs不等于延迟
在不同的部属环境(硬体设备)下,其实低FLOPs 或MAdds 并不一定等价于低 latency。而这原因来自于运算设计是否能够达到硬体的计算上限。举个例子来说, depth-wise convolution虽然运算量低,但是需要频繁访问内存,在GPU这类可以支撑大量向量计算的硬体上其实达不到计算上限。
Roof-Line 模型
更精准地解释是,硬体差异在于计算能力(每秒钟所能完成的浮点运算量)与内存频宽(每秒所能完成的内存交换量)。不同类的神经网路架构对这两种能力有不同的需求量,而最理想的情况就是在部属硬件上找到这两种指标的均衡点。
而 roof-line 模型可以很好地描述这个现象,由计算平台的计算能力和内存频宽上限这两个参数会产生一个 roof-line。计算能力决定屋顶的高度(绿色线段),而内存频宽决定屋檐的斜率(红色线段),如图6所示。
以MobileNet 系列来说,大量使用 depth-wise separable convolution 让模型所需的计算能力不高,因此适合内存存取快的硬件,比如说 CPU。然而这就让他在 GPU或TPU这类硬件上的运行达不到计算能力的上限,也因此即使FLOPs 很低,整体运算效率还是不好。
同理, EfficientNet在GPU类硬件也不算很有效率。
EfficientNet / MobileNet的缺点
整体上低FLOPs 但在GPU高 latency 的网络架构缺点是部属硬件不同可以分成在GPU类硬件上与CPU类硬件上两个部分。
- 部属于GPU类硬体:在向量加速元件的硬体上运行效率不好,因此大多数在GPU、TPU或DSP上运行的网络其实不适合直接采用这些低FLOPs 但实际 latency 高的架构
- 部属于CPU类硬体:即使在CPU类硬体运行效率很好,但是网路的训练通常还是在GPU或TPU上,导致训练的时程拉得更久
EfficientNet V2
即使EfficientNet 并不适合在GPU类硬体上运行,许多研究还是惯常采用了EfficientNet,因为EfficientNet 的表现真的很不错(或许是真的来自高效的参数配置或是仅仅是方便与 SOTA比较)。因此,提升EfficientNet 在GPU上的效率是很直接的主题。而EfficientNet V2就是改善了在GPU的运行效率的。
依照原论文的说法,EfficientNet V2对比其他主流的SOTA模型不只准度更好,模型大小更小、训练速度也更快!整体上EfficientNet V2的重点如下:
- 加入非 depth-wise separable convolution,并且使用 training-aware NAS找出适合GPU类硬件的架构
- 在训练时使用逐步加大的 image resolution,加快模型的训练速度。同时在 regularization上也是逐步加强,减少可能因为分辨率的影响等造成的精度下滑
- 修改EfficientNet V1中各 stage 均衡的 compound scaling,使用 non-uniformed scaling 让模型在 scale up 时效果更好
非Depth-Wise Separable Convolution
EfficientNet V2指出 depth-wise convolution 会降低GPU的使用效率,特别是在网络的前期。论文没有明确指出原因,个人推论应该是因为视觉类网络在前几个 stage 的分辨率大,导致需要频繁的访问内存而产生的MAC变大。
包含EfficientNet EdgeTPU与MobileDets 等方法都大量使用了结合普通 convolution 的 building block。具体地,EfficientNet V2是将完全没有 depth-wise convolution 的 Fused-MBConv 加入NAS的 search space中。
NAS
其实EfficientNet V2的NAS因为大多数都直接沿用V1的结果,实际的 search space 很小。最大的差异还是在于Fused-MBConv 的加入与 reward function 从精度与FLOPs 改为精度、标准化的训练时间与模型参数量。最终找出来的EfficientNetV2基本架构如表3下。
而 scaling 整体上还是依靠V1的 compound scaling,但为了保证运行速度,分辨率设定了480的上限;而在增加深度时,会额外增加最后两个 stage(5, 6)的 layer 数,而非如V1那样完全均衡的增加。
渐进式学习
由于大分辨率的数据会直接导致训练时间平方倍拉大,许多论文试图以小的分辨率训练,再用大的分辨率推理,以获得较短的训练时间。然而这样的方法多半都还是会带来精度的下降,EfficientNet V2作者认为这是因为大分辨率的数据更容易 overfitting,因此需要搭配强度更高的正则化。
EfficientNet V2的方法很简单粗暴,把所有 training step 切成 m 个阶段,预先设定好起始与结束的分辨率与 regularization 策略,从起始设定开始,在每个阶段逐步加大分辨率与正则化方案,最终达到目标的结束分辨率与正则化。论文中使用的正则化为标准的Dropout 、 RandAugment 与Mixup。
由于近期Vision Transformer (ViT)相当热门,论文也有提到这样改变分辨率的方法并不能直接套用在 ViT上,因为ViT需要依靠 position embedding 来理解图像中像素的位置与关联,而这个 embedding 与分辨率高度相关。
实验与结果
论文通篇着重强调EfficientNet V2相比其他SOTA方法,在较小的模型与较快的训练速度的情况下,仍然拥有较好的表现。这个观点在GPU上的主流 SOTA模型( NFNet 与ViT) 确实如此,然而细看下方FLOPs 数据图的左侧,EfficientNet V2并没有可以与V1对比的数据。
即使论文在后面补上了V2与V1在 ImageNet的Top-1 Acc、参数量与在GPU上的吞吐量的比较,在CPU上的比较始终只字未提。实际上结果可想而知,FLOPs 高的V2在CPU上是铁定打不赢V1的。
总体来说,在GPU类的硬件上EfficientNet V2或许确实是至今最强的模型,然而在CPU上并不是最强的,因此在没有GPU、TPU或DSP的 mobile device 上,MobileNet 或EfficientNet V1这类低FLOPs 的模型还是比较佔有优势的。从另外一个层面来看,EfficientNet V2将 V1的NAS与参数高效率带到了GPU上,并且证明了足以刷新 SOTA的水准。
所以EfficientNet V2很强,但并不完全是V1的升级版,V2仍将是网络架构的一个新标竿。
至于有些人可能会觉得像是Fused-MBConv 这样的 building block 即使有MobileNet 的三个重点(depth-wise convolution、inverted bottleneck、SE)的其中两个,硬是挂上MobileNet的MB很牛逼。但其实随著硬件的变化,Mobile 并不应再单指CPU本身,而是能在 mobile device 上有效运行的网络。
反而个人觉得更值得讨论的是:如果Fused-MBConv 这样使用一般 convolution 的 inverted bottleneck 架构如此有效,那是否可以替代ResNet 的残差 bottleneck 呢?
本文暂时没有评论,来添加一个吧(●'◡'●)