ShuffleNet
ShuffleNet 是旷视科技最近提出的一种计算高效的 CNN 模型,发表在 CVPR 2018,其和 MobileNet 一样主要是想应用在移动端。ShuffleNet 的目标也是通过模型结构设计、利用有限的计算资源来达到最好的模型精度,这需要很好地在速度和精度之间做平衡。ShuffleNet 的核心是采用了两种操作:pointwise group convolution 和 channel shuffle,在保持精度的同时大大降低了模型的计算量,即:使用点群(pointwise group)卷积来减少 1×1 卷积的计算复杂度,以及,为了克服点群卷积带来的副作用,引入通道混洗(channel shuffle)操作,以帮助信息流过特征通道。
Channel Shuffle for Group Convolutions
现代卷积神经网络通常由具有相同结构的重复构建块组成。例如,ResNeXt 将分组卷积引入到构建块中,从而在表示能力和计算成本之间取得了很好的平衡。但是,这种设计没有考虑 1×1 卷积(在 MobileNet 中也称为逐点卷积)的复杂性。例如,在 ResNeXt 中,只有 3×3 层配备了分组卷积。结果,对于 ResNeXt 中的每个残差单元,逐点卷积占据 93.4% 的乘法加法(如ResNeXt中所建议的基数= 32)。在小型网络中,昂贵的逐点卷积导致通道数量有限,无法满足复杂性约束,这可能会严重影响精度。
为了解决这个问题,可以是在 1×1 层上应用通道稀疏连接,例如分组卷积。通过确保每个卷积仅在相应的输入通道组上运行显着降低了计算成本。但是,如果多个分组卷积堆叠在一起,则会产生一个副作用:某个通道的输出仅从一小部分输入通道派生。图 2(a)说明了两个堆叠的分组卷积层的情况。显然,某个分组的输出仅与该分组内的输入有关。此属性阻止通道组之间的信息流并削弱了表示能力。如果我们允许分组卷积从不同分组中获取输入数据(如图 2b 所示),则输入和输出通道将完全相关。具体来说,对于从上一个分组图层生成的特征图,我们可以先将每个分组中的通道划分为几个子组,然后在下一层中的每个分组中使用不同的子组。图2(c)给出了通道混洗的操作:假设一个具有 g 个组的卷积层,其输出具有 g×n 个信道。首先将输出通道的尺寸调整为 (g,n),转置后再变平,作为下一层的输入。即使两个卷积具有不同数量的分组,该操作仍然有效。而且,信道混洗也是可微分的,这意味着可以将其嵌入到网络结构中以进行端到端训练。
图2 用两个堆叠的分组卷积进行通道混洗。GConv代表分组卷积。a)两个堆叠的卷积层,分组数相同。每个输出通道只与组内的输入通道有关。没有交叉对话;b)当GConv2在GConv1之后从不同的分组中获取数据时,输入和输出通道完全相关;c)为与b)使用通道混洗的等价实现
ShuffleNet Unit
基于上面的设计理念构造 ShuffleNet 的基本单元,如图 3 所示。ShuffleNet 的基本单元是在一个残差单元的基础上改进而成的。如图 3(a)所示,这是一个 3 层的残差单元:首先是 1x1 卷积,然后是 3x3 的 depthwise convolution(DWConv,主要是为了降低计算量),这里的 3x3 卷积是瓶颈层(bottleneck),紧接着是 1x1 卷积,最后是一个 shortcut,将输入直接加到输出上。
然后,将第一个 1×1 卷积替换为逐点卷积,然后进行通道随机混洗操作,以形成ShuffleNet 单元,如图 3(b)。值得注意的是 3x3 卷积后面没有增加通道混洗,作者认为,对于这样一个残差单元,一个通道混洗操作是足够了。还有就是 3x3 的 depthwise convolution 之后没有使用 ReLU 激活函数。
对于 ShuffleNet Stride 应用的情况,如图 3(c)所示,在 shortcut 路径上添加 3×3平均池化,这样可以得到与输出一样大小的特征图;用通道级联(concat)替换逐元素加法,这使得扩展通道尺寸变得容易,而额外的计算成本却很少。
此外,在 ShuffleNet 中,深度卷积仅对瓶颈特征图执行。尽管深度卷积通常理论上的复杂度很低,但作者发现很难在低功率移动设备上高效实现,这可能是由于与其他密集操作相比,计算/内存访问比更差。在 ShuffleNet 单元中,仅在瓶颈上使用深度卷积,以尽可能减小开销。
图3 a)具有深度卷积(DWConv)的瓶颈单元;b)具有逐点卷积(GConv)和通道混洗的ShuffleNet单元;c)stride=2的ShuffleNet单元
表1 ShuffleNet结构。使用FLOPs评估复杂性。对于阶段2,不在第一层逐点卷积上应用分组卷积,因为输入通道的数量相对较少
基于上面改进的 ShuffleNet 基本单元,设计的 ShuffleNet 架构如表 1 所示。除了开始使用的普通的 3x3 的卷积和 max pool 层,网络主要由 ShuffleNet 单元堆叠组成,包括三个阶段。每个阶段的第一个构建块都是 stride=2,这样特征图 width 和 height各降低一半,而通道数增加一倍,其它超参不变。对于下一个阶段,输出通道加倍,与ResNet 相似,将每个 ShuffleNet 单元的瓶颈通道数设置为输出通道的 1/4。
组号 g 控制了分组卷积中的分组数,分组越多,在相同计算资源下,可以使用更多的通道数。表 8 中给出了不同组数的情况,我们调整了输出通道,以确保整体计算成本大致不变(∼140 MFLOPs)。显然,在给定的复杂度约束下,较大的组数会导致更多的输出通道(因此有更多的卷积过滤器),这有助于编码更多的信息,不过由于相应的输入通道有限,这也可能导致单个卷积过滤器的性能下降。为了将网络定制为所需的复杂度,我们可以简单地在通道数量上应用一个比例因子 s。例如,我们将表 8 中的网络表示为 "ShuffleNet 1×",那么 "ShuffleNet s×"意味着将 ShuffleNet 1× 中的过滤器数量放大 s 倍,因此整体复杂度大约是 ShuffleNet 1× 的 s^2 倍。
当前 SOTA!平台收录 ShuffleNet 共 26 个模型实现资源,支持的主流框架包含 TensorFlow、PyTorch、CANN、MXNet 等。
模型 | SOTA!平台模型详情页 |
ShuffleNet | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/models/models/445701e7-940d-4905-bbce-cf47377adfc7 |
MnasNet
MnasNet 的文章发表在 CVPR 2019。MnasNet 以及我们接下来介绍的 EfficientNet,还有用于目标检测的 EfficientDet 都是谷歌 AutoML 大佬 Tan Mingxing 的系列化工作,对卷积神经网络的结构进行优化。其中,MnasNet 利用NAS 方法对卷积网络的基础模块进行搜索,EfficientNet 和 EfficientDet 分析了输入图像分辨率、网络的宽度和深度这三个相互关联的影响网络精度和实时性的因素,对分类网络和检测网络结构进行合理化设计。
MnasNet 使用强化学习的思路,是一种资源约束的终端 CNN 模型的自动神经结构搜索方法。终端轻量化神经网络模型需要同时考虑三个维度:参数少、速度快和精度高。MnasNet 将实时性显式地结合到主要目标中,这样搜索空间就可以识别出一个在准确性和实时性实现良好平衡的模型,即将实时性和准确率作为强化学习中的 reward,并且直接使用手机平台运行模型,直接测量实时性和准确率。MnasNet 总体流程主要包括三个部分,如图 4 所示:一个基于 RNN 的学习和采样模型架构控制器,一个建立和训练模型以获得准确率的训练器,以及一个使用 TensorFlow Lite 测量真实手机上模型速度的推理引擎。
图4 MnasNet流程
作者将问题描述为一个考虑 CNN 模型精度和推理实时性的多目标优化问题,旨在实现高准确率和高速。使用架构搜索和强化学习以找到模型,在准确率和实时性间取得平衡,并利用带有定制奖励函数的强化学习算法来寻找帕累托最优解 (例如,具有最高准确率但速度不变的模型)。
给定一个模型 m,ACC(m)表示它在目标任务上的准确性,LAT(m) 表示在目标移动平台上的推理延迟,T 是目标延迟。一个常见的方法是将 T 作为一个硬约束,并在这个约束下使精度最大化:
然而,这种方法只最大化了一个指标,并没有提供多个帕累托最优解决方案。如果一个模型在不增加延迟的情况下具有最高的准确性,或者在不减少准确性的情况下具有最低的延迟,那么该模型就被称为帕累托最优。作者使用定制的加权乘积法来接近帕累托最优解,其优化目标定义为:
为了进一步在灵活性和搜索空间大小之间取得适当的平衡,论文还提出一种新的分解层次搜索空间,将卷积神经网络分解为一个由模块组成的序列,然后使用层级搜索空间决定每一个模块的层级结构。该空间允许整个网络的分层多样性,允许不同的层级使用不同的运算与连接。同时,强制每一个模块共享相同的结构,因此与逐层搜索相比搜索空间要小几个数量级。
如图 27 所示,将 CNN 模型划分为一系列预定义的 Block 序列,逐渐降低输入分辨率和增加滤波器尺寸。每一个 Block 内含有一系列 identical layers,其卷积操作和连接由每一个 Block 搜索空间确定。搜索空间包括:
(1) 卷积类型 ConvOp:常规卷积 (conv)、深度卷积 (dconv)t 和移动倒置瓶颈卷积
(2)卷积核 kernal Size:3*3和5*5
(3)SE 比例 SE ratio:0 和 0.25 (这个是 SENet 中,计算权重因子时的参数数量的缩放比例)
(4)直连操作 SkipOp:池化、恒等和无直连
(5)输出卷积核个数 Fi
(6)每层叠加的数量 Ni
以上决定了一个 block 的结构,其中,ConvOp、Kernel Size、SE ratio、SkipOp 和 Fi 决定了一个 layer 的结构,Ni 决定了 layer 重复的数量。图 5 中,block 4 的每个layer 有一个倒置的瓶颈 5x5 卷积层、恒等残差,这样的 layer 重复了 N4 次。
图5 因子化层次搜索空间
最后,MnasNet 基于强化学习的 CNN 结构搜索算法。将搜索空间中的每个 CNN 模型映射为一系列 tokens。Tokens 由强化学习 agent (参数为 θ )的一组动作 a_(1:T)决定。目标是最大化期望奖励:
搜索框架由三部分组成:循环神经网络控制器,一个训练器获得模型精度和移动推理引擎获得模型推理延迟。在每一步中,控制器使用它现在的参数采样一组模型,基于 RNN的 softmax logits 预测一组 tokens。对于每个采样模型 m,在目标任务上训练,计算精度 ACC(m),在平台上运行模型获得推理延迟 LAT(m),根据目标函数计算奖励值 R(m)。在每一步的最后,最大化期望奖励来更新控制器参数。一直循环到达到最大的步数或参数收敛。
当前 SOTA!平台收录 MnasNet 共 6 个模型实现资源,支持的主流框架包含 PyTorch、CANN、MindSpore、TensorFlow 等。
模型 | SOTA!平台模型详情页 |
MnasNet | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/models/models/ca934188-fc29-435d-b98a-814b1d0592d7 |