ShuffleNet V1-V2

前言

在ResNeXt的文章中,分组卷积作为传统卷积和深度可分离卷积的一种折中方案被采用。这时大量的对于整个Feature Map的Pointwise卷积成为了ResNeXt的性能瓶颈。一种更高效的策略是在组内进行Pointwise卷积,但是这种组内Pointwise卷积的形式不利于通道之间的信息流通,为了解决这个问题,ShuffleNet v1中提出了通道洗牌(channel shuffle)操作。

在ShuffleNet v2的文章中作者指出现在普遍采用的FLOPs评估模型性能是非常不合理的,因为一批样本的训练时间除了看FLOPs,还有很多过程需要消耗时间,例如文件IO,内存读取,GPU执行效率等等。作者从内存消耗成本,GPU并行性两个方向分析了模型可能带来的非FLOPs的行动损耗,进而设计了更加高效的ShuffleNet v2。ShuffleNet v2的架构和DenseNet有异曲同工之妙,而且其速度和精度都要优于DenseNet。

ShuffleNet v1

一、Introduction

Xception、ResNeXt在非常小的网络上效率很低,主要是因为dense 1 × 1 convolution 计算量较大

在MobileNet中分析过, 深度可分离卷积 分为depthwise conv 和pointwise conv ,其中depthwise conv计算量为 ,pointwise conv 计算量为 ,一般是远大于 的,所以计算量主要集中在pointwise conv 上,而这里提到的1 × 1convolution指的就是pointwise conv ,所以文章针对这个改进,提出了pointwise group conv。然后为了避免引入pointwise group conv带来的副效应,又提出了channel shuffle操作。

二、related work

1、高效的模型设计
GoogLeNet、SqueezeNet、ResNet、SENet、NASNet等

2、Group Convolution
最初在AlexNet的论文中提出,效果在ResNeXt中得到验证,在Xception中提出的 深度可分离卷积是对Inception系列中seperable convolution的泛化。MobileNet使用到了 深度可分离卷积,本文是结合了 组卷积和 深度可分离卷积。

3、Channel Shuffle Operation
之前文章对这个的研究很少

4、 Model Acceleration
该方向旨在保持预训练模型的精度同时加速推理过程。常见的工作有:通过修剪网络连接或减少通道数减少模型中连接冗余;量化和因式分解减少计算中冗余;不修改参数的前提下,通过FFT和其他方法优化卷积计算消耗;蒸馏将大模型的知识转化为小模型,是的小模型训练更加容易;ShuffleNet的工作专注于设计更好的模型,直接提高性能,而不是加速或转换现有模型。

三、Approach

1、Channel Shuffle for Group Convolutions

用group convolution可以有效减少pointwise convolution的计算量,如图中(a)所示。但问题是这样会导致不同group的信息得不到交换,会一定程度上削弱模型的性能。因此最好在group conv之后再将不同group的信息综合一下,如图中(b)所示。此时就可以使用channel shuffle操作,如图中©所示,而且这个操作是可导的,因此可以加入到网络中。

def channel_shuffle(x, groups):
    """
    Parameters
        x: Input tensor of with `channels_last` data format
        groups: int number of groups per channel
    Returns
        channel shuffled output tensor
    Examples
        Example for a 1D Array with 3 groups
        >>> d = np.array([0,1,2,3,4,5,6,7,8])
        >>> x = np.reshape(d, (3,3))
        >>> x = np.transpose(x, [1,0])
        >>> x = np.reshape(x, (9,))
        '[0 1 2 3 4 5 6 7 8] --> [0 3 6 1 4 7 2 5 8]'
    """
    height, width, in_channels = x.shape.as_list()[1:]
    channels_per_group = in_channels // groups
    x = K.reshape(x, [-1, height, width, groups, channels_per_group])
    x = K.permute_dimensions(x, (0, 1, 2, 4, 3))  # transpose
    x = K.reshape(x, [-1, height, width, in_channels])
    return x

2、 ShuffleNet Unit
图(a)是一个普通的带有残差结构的深度可分离卷积,例如,MobileNet, Xception。ShuffleNet v1的结构如图(b),(c)。其中(b)不需要降采样,(c)是需要降采样的情况。

(a) MobileNet, (b) ShuffleNet v1,(c) ShuffleNet v1降采样情况

(b)和(c)已经介绍了ShuffleNet v1全部的实现细节,我们仔细分析之:

  1. 上下两个红色部分的 1x1 卷积替换为 1x1 的分组卷积,分组 g 一般不会很大,论文中的几个值分别是1,2,3,4,8。当 g=1 时,ShuffleNet v1退化为Xception。 g 的值确保能够被通道数整除,保证reshape操作的有效执行。
  2. 在第一个 1x1 卷积之后添加Channel Shuffle操作。
  3. 如图(c)中需要降采样的情况,左侧shortcut部分使用的是步长为2的 3x3 平均池化,右侧使用的是步长为2的 3x3 的Depthwise卷积

2. ShuffleNet v2

2.1 模型性能的评估指标

在上面的文章中我们统一使用FLOPs作为评估一个模型的性能指标,但是在ShuffleNet v2的论文中作者指出这个指标是间接的,因为一个模型实际的运行时间除了要把计算操作算进去之外,还有例如内存读写,GPU并行性,文件IO等也应该考虑进去。最直接的方案还应该回归到最原始的策略,即直接在同一个硬件上观察每个模型的运行时间。如图4所示,在整个模型的计算周期中,FLOPs耗时仅占50%左右,如果我们能优化另外50%,我们就能够在不损失计算量的前提下进一步提高模型的效率。

在ShuffleNet v2中,作者从内存访问代价(Memory Access Cost,MAC)和GPU并行性的方向分析了网络应该怎么设计才能进一步减少运行时间,直接的提高模型的效率。

2.2 高效模型的设计准则

G1):当输入通道数和输出通道数相同时,MAC最小
G2):MAC与分组数量 g 成正比
G3):网络的分支数量降低并行能力
G4):Element-wise操作是非常耗时的

总结一下,在设计高性能网络时,我们要尽可能做到:

G1). 使用输入通道和输出通道相同的卷积操作;
G2). 谨慎使用分组卷积;
G3). 减少网络分支数;
G4). 减少element-wise操作。
例如在ShuffleNet v1中使用的分组卷积是违背G2的,而每个ShuffleNet v1单元使用了bottleneck结构是违背G1的。MobileNet v2中的大量分支是违背G3的,在Depthwise处使用ReLU6激活是违背G4的。

从它的对比实验中我们可以看到虽然ShuffleNet v2要比和它FLOPs数量近似的的模型的速度要快。

2.3 ShuffleNet v2结构

图6中,(a),(b)是刚刚介绍的ShuffleNet v1,(c),(d)是这里要介绍的ShuffleNet v2。

图6:(a) ShuffleNet v1 ,(b)ShuffleNet v1 降采样, (c)ShuffleNet v2,(d)ShuffleNet v2 降采样

.4 ShuffleNet v2和DenseNet

ShuffleNet v2能够得到非常高的精度是因为它和DenseNet有着思想上非常一致的结构:强壮的特征重用(Feature Reuse)。在DenseNet中,作者大量使用的拼接操作直接将上一层的Feature Map原汁原味的传到下一个乃至下几个模块。从6.(c)中我们也可以看处,左侧的直接映射和DenseNet的特征重用是非常相似的。

不同于DenseNet的整个Feature Map的直接映射,ShuffleNet v2只映射了一半。恰恰是这一点不同,是ShuffleNet v2有了和DenseNet的升级版CondenseNet[8]相同的思想。在CondenseNet中,作者通过可视化DenseNet的特征重用和Feature Map的距离关系发现距离越近的Feature Map之间的特征重用越重要。ShuffleNet v2中第 i 个和第 i+j 个Feature Map的重用特征的数量是 。也就是距离越远,重用的特征越少。

总结
截止本文截止,ShuffleNet算是将轻量级网络推上了新的巅峰,两个版本都有其独到的地方。

ShuffleNet v1中提出的通道洗牌(Channel Shuffle)操作非常具有创新点,其对于解决分组卷积中通道通信困难上非常简单高效。

ShuffleNet v2分析了模型性能更直接的指标:运行时间。根据对运行时间的拆分,通过数学证明或是实验证明或是理论分析等方法提出了设计高效模型的四条准则,并根据这四条准则设计了ShuffleNet v2。ShuffleNet v2中的通道分割也是创新点满满。通过仔细分析通道分割,我们发现了它和DenseNet有异曲同工之妙,在这里轻量模型和高精度模型交汇在了一起。

参考链接:
ShuffNet v1 和 ShuffleNet v2
[论文笔记] ShuffleNet
ShuffleNet算法详解

你可能感兴趣的:(ShuffleNet V1-V2)