虽然剪枝和量化 (quantization)等技术修改现有的模型使其更小、更快,但另一种方法是从一开始就设计高效的网络架构。这些架构包含专门设计用于最小化计算成本(以浮点运算或FLOPs衡量)和参数 (parameter)数量的构建块,使其适用于部署到移动设备、嵌入 (embedding)式系统及其他资源有限的环境。
高效架构设计的核心原则
许多高效架构的核心思想是将计算开销大的操作(例如标准卷积层)替换为更经济的替代方案,这些替代方案能有效模拟其功能。有两种基本技术表现突出:
-
深度可分离卷积: 这可能是高效CNN设计中影响最大的创新,由MobileNet推广。标准的3×3卷积同时处理所有输入通道以生成每个输出特征图。深度可分离卷积将其分为两个不同的步骤:
- 逐深度卷积: 空间卷积独立地应用于每个输入通道。如果有Cin个输入通道,则使用Cin个单独的K×K滤波器(例如,3×3)。此步骤过滤每个通道内的空间信息,但不组合跨通道的信息。
- 逐点卷积: 1×1卷积应用于跨通道。此步骤获取逐深度卷积的输出,并组合跨通道的信息以生成最终的Cout个输出通道。它使用Cout个大小为1×1×Cin的滤波器。
计算节省非常可观。对于具有Cin个输入通道、Cout个输出通道、滤波器大小为K×K以及特征图大小为H×W的标准卷积,其成本近似为:
标准成本≈H×W×K×K×Cin×Cout
对于深度可分离卷积:
逐深度成本≈H×W×K×K×Cin(逐深度步骤)
逐点成本≈H×W×1×1×Cin×Cout(逐点步骤)
可分离成本=逐深度成本+逐点成本
可分离成本≈H×W×Cin×(K×K+Cout)
相较于标准卷积,其减少系数大致为:
标准成本可分离成本≈H×W×K×K×Cin×CoutH×W×Cin×(K×K+Cout)=Cout1+K21
对于像K=3和较大的Cout等典型值,成本降低通常在8−9×左右。
标准卷积和深度可分离卷积操作的比较。可分离版本将过程分解为两个计算成本较低的步骤。
-
组卷积: 最初在AlexNet中提出以应对内存限制,组卷积将输入通道分为几个组。卷积随后在每个组内独立进行。如果将Cin个通道分成G个组,则每个卷积在Cin/G个输入通道上操作以生成Cout/G个输出通道。这些通道随后被连接起来。这将参数 (parameter)数量和计算量减少了G倍。深度卷积是一种极端情况,其中组数等于输入通道数(G=Cin)。
-
通道混洗: 在ShuffleNet中着重使用了此操作,它有助于在使用组卷积时实现通道组之间的信息流通。在组卷积之后,输出特征图中的通道在馈送到下一个组卷积之前被“混洗”或重新排列。这确保了下一层可以处理来自前一层不同组的信息,减少了组卷积可能导致的隔离。
著名高效架构
MobileNet (V1, V2, V3)
MobileNet家族开创了深度可分离卷积的大规模应用。
- MobileNetV1: 直接用深度可分离卷积替换了大多数标准卷积。引入了宽度(通道数)和分辨率乘数作为超参数 (parameter) (hyperparameter),以方便地权衡准确性与延迟/大小。
- MobileNetV2: 引入了带线性瓶颈的倒置残差块。残差连接,类似于ResNet,有助于深层网络中的梯度流动。“倒置”结构表示该块首先使用1×1卷积来扩展通道维度,在扩展空间中应用轻量级的3×3逐深度卷积,然后使用1×1线性卷积(不带ReLU)将其投影回较小维度。发现这有助于防止窄层中的信息损失。
- MobileNetV3: 结合了神经网络 (neural network)架构搜索(NAS)、Squeeze-and-Excitation(SE)模块(一种通道注意力形式)的思路以及更新的块结构(使用h-swish激活函数 (activation function)),以进一步提高准确性和效率。它有“大”和“小”两个版本,针对不同的资源限制。
ShuffleNet (V1, V2)
ShuffleNet专注于优化效率,考虑了内存访问成本(MAC)等因素。
- ShuffleNetV1: 采用逐点组卷积和通道混洗来降低计算成本,同时维持跨通道组的信息流动。
- ShuffleNetV2: 提出了实用高效网络设计的指导方针,认为仅仅最小化FLOPs是不够的。它建议平衡通道宽度,避免过多的组卷积(因为会增加MAC),并最小化逐元素操作。最终的架构使用了通道分割机制,并仔细平衡操作以在实践中获得更快的速度。
EfficientNet
EfficientNet引入了复合缩放。它没有独立缩放网络维度(深度、宽度、分辨率),而是提出了一种有原则的方法,使用复合系数ϕ来联合缩放它们。从一个良好的基线架构(EfficientNet-B0,通过NAS发现)开始,它共同缩放深度(αϕ)、宽度(βϕ)和分辨率(γϕ),其中α,β,γ是通过网格搜索发现的常数,满足α⋅β2⋅γ2≈2。这种平衡缩放使EfficientNet能够以明显更少的参数和FLOPs,在各种计算预算(B0到B7)下,达到与以往模型相比领先的准确度。
设计考量
选择或设计高效架构时,请考虑:
- 目标平台: CPU、GPU、移动GPU、DSP或专用硬件(如TPU、NPU)具有不同的性能特点。为一个平台优化的架构可能不适合另一个平台(例如,在某些移动硬件上,MAC可能比FLOPs更具限制性)。
- 延迟与吞吐量 (throughput): 实时推理 (inference)速度(延迟)是否非常重要,还是高效处理大量批次(吞吐量)更重要?
- 准确度要求: 为了效率可以牺牲多少准确度?MobileNetV3-Small与MobileNetV3-Large,或EfficientNet-B0与EfficientNet-B7,代表了这种权衡曲线上的不同点。
- 内存带宽: 像通道混洗或连接这样的操作可能会占用大量内存,从而影响速度。
设计高效架构是一个活跃的研究方向。通过了解深度可分离卷积、组卷积等构建块,以及MobileNet、ShuffleNet和EfficientNet中使用的设计原则,您可以更好地选择或调整模型,以便在资源受限的环境中部署,补充本章前面讨论的模型压缩技术。