链接:https://arxiv.org/pdf/1807.11164.pdf
中心思想
- 指出当前主流的对轻量级网络的衡量方式不够全面(仅用FLOPs来衡量一个模型的轻量级程度)
- 实际在端上执行一张图像的预测,还需要考虑其他因素,如内存访问,平台架构等等
- 因此从实际角度出发,给出了一些轻量级网络的设计指导,并最终根据这些指导,引出了新的网络结构——ShuffleNet v2
用FLOPs衡量模型的主要问题
- FLOPs本身和实际应用中关心的效率指标未必成正相关,如在应用中一般用的是speed, latency
- 在FLOPs相同的情况下,不同网络的真正速度也有差别,
- 同一个网络,在不同的平台下运行速度也会有限制
因此,只用FLOPs不够,原因是:还有其他的额外因素左右了模型的真正的运行速度:
- MAC(memory access count)这里将取一个数据(Feature Map或者weight中的某一个数)作为一次内存访问。例如:Group Conv操作会增加内存访问,从而将速度的性能瓶颈从计算变为内存访问
- 数据的并行程度,在同样的FLOPs的情况下,数据的并行度越高,整体的速度越快
- 具体的运算平台。一个典型的例子是,受到CUDNN优化的限制(对3x3卷积进行了优化,通过矩阵分解的方式实现卷积,如果按照FLOPs算的话,是降低的,但是在CUDNN上反而最终速度会变慢)
因此,要考虑2个因素:
- 用一些更直接的度量准则(Latency, speed等)来取代现有的FLOPs非直接准则
- 在不同的平台单独评测速度
高效(轻量级)网络的设计准则
如Fig 2.所示:
- 同样的网络,在不同的平台上,时间占比不相同。ShuffleNet 和 MobileNet在GPU上,Element Wise计算(Add, ReLU等)以及数据的存储会占用更多的时间;而在CPU上,更多的时间被花在了卷积操作上
- FLOPs衡量的仅仅是卷积操作,上述的Element Wise操作是被忽视的。因此,FLOPs并不是一个能够准确反映最终运行时间的效率衡量方式
结合实际,下面是几条设计准则:
输入输出channel相同时,内存访问的代价越低
- 对于1x1卷积而言,总共的MAC = hw(c1 + c2) + c1c2,分别为weight的内存访问和Feature Map的feature访问(包括存取数值)。这里仅考虑cache无限大的情况
- hw(c1 + c2)写成均值不等式的形式,有:
M A C ≥ 2 h w B + B h w MAC \geq 2\sqrt{hwB} + \frac{B}{hw} MAC≥2hwB+hwB
其中B为FLOPs
B = h w c 1 c 2 B = hwc_1c_2 B=hwc1c2 - 上式当c1 = c2的时候,等号成立,因此得到结论:输入输出channel相同时,内存访问的代价越低
- 从计算机系统的角度来说,本质上是在输入/输出之间做均衡
过多的分组卷积会增加内存访问
- 回到MAC的公式
h
w
(
c
1
+
c
2
)
+
c
1
c
2
hw(c_1 + c_2) + c_1c_2
hw(c1+c2)+c1c2。当使用了分组卷积之后,weight的带宽减少:
M A C = h w ( c 1 + c 2 ) + c 1 c 2 g MAC = hw(c_1 + c_2) + \frac{c_1 c_2}{g} MAC=hw(c1+c2)+gc1c2
M A C = h w ( c 1 ) + B g / c 1 + B h w MAC = hw(c_1) + Bg/c_1 + \frac{B}{hw} MAC=hw(c1)+Bg/c1+hwB
也就是当c1, h, w,B都不变的情况下,g越大,虽然c2可以增大,但是会增大MAC(c2增大MAC也增大这是很直接的,不知道为什么要用这么绕的表达) - 因此,group的数目不应该太大,否则要增大总的channel数(让我想起了mobile net v1)
网络碎片化会降低并行度
- 在一些通过NAS得到的网络中包含大量的”小“op,这样能够在有限的FLOPs下提升模型精度,但是会带来额外的开销:比如CUDA Kernel的运行,以及Kernel之间的同步
Element-wise的操作不容忽视
- 这意味着,形如ResNet中的add + ReLU操作需要慎用
ShuffleNet v2
- ShuffleNet v1的核心:
- 使用了point-wise group conv,减少pointwise的计算量
- 在此基础上通过channel转置弥补channel之间的沟通
- ShuffleNet v2基本单元如Fig 3.所示:
- 输入Feature Map根据channel分为两等分,其中一个不动,另一个部分经过bottleneck的可分离卷积之后和另一部分concat
- 为了满足G2,减少group的个数,不用pointwise group conv,改为普通的pointwise
- 通道数不变,concat之后的channel数和concat之前的数目相比没有变化
- 将shuffle部分放到了concat之后,并且在实现中可以将concat shuffle split放到一起,提升并行度
- 对于降采样模块,split操作被stride =2 的sep conv取代,因此输出channel加倍
- 为了减少element-wise操作,没有add操作
- 具体到整体的网络结构,如Table 5.所示,整体来说和原来的v1差不多,在Global AVg Pooling时加入了额外的1x1 conv,用于混合高层的卷积
- Shuffle更准确的理论分析:
- 每个block允许放入更多的channel(因为只有一部分参与计算),从而可以增大模型容量
- 体现了一种前后层之间的特征复用,与densenet类似,增强相邻层之间的融合,特征复用的模型也与densenet很像,如Fig 4. 所示