ShuffleNet论文记录

简介

ShuffleNet是一个非常有效的移动卷积神经网络。它是计算效率极高的卷积神经网络结构,它的专门为计算能力有限的设备设计的,该结构利用了点态群卷积和信道混洗两种新的运算方式,保证精度的同时,降低计算成本。最精确的卷积神经网络需要数十亿的计算,本文恰好相反,在有限的计算预算中,以数十或数百个MFLops来追求最佳的准确率,我们的目标是探索一个高效的基础架构,专门为我们所需的计算范围设计。ResNet等结构大量运用1 * 1卷积耗费很多资源,使在小网络中效率较低。
本文使用了点态群卷积来减少1 * 1卷积的复杂性,为了克服群卷积的副作用,我们提出了一种新的信道混洗操作,来帮助信息在特征信道之间流动,基于这两点我们构建了ShuffleNet网络。对比其他网络,对于给定的计算复杂度预算,ShuffleNet允许使用更多的特征映射通道,有助于编码更多信息,并对小网络的性能尤为重要。

Related Work

有效的模型设计:在嵌入式设备上运行高质量的深度神经网络的需求日益增长,促使了对高效模型设计的研究。我们采用强化学习和模型搜索来探索有效的模型设计。ShuffleNet采用了群卷积和通道混洗操作,将群卷积和深度可分卷积以一种新的形式进行推广。
模型加速:该方向是在保持预训练模型和精度同时加速推理过程。ShuffleNet专注于设计更好的模型来直接提高性能,而不是加速或转换现有的模型。

Channel Shuffle for Group Convolutions

卷积的group操作从AlexNet就已经存在了,当时是为了解决模型在双GPU上的训练。一般的卷积操作比如输入特征图的数量是N,该层卷积的filter数量是M,那么M个filter中的每一个filter都要和N个特征图的某个区域做卷积,然后相加作为卷积的结果。假设引入group操作,设group为g,那么N个输入特征图就被分成g个group,M个filter也被分成g个组,然后在做卷积操作的时候,第一个group的M/g个filter都和第一个group的N/g个输入特征图做卷积得到结果,第二个group一直到最后一个group都是相同的操作。
ShuffleNet论文记录
如上图(a),不同的颜色代表不同的group,图中有三个group。这样的操作可以大大减少计算量,因为你的每个filter不再是和输入的全部特征图做卷积,而是和同一个group做卷积。但是多个group操作叠加在一起,就会产生边界效应,就是某个输出的通道卷积来自输入通道的一小部分,这样学出来的特征就会非常局限,于是就有ShuffleNet的通道混洗来解决这个问题,再看(b),再进入GConv2之前,对输入特征图做一个group分配,将每一个group,分成了几个小group,然后将不同group的小group作为GConv2的输入,使得GConv2的每一个group都能卷积输入的所有group的特征图。(b)和©思想是一样的。
如果我们允许组卷积能够得到不同组的输入数据,那么输入输出通道将会是全关联的。具体来说,对于上一层的输出通道,可以有一个channel shuffle操作,再分几个组,再进入下一层。对于这个shuffle操作,有一个高效的实现方式:对于一个卷积层分为g组,有g * n个输出通道,将它们reshape为(g,n),再转置为(n,g),平坦化,再分回g组作为下一层的输入。这样的操作是可微的,模型可以保持端到端的训练。

Shuffle unit

点态群卷积,其实就是带group的卷积核为1 * 1的卷积,点卷积的卷积核为1 * 1.再ResNeXt中主要是对3 * 3的卷积来做group操作,但是再ShuffleNet中,作者是对1 * 1的卷积来做group操作,因为作者认为1 * 1的卷积操作计算量不可忽视。
ShuffleNet论文记录
图(a)是一个残差块,主分支部分,我们可以将标准卷积3 * 3拆分成深度可分卷积。再将第一个1 * 1卷积替换成逐点组卷积,再进行通道混洗变为图(b)。
图(b)即ShuffleNet unit,主分支最后的1 * 1卷积改为1 * 1组卷积,为了适配和恒等映射做通道融合。配合BN层和ReLU**函数构成基本单元。
图©即是在做降采样的ShuffleNet unit,主要有两点修改:一个是在辅助分支加入stride为2的3 * 3平均池化。第二点是原来的ResNet最后一个是Add操作,也就是元素相加,而在©中采用了concat操作,也就是按channel进行合并,这扩大了通道维度,增加的计算成本却很少。
需要注意的是:虽然深度卷积可以减少计算量和参数量,但是在低功耗设备上与密集的操作相比,计算/存储访问的效率更差。所以在ShuffleNet上我们只在bottleneck上使用深度卷积,尽可能的减少开销

NetWork Architecture

表1为ShuffleNet的结构表,基本和ResNet是一致的,分成了几个stage,然后在每个stage中用ShuffleNet替换原来的Residual block,这也是ShuffleNet算法的核心。这个表限定在complexity的情况下,通过改变group的数量来改变输出通道的数量,更多的输出通道可以提取更多的特征。
ShuffleNet论文记录
主要分为三个阶段:每个阶段的第一个block的步长为2,下一个阶段 的通道数翻倍。每个阶段内除了步长其他超参数不变。每个ShuffleNet unit的bottleneck通道数为输出的1/4.
我们可以使用放缩因子s控制通道数,ShuffleNets*即表示通道数放缩到s倍。

Experiment

在ImageNet的分类集上做评估,大多数遵循ResNeXt的设置,除了将权重衰减从1e-4降低到4e-5.数据增强使用较少的aggressive scale增强。因为小型网络在训练过程中通常会欠拟合而不是过拟合。
表2表示不同大小的ShuffleNet在不同的group数量情况下的分类准确率比较。ShuffleNets*即表示通道数放缩到s倍。arch2表示将原来网络结构中的stage3的两个unit移除,同时在保持复杂度的前提下拓宽每一个特征图。表2的一个重要结论是group个数的线性增长并不会带来分类准确率的线性增长。但是发现ShuffleNet对于小网络的效果更明显,因为小网络的通道个数都不是太多,在限定计算资源的情况下,ShuffleNet可以使用更多的feature map。
ShuffleNet论文记录
ShuffleNet操作是为了实现多个组逐渐信息交流,下表为有无Shuffle操作的性能差异,可以看出在在三种不同复杂度下带Shuffle的都表现的很好,尤其组数较大的时候,体现了Shuffle的重要性。
ShuffleNet论文记录
下图为几个流行网络的分类准确率对比。
ShuffleNet论文记录
下图为ShuffleNet与MobileNet的对比,效果下可以。
ShuffleNet论文记录

总结

ShuffleNet的核心就是用点态组卷积,通道混洗和深度可分卷积来代替ResNet block的相应层,构成了ShuffleNet,达到减少计算量和提高准确率的目的。通道混洗解决了多个组卷积叠加出现的边界效应,点态组卷积和深度可分卷积主要减少计算量。