ShuffleNet V2受启发于ShuffleNet V1,但并不局限于此,作者为轻量级网络的设计提出了一个新的直接指标和衡量标准,并通过一系列实验,对未来轻量级网络模型的设计提供了四点重要的思路和指导方针,最后在ShuffleNet V1的基础上进行了改进,结合四点指导方针,完成了ShuffleNet V2的构建。
作者首先分析了现有的很多轻量级网络,例如MobileNet V2,ShuffleNet V1等,认为这些网络模型在设计和评估测试阶段,过于迷信FLOPs(每秒浮点计算量)这个指标,而对于一个网络模型的评估,单单只看这一个指标,很容易导致一个次优化设计的产生。作者认为,现有的FLOPs是一个间接评估准则,与直接评估准则速度(Speed)之间还存在很多不协调,不一致的地方,而导致这点不一致的原因主要有两个:
比如Memory access cost(MAC),内存访问成本,这个因素对速度的影响很大,而恰恰很多能大幅度降低FLOPs的设计会很大程度上提高MAC的数值,最典型的例子就是Group Convolution,分组卷积。
再比如degree of parallelism,并行度,在同等FLOPs的条件下,具有高并行度的网络会拥有更快的运行速度。
通常来说,3x3的卷积层要比1x1的卷积层花费更多的计算时间,但在最新版本的CUDNN库的环境下,由于专门对3x3的卷积操作进行了优化,实际运行速度并不比1x1的卷积层慢上多少。
针对以上两点,对于一个高效率网络模型的设计,作者提出了两个应该考虑的准则:
基于以上的motivation,作者展开了更进一步的实验,并提出了四点实际高效率网络模型设计应该遵守的四点原则。
首先是实验环境,作者在两个设备上(GPU and ARM)上进行了对比实验,打开了完全优化选项,输入图像的尺寸为224x224xs 3,网络模型采用随机初始化,并评估100次,采用平均运行时间。
作者使用MobileNet V2和ShuffleNet V1,在GPU和ARM两个设备上进行了实验,并根据网络模型各个操作的运行时间,绘制出了比例图:
从上图中可以发现,即便是同一网络模型,在不同设备中的运行时间都有着非常明显的差异,这里,作者认为FLOPs主要可以用Conv代表,大部分计算都发生在Conv中,可以很清楚地看出Conv,也就是FLOPs,在GPU上所占的运行时间比例不过是50%到54%,而剩下近一半对运行时间,运行速度有影响的因素(例如数据输入输出,数据洗牌,逐元素操作等等),都无法用FLOPs这个指标去衡量,所以作者认为,对于网络模型的运行时间来说,FLOPs并不是一个足够准确的度量标准。
从上图的(c)(d)能发现,对于一个相同的FLOPs,不同模型间的数据处理速度可以说是天差地别。
基于以上观察,为了设计出一个高效率的轻量级网络模型,作者提出了四点不应违反的设计准则:
作者在这里假设有一个逐点卷积层,尺寸是 ,输入图片的尺寸是,那么我们得到的输出就是,这里我们的浮点计算量是B= ,另一方面,内存访问成本(MAC)则是M= ,这里的前一项,是输入输出feature map的权重参数数,后一项是卷积核的权重参数数,这里,作者根据均值不等式计算,得出了以下结果:,而这个不等式只有当的时候,等号成立。
从这里可以发现,MAC是存在一个下界的,这个下界只有当输入和输出feature map的通道数相等的时候才成立,于是作者认为,在设计网络模型的时候,应该注意尽量让feature map在通过卷积层前后,通道数保持一致。
作者做了一系列实验来验证这个理论:
上图是作者所做验证实验的结果Table,可以看出,当输入输出通道数一致的时候,数据处理速度是最快的,而当c1:c2这个数值的缩小,feature map经过卷积层前后的通道数差异越大,网络模型的运行速度明显变慢了,验证了作者的想法。同时,还可以注意的是,随着的数值不断膨胀,网络模型的运行速度也显著降低了,这是显而易见的。
在ShuffleNet V1中,大量使用了Group Convolution(分组卷积)来降低FLOPs,作者在实际测验评估之后,得出结论:Group Convolution确实能够大幅度降低FLOPs(几乎一个量级),但作为代价,也会同时大幅度提高MAC,一方面,它能在给定的FLOPs环境下,尽可能利用更多的通道数,提高网络能力,另一方面也会显著增加内存的消耗。
对于一个的group convolution,它的MAC可以表示为:
上式中,,代指group convolution的FLOPs,可以看出,随着参数的增大,FLOPs确实降低了一个量级,但对于给定的FLOPs(即恒定),MAC会随着参数的增加而增加,作者同样也做了实验进行验证:
上图是作者验证实验的结果Table,随着参数的增加,网络模型的运行速度明显降低了,证明了作者的想法,与前一点一致,随着feature map通道数的膨胀,网络模型的速度逐渐下降。这里,,用于控制四组实验的FLOPs保持一致.
这里,作者认为,一个网络的block中,如果分支越多,那么网络模型的运行速度就会越慢,这里的分支既包括串行,也包括并行,回顾ShuffleNet V1,我们可以发现,一个进行下采样的ShuffleNet Unit中,包含了四个以上的串行分支和一个并行分支,大大增加了内存与模型运行的负担,作者根据这个理论,进行了验证实验:
上图是作者验证试验的结果Table,2-fragment-series代表着一个block里面存在着两个串行的卷积层,4-fragment-series则代表着四个串行的卷积层,2-fragment-parallel代表一个block里面存在两个并行的卷积层,以此类推。可以清楚地看出,随着block中分支数目的增加,网络运行速度不断下降,而相比于串行,并行对网络模型运行的负担更为严重,速度下降的更多。
Element-wise operations,最常见的比如ReLU,AddTensor,AddBias等等,作者在这里泛指了一种具有低FLOPs,高MAC的操作,比如在MobileNet V2和ShuffleNet V1里面都广泛使用的DepthWise Convolution操作就是一种典型的具有极地FLOPs和极高MAC的操作,因此为了加速网络模型,就要在满足一定的FLOPs的情况下,尽可能减少这类操作的数量。
上图是作者根据ResNet的一个bottleneck block做得验证试验,可以看见,当element-wise operations数目减少(ReLU and short-cut),网络模型速度得到了较为明显地提高,证明了作者的理论。
根据上述作者的结论和四个设计指导原则,作者在ShuffleNet V1的基础上,做出改进,提出了ShuffleNet V2版本。
上图是ShuffleNet V1 Unit(a)(b)和在此基础上改进得来的ShuffleNet V2 Unit(c)(d)。
先对比不进行下采样的(a)和(c),我们首先可以发现,ShuffleNet V2 Unit在一开始引入了一个Channel Split,主要功能是将输入的feature map按照其通道数c分割成与,这里其实相当于一个分组操作,可以减少FLOPs,用于替代后续被替换掉的Group Convolution,同时,为了对应G1原则,作者在这里取,等于将输入feature map在通道维度上二等分;其次,在右边的串行分支中,1x1的group convolution被替换成了普通的1x1卷积层,因此不需要Channel Shuffle,也删掉了后续的Channel Shuffle,这与G2原则相适应;之后将element-wise operation Add的操作替换成了Concat,与G4原则相对应;然后在最后的输出前加入Channel Shuffle,正如之前所说,最初的Channel Split其实是一个分组的操作,于是便需要在输出前进行Shuffle,来保持组间存在信息交流,增加信息表达能力;还有一点,因为这个Unit不进行下采样,通道数也保持不变,在网络模型中经常会重复多次,在重复多次的过程中,Channel Shuffle,Channel Split,Concat这三个操作可以合并在一起减少串行数目,与G3原则相适应。
再对比(b)和(d),与(a)和(c)类似,group convolution被普通的卷积层替代,左边分支的平均池层用一个DW和PW替代,因为没有Channel Split操作,最后进行Concat的时候,通道数翻倍,这时可以理解成变成了两组拥有和输入相同通道数的输出,于是同样要进行Channel Shuffle操作,而在后续连接(c)的时候,Channel Shuffle,Channel Split,Concat三个操作同样可以合并在一起。
最后这个是ShuffleNet V2的完整网络模型,除了ShuffleNet Unit发生了变化外,整体网络模型的变化不大,唯一的变化点是在GlobalPool前面增加了一个的卷积层,用于混合特征。