✨博客主页:米开朗琪罗~
✨博主爱好:羽毛球
✨年轻人要:Living for the moment(活在当下)!
推荐专栏:【图像处理】【千锤百炼Python】【深度学习】【排序算法】
在学术界,大多围绕着如何提高视觉任务的SOTA进行研究,但在工业界,一个良好的模型如何移植到计算能力不足的移动设备上才是重点考虑的问题。
ShuffleNet是由旷视研究院于2018年发表在CVPR上的一篇文章。AI四小龙之一的旷视,多次在顶级会议(如CVPR、ECCV、ICCV)上发表文章。ShuffleNet的第一作者 Xiangyu Zhang 张祥雨 也是里程碑式神经网络ResNet的作者!
在ShuffleNet中,作者使用了两个操作,分别是逐点组卷积(pointwise group convolution)和通道混洗(channel shuffle),在保持精度的同时大大降低了计算成本。在ImageNet分类和MS COCO目标检测的实验证明,ShuffleNet优于其他网络,在计算预算为40 MFLOPs的情况下,在ImageNet分类任务上,比MobileNet具有更低的top-1误差;在基于ARM的移动设备上,ShuffleNet实现了约13倍于AlexNet的实际加速比,同时保证了精度。
ShuffleNet V1:ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices
ShuffleNet V2:ShuffleNet V2: Practical Guidelines for Ecient CNN Architecture Design
作者发现像Xception和ResNeXt在小网络模型中效率很低,这是因为大量的 1 × 1 1×1 1×1卷积浪费了计算资源,因此作者使用逐点组卷积降低 1 × 1 1×1 1×1卷积的计算复杂度,并且为了克服组卷积带来的副作用,作者提出了一种新的通道混洗操作来帮助信息在特征通道中流动。
在小型网络中,昂贵的点卷积会使得有限的通道之间充满了约束,显著的损失精度。为了解决这个问题,通常会使用像 group convolution 一样的通道稀疏连接,确保每个卷积操作仅在对应的输入通道组上。但是多个组卷积堆叠会产生副作用:某个通道输出仅从一小部分输入通道中导出,这样会降低通道组间的信息流动能力,降低了信息表达能力。
知道了 Channel Shuffle 的原理,就可以设计Shuffle Unit 了,如下图所示:
作者基于2.2的Shuffle Unit设计了网络结构,如下表所示:
更多的实验结果请见论文原文。
目前,神经网络体系结构的设计主要由计算复杂度的间接度量来指导,即FLOPs。然而,速度等直接指标也取决于其他因素,如内存访问成本和平台特性。因此,我们更应该去看网络部署在不同芯片上的实际时间消耗,而不能片面的追求FLOPs的理论减少。
作者从几个不同的方面对运行时间(或速度)进行了详细分析,并得出了4个有效网络架构设计的实用指南。
G1:同等输入输出通道下,最小化内存访问成本(MAC)
目前轻量级的CNN常采用深度可分离卷积,而pointwise convolution占比90%多,我们设输入和输出通道数分别为 c 1 c_{1} c1和 c 2 c_{2} c2,特征图尺寸为 h × w h×w h×w,则 1 × 1 1×1 1×1卷积的 FLOPs 为 B = h w c 1 c 2 B=hwc_{1}c_{2} B=hwc1c2,内存访问成本为 B = h w ( c 1 + c 2 ) + c 1 c 2 B=hw(c_{1}+c_{2})+c_{1}c_{2} B=hw(c1+c2)+c1c2。根据均值不等式有:
M A C ≥ 2 h w B + B h w MAC\geq 2\sqrt{hwB}+\frac{B}{hw} MAC≥2hwB+hwB
当且仅当 c 1 = c 2 c_{1}=c_{2} c1=c2时,MAC取得最小值。
G2:过多使用组卷积会增加MAC
对于组卷积,FLOPs为 B = h w c 1 c 2 / g B=hwc_{1}c_{2}/g B=hwc1c2/g,其中 g g g是组数,对应的MAC为 h w ( c 1 + c 2 ) + c 1 c 2 / g hw(c_{1}+c_{2})+c_{1}c_{2}/g hw(c1+c2)+c1c2/g。如果固定输入 c 1 × h × w c_{1}\times h\times w c1×h×w以及 B B B,那么MAC为:
M A C = h w c 1 + B g / c 1 + B / h w MAC=hwc_{1}+Bg/c_{1}+B/hw MAC=hwc1+Bg/c1+B/hw
由公式可知,当 g g g增大时,MAC也会增大。
G3:碎片化的网络会降低并行度
在GoogLeNet等网络中,常采用多路结构提高网络精度,但多路结构会造成网络的碎片化,使得网络速度变慢。
G4:元素级操作不能忽视
对于ReLU、TensorAdd、BiasAdd等元素级操作,它们的FLOPs较少,但MAC较大。经过作者实验证明,将残差网络的残差单元中的ReLU和短接移除,速度会有20%的提升。
因此,基于上述分析,作者得到了4条指导准则:
- 使用“平衡”卷积层,即输入与输出通道相同;
- 谨慎使用分组卷积并注意分组数;
- 减少碎片化的操作;
- 减少元素级的操作。
下图中的a与b是ShuffleNet V1的architecture,c与d是ShuffleNet V2的architecture。
仔细观察我们可以发现ShuffleNet V1中到处违背了4条设计原则:
使用V2的Architecture的NetWork如下表所示:
关于ShuffleNet V2的各种实验结果详见论文。
作者对神经网络的工作模式与计算精度进行了深入思考,充分考虑了各项因素对网络运行速度的影响,由此诞生了ShuffleNet V1和V2。