✨博客主页:王乐予🎈
✨年轻人要: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
😺二、ShuffleNet V1
作者发现像Xception和ResNeXt在小网络模型中效率很低,这是因为大量的 1 × 1 1×1 1×1卷积浪费了计算资源,因此作者使用逐点组卷积降低 1 × 1 1×1 1×1卷积的计算复杂度,并且为了克服组卷积带来的副作用,作者提出了一种新的通道混洗操作来帮助信息在特征通道中流动。
🐶2.1 Channel Shuffle
在小型网络中,昂贵的点卷积会使得有限的通道之间充满了约束,显著的损失精度。为了解决这个问题,通常会使用像 group convolution 一样的通道稀疏连接,确保每个卷积操作仅在对应的输入通道组上。但是多个组卷积堆叠会产生副作用:某个通道输出仅从一小部分输入通道中导出,这样会降低通道组间的信息流动能力,降低了信息表达能力。
下图展示的是通道混洗的原理:
- 图a是简单的组卷积实现过程,这里存在的问题是输出通道只与输入的某些通道有关,降低通道组间的信息流动能力,降低了信息表达能力。
- 图b是将每个组中的特征图均匀混合,也就是混洗(Shuffle),这样可以更好地获取全局信息,图c是图b的等价效果。
🐶2.2 Shuffle Unit
知道了 Channel Shuffle 的原理,就可以设计Shuffle Unit 了,如下图所示:
- 图a是ResNet中的bottleneck unit,但这里用 3 × 3 3×3 3×3的DWConv代替原来的 3 × 3 3×3 3×3 Conv;
- 图b将图a中的两端 1 × 1 C o n v 1×1 Conv 1×1Conv换成了Group Conv;同时在DWConv之前使用了Channel Shuffle,该单元没有对图像大小进行调整;
- 图c中的DWConv的步长设置为2,同时旁路连接中添加了一个步长为2的平均池化,并在最后使用Concatenate相连两条分支,这种设计在扩大了通道维度的同时并没有增加很多的计算量。
🐶2.3 NetWork Architecture
作者基于2.2的Shuffle Unit设计了网络结构,如下表所示:
更多的实验结果请见论文原文。
😺三、ShuffleNet V2
目前,神经网络体系结构的设计主要由计算复杂度的间接度量来指导,即FLOPs。然而,速度等直接指标也取决于其他因素,如内存访问成本和平台特性。因此,我们更应该去看网络部署在不同芯片上的实际时间消耗,而不能片面的追求FLOPs的理论减少。
🐶3.1 Practical Guidelines
作者从几个不同的方面对运行时间(或速度)进行了详细分析,并得出了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条指导准则:
- 使用“平衡”卷积层,即输入与输出通道相同;
- 谨慎使用分组卷积并注意分组数;
- 减少碎片化的操作;
- 减少元素级的操作。
🐶3.1 ShuffleNet V2 Architecture
下图中的a与b是ShuffleNet V1的architecture,c与d是ShuffleNet V2的architecture。
仔细观察我们可以发现ShuffleNet V1中到处违背了4条设计原则:
- 使用了bottleneck layer,使得输入输出通道数不同,违背了G1原则;
- 大量使用 1 × 1 1×1 1×1卷积,违背了G2原则;
- 使用了过多的 group ,违背了G3原则;
- shortcut中存在了大量的元素级add运算,违背了G4原则。
为了消除v1的缺点,ShuffleNet V2提出了一个新的操作:通道拆分(channel split),如图c、d所示。 - 在每个单元的开始将通道拆分为2个分支,一个分支做恒等映射,符合G3原则,另一个分支经过多层卷积保证输入通道数与输出通道数相同,符合G1原则;
- 不同于ShuffleNet V1 ,ShuffleNet V2的 1 × 1 1×1 1×1没有再使用分组卷积,符合G2原则;
- 两条分支最后使用通道级联 concatenate 操作,没有使用TensorAdd,符合G4原则。
🐶3.1 ShuffleNet V2 NetWork
使用V2的Architecture的NetWork如下表所示:
关于ShuffleNet V2的各种实验结果详见论文。
😺四、总结
作者对神经网络的工作模式与计算精度进行了深入思考,充分考虑了各项因素对网络运行速度的影响,由此诞生了ShuffleNet V1和V2。💪💪💪