ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
ShuffleNet v2
1、四个问题
-
要解决什么问题?
- 轻量化模型。
-
用了什么方法解决?
-
文中提出了几条设计轻量化模型的实践准则(guidelines)。
- Guideline 1:输入通道数与输出通道数保持相等可以最小化内存访问成本(memory access cost,简称MAC)。
- Guideline 2:组卷积中使用过多的分组数会增加内存访问成本(MAC)。
- Guideline 3:网络结构太复杂(分支和基本单元过多)会降低网络的并行程度。
- Guideline 4:Element-wise的操作消耗不可忽视(包括ReLU,Tensor相加,bias相加等等)。
-
这篇文章主要是在ShuffleNet v1的基础之上进行改进的,并依照提出的guidelines重新改进了Shuffle Unit,并构建了ShuffleNet v2。
-
-
效果如何?
- 文中进行了大量的对比实验,将上述的准则直接对现有的一些模型进行修改,验证准则的准确性。
- 将ShuffleNet v2与其他模型进行比较,验证了其有效性。
-
还存在什么问题?
- 这篇论文是今年才发表在ECCV18上的文章,各方面考虑得都很全,思路也很新颖,目前网上的复现还不是很多,后面我也去复现试试。
2、论文概述
2.1、引言
- 目前一些有效地轻量化网络都是基于depth-wise convolution和group convolution的。
- 大多数文章中针对网络计算复杂性的度量标准是浮点运算量(FLOPs),但是文中通过实验发现,FLOPs并不能与网络的计算速度成正比。
- 从图中可以看出,相同的FLOPs下,不同网络的实际运行速度有不小差距。
- 非直接度量标准(FLOPs)和直接度量标准(实际运行速度)的结果有所偏差,原因如下:
- 有一些很重要的影响因素,并没有被FLOPs考虑进去。
- 一个就是内存访问成本(MAC)。比如执行组卷积时,算力更强的平台如GPU就可以忽略不计,而算力相对较弱的平台如ARM就不能忽略不计了。
- 另一个原因就是并行化程度。在相同的 FLOPs 下,网络并行化程度更高的网络速度更快。
- 具有相同FLOPs的操作在不同平台上,运行时间效率不同。
- 有一些很重要的影响因素,并没有被FLOPs考虑进去。
2.2、网络设计准则
Guideline1 : Equal channel width minimizes memory access cost (MAC)
-
输入通道数与输出通道数保持相等可以最小化内存访问成本(memory access cost,简称MAC)。
-
假设输入通道数为 c 1 c_1 c1,输出通道数为 c 2 c_2 c2,特征图为 h × w h \times w h×w。
- 每个 1 × 1 1 \times 1 1×1 卷积层的FLOPs是: B = h ⋅ w ⋅ c 1 ⋅ c 2 B = h \cdot w \cdot c1 \cdot c2 B=h⋅w⋅c1⋅c2。
- 则MAC(内存访问操作次数)为: M A C = h ⋅ w ⋅ ( c 1 + c 2 ) + c 1 ⋅ c 2 MAC = h \cdot w \cdot (c_1 + c_2) + c_1 \cdot c_2 MAC=h⋅w⋅(c1+c2)+c1⋅c2。
- 由于 c 1 + c 2 ≥ 2 c 1 ⋅ c 2 = 2 B h ⋅ w c_1 + c_2 \geq 2 \sqrt{c_1 \cdot c_2} = 2 \sqrt{\frac{B}{h \cdot w}} c1+c2≥2c1⋅c2=2h⋅wB。
- 带入MAC的式子中,可得: M A C = h ⋅ w ⋅ ( c 1 + c 2 ) + c 1 ⋅ c 2 ≥ 2 ⋅ h ⋅ w ⋅ B h ⋅ w + c 1 ⋅ c 2 MAC = h \cdot w \cdot (c_1 + c_2) + c_1 \cdot c_2 \geq 2 \cdot h \cdot w \cdot \sqrt{\frac{B}{h \cdot w}} + c_1 \cdot c_2 MAC=h⋅w⋅(c1+c2)+c1⋅c2≥2⋅h⋅w⋅h⋅wB+c1⋅c2。
- 最终得到 M A C ≥ 2 ⋅ B ⋅ h ⋅ w + B h ⋅ w MAC \geq 2 \cdot \sqrt{B \cdot h \cdot w} + \frac{B}{h \cdot w} MAC≥2⋅B⋅h⋅w+h⋅wB。
- 由此可知,MAC具有下界,当输入与输出通道数相等,即 c 1 = c 2 c_1 = c_2 c1=c2时,MAC最小。
-
关于guideline1的实验结果如下图:
- 通过变换通道数,保证了几个实验的FLOPs大致一样。从实验结果可以看出,当 c 1 = c 2 c_1 = c_2 c1=c2时,速度最快。
Guideline2 : Excessive group convolution increases MAC.
- 组卷积中使用过多的分组数会增加内存访问成本(MAC)。
- 对于组卷积来说,FLOPs为: B = h ⋅ w ⋅ c 1 ⋅ c 2 g B = \frac{h \cdot w \cdot c_1 \cdot c_2}{g} B=gh⋅w⋅c1⋅c2。 g g g为分组数。
- 组卷积的MAC计算公式如下:
- 假设 h , w , c 1 , B h, w, c_1, B h,w,c1,B不变,如果分组数 g g g增加,那么MAC也会增加。
- 关于guideline2的实验结果如下图:
- 论文中给出的建议:
- 分组数应该根据实际课题以及应用的平台谨慎选择。单纯的通过增加分组卷积来增加通道数从而增加精确度是一个不明智的选择。
Guideline3 : Network fragmentation reduces degree of parallelism.
- 网络结构太复杂(分支和基本单元过多)会降低网络的并行程度。
- 以下是实验中使用的结构:
- 实验结果如下:
Guideline4 : Element-wise operations are non-negligible.
- Element-wise的操作消耗不可忽视。
- 通过去除shortcut和ReLU等,在GPU和ARM上都可以获得将近20%左右的提速。
2.3、ShuffleNet v2
- ShuffleNet v1中可以优化的点:
- depthwise convolution和bottleneck结构增加了MAC。
- 组卷积中也使用了太多的组数。
- 跨层连接中的element-wise add等也可以去掉。
- 图(a)和图(b)是ShuffleNet v1中的Shuffle Unit,图©和图(d)是改进后的Shuffle Unit。
- 增加了Channel Split操作,实际上就是把输入通道分为2部分。
- 依照guideline2,减少分组卷积的分组数。只将一半的通道送入卷积层,剩下一半保留。
- 依照guideline1,输入与输出通道数相同。每个分支中的卷积层的输入输出通道数都一致。
- 依照guideline3,减少基本单元数。因此有一个分支不做任何操作,直接做恒等映射。
- 依照guideline4,删去一些element-wise操作。最后使用了concat替代了element-wise add,并去除了最后的ReLU。
- 最后加入了channel shuffle来增加通道之间的信息交流。
- 在网络的最后,还要在平均池化层之前加入 1 × 1 1 \times 1 1×1卷积层来进一步融合特征。
- 网络结构:
2.4、实验
- 几个大型模型结果比较:
- 在COCO数据集下目标检测结果比较:
- 多个模型综合比较: