October 16, 2018
by Frank
本文介绍了一种很高效的网络 ShuffleNet,其主要在于 pointwise group conv 和 channel shuffle 两种操作,可以在维持精度的时候大量减少计算消耗,在 ImageNet 和 COCO 上面的表现都超过了之前的网络
本文介绍了一种很高效的网络 ShuffleNet,其主要在于 pointwise group conv 和 channel shuffle 两种操作,可以在维持精度的时候大量减少计算消耗,在 ImageNet 和 COCO 上面的表现都超过了之前的网络
构造更深,更宽的神经网络在解决视觉识别上面是发展趋势。然而本文提出另外一个极端:在有限的计算资源下达到最佳的性能。现有的很多方法(剪枝压缩等)都只是在处理基本的神经网络,而这里提出了一种给定计算资源下的高效网络结构。
现在的 state-of-the-art 网络对资源都比较消耗计算资源,主要是因为太密集的 1x1 conv,本文使用了 1x1 group conv 来减小计算量,并且使用 channel shuffle 来增加各个 channel 之间的通讯,这样可以编码更多信息,基于这两个技术而构建了 ShuffleNet,基于这两个设计准则,在 ImageNet 和 COCO 上都取得了更好的性能,另外在真实的硬件平台上也有明显的加速效果
Efficient Model Designs:GoogLeNet 增加了网络深度但是相比简单的 conv 层堆积减少了计算量。SqueezeNet 在维持精度的情况下明显减少了计算量。ResNet 利用有效的瓶颈结构来得到较高的性能。SENet 引入了一个结构单元在小计算量的情况下加速性能。另外最近有工作利用强化学习和模型搜索来探索高效的模型设计,得到的 NASNet 得到了不错的精度表现,但是在较小的 FLOPs 下表现比较一般。
Group Convolution:group conv 最开始在 AlexNet 当中被提出,当时是为了在多个 GPU 上进行分布式训练,后来在 ResNeXt 当中表现了其有效性。Xception 中的 Depthwise separable conv 总结了 Inception 系列网络的想法,后来 MobieNet 利用 depthwise separable conv 实现了 state-of-the-art。
Channel Shuffle Operations:channel shuffle 的思想在之前的工作中很少被提出来,即使 cuda-convnet 支持"random sparse conv"层,等价于后面带有 group conv 层的 random channel shuffle。最近有工作在 two-stage conv 上应用这个思想但是却没有 channel shuffle 自身在小模型设计上的有效性。
Model Acceleration:这个是为了在保留模型精度的时候加速推断,对网络连接或者通道进行剪枝可以在保留性能的时候去掉冗余的连接。quantization 和 factorization 可以减少计算当中的冗余从而加速推断。另外在不修改参数的时候,优化的卷积算法比如 FFT 都会减少实际当中的时间消耗。另外 distilling 可以从大模型中训练小模型,可以让训练小模型变得更加容易。
现在的很多 state-of-the-art 网络,比如 Xception 和 ResNeXt 都有太多的 1x1 conv,在每个 block 中占了大量的计算量,如果在限制计算资源的情况下就只能有更少的 channel 数,这样会降低模型的精度。要解决这个问题可以使用 channel 之间的稀疏连接,例如 group conv 就是其中的一个例子。然而这样会导致一个组内的输出只与这个组内的输入相关,会导致 channel group 之间的联系变得较弱,可以通过 channel shuffle 可以让 group conv 从不同的 group 获取信息,从而解决这个问题。具体操作为(g,n)维度先转置,然后展开,然后再 reshape 为(g,n),其中 g 为 group 数,n 为每组 channel 数。当两个卷积有不同的 group 数的时候依然是有效的,并且这个 shuffle 操作也是可以微分的。
这个 unit 是专门为小网络设计的,使用了 bottleneck 的结构。unit 分为两种,一种是没有 stride,输入输出维度一样的,采用残差结构,最后是求和。另外一种是有 stride 的,同样残差结构不过最后采用了 concat。这个 Unit 相比 ResNet 和 ResNeXt 更加高效,比如给定输入维度,瓶颈通道数为,ResNet 的 FLOPs 为,ResNeXt 的 FLOPs 为,ShuffleNet unit 的 FLOPs 为,也就相当于在给定计算资源的情况下 ShuffleNet unit 能够使用更宽的特征图。另外 depthwise conv 虽然只有很小的理论上的复杂度,但是 FLOPs/MAC 比较小,这个在后面的 ShuffleNetV2 中有提到,所以只在 bottleneck 那里使用 depthwise conv。
在整个网络里面,为了简化,Bottleneck 的 channel 数为输入的,这里提供一个尽可能简单的参考模型,尽管进一步调参可能会取得更好的结果。其中的参数控制连接的稀疏度,更多的 group 可能会帮助编码更多信息,但是对于单个 conv 可能会降低其性能,在 ShuffleNetV2 中也从另一个角度讨论了该问题:过多的 group 会增加 MAC 从而降低速度。另外用一个超参数来对网络进行缩放,通过缩放调整通道数来实现。
主要在 ImageNet 上做的实验,因为小型网络更加容易遭遇过拟合,所以使用了很轻微的 data augmentation。
这里主要对于两个方面进行分析,一是 pointwise group conv,二是 channel shuffle。这两个是 ShuffleNet 的核心组件
对于 pointwise group conv,这里利用不同规模(缩放 s),不同 group 的网络进行对比,实验表明对于比较大的网络,当 group 达到一定值之后对于单个 conv,其输入的通道数过少,将会影响表达性能。但是当缩放因子比较小的时候,网络比较小在 group 增大的时候更能明显提高性能,因为对于小网络而言,更宽的特征图可以带来更大的好处。
对于 channel shuffle,实验证明 channel shuffle 明显能够持续提高分类分数,尤其当 group 比较大的时候性能更好,此时的跨组信息交换变得更加重要。
在之前的 ShuffleNet 框架上与一些 unit 进行了对比,实验结果如图
这里主要将 ShuffleNet 与其它一些经典的结构相比较,其中值得注意的是在 ShuffleNet 和 MobileNet 相比较的过程中,减少 ShuffleNet 的深度也明显会比 MobileNet 更好,这说明 ShuffleNet 与之相比关键在于 unit 的设计而非网络深度,另外可以将 ShuffleNet 与其他优秀设计比如 SE 模块(Squeeze-and-Excitation)相组合,可以进一步提升其性能但是会变得比较慢。
为了探究 ShuffleNet 的泛化和迁移学习的性能,在 COCO 上进行了测试,利用 Faster-RCNN 的框架来进行实验。在这项任务上依旧比 MobileNet 好了很多,可能是由于网络结构设计没有过多的冗余装饰,所以泛化性能比较好。
这里在 ARM 平台上进行了测试,group 数较大的时候(比如 g=8)性能最好但是 g=3 的时候在性能和推断时间上有着比较好的平衡,但是依旧要比其他网络更优秀。