论文笔记:ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design

链接:https://arxiv.org/pdf/1807.11164.pdf

中心思想

  1. 指出当前主流的对轻量级网络的衡量方式不够全面(仅用FLOPs来衡量一个模型的轻量级程度)
  2. 实际在端上执行一张图像的预测,还需要考虑其他因素,如内存访问,平台架构等等
  3. 因此从实际角度出发,给出了一些轻量级网络的设计指导,并最终根据这些指导,引出了新的网络结构——ShuffleNet v2

用FLOPs衡量模型的主要问题

  • FLOPs本身和实际应用中关心的效率指标未必成正相关,如在应用中一般用的是speed, latency
  • 在FLOPs相同的情况下,不同网络的真正速度也有差别,
  • 同一个网络,在不同的平台下运行速度也会有限制

因此,只用FLOPs不够,原因是:还有其他的额外因素左右了模型的真正的运行速度:

  • MAC(memory access count)这里将取一个数据(Feature Map或者weight中的某一个数)作为一次内存访问。例如:Group Conv操作会增加内存访问,从而将速度的性能瓶颈从计算变为内存访问
  • 数据的并行程度,在同样的FLOPs的情况下,数据的并行度越高,整体的速度越快
  • 具体的运算平台。一个典型的例子是,受到CUDNN优化的限制(对3x3卷积进行了优化,通过矩阵分解的方式实现卷积,如果按照FLOPs算的话,是降低的,但是在CUDNN上反而最终速度会变慢)

因此,要考虑2个因素:

  1. 用一些更直接的度量准则(Latency, speed等)来取代现有的FLOPs非直接准则
  2. 在不同的平台单独评测速度

高效(轻量级)网络的设计准则

论文笔记:ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design_第1张图片
如Fig 2.所示:

  1. 同样的网络,在不同的平台上,时间占比不相同。ShuffleNet 和 MobileNet在GPU上,Element Wise计算(Add, ReLU等)以及数据的存储会占用更多的时间;而在CPU上,更多的时间被花在了卷积操作上
  2. FLOPs衡量的仅仅是卷积操作,上述的Element Wise操作是被忽视的。因此,FLOPs并不是一个能够准确反映最终运行时间的效率衡量方式
    结合实际,下面是几条设计准则:

输入输出channel相同时,内存访问的代价越低

  • 对于1x1卷积而言,总共的MAC = hw(c1 + c2) + c1c2,分别为weight的内存访问和Feature Map的feature访问(包括存取数值)。这里仅考虑cache无限大的情况
  • hw(c1 + c2)写成均值不等式的形式,有:
    M A C ≥ 2 h w B + B h w MAC \geq 2\sqrt{hwB} + \frac{B}{hw} MAC2hwB +hwB
    其中B为FLOPs
    B = h w c 1 c 2 B = hwc_1c_2 B=hwc1c2
  • 上式当c1 = c2的时候,等号成立,因此得到结论:输入输出channel相同时,内存访问的代价越低
  • 从计算机系统的角度来说,本质上是在输入/输出之间做均衡

过多的分组卷积会增加内存访问

  • 回到MAC的公式 h w ( c 1 + c 2 ) + c 1 c 2 hw(c_1 + c_2) + c_1c_2 hw(c1+c2)+c1c2。当使用了分组卷积之后,weight的带宽减少:
    M A C = h w ( c 1 + c 2 ) + c 1 c 2 g MAC = hw(c_1 + c_2) + \frac{c_1 c_2}{g} MAC=hw(c1+c2)+gc1c2
    M A C = h w ( c 1 ) + B g / c 1 + B h w MAC = hw(c_1) + Bg/c_1 + \frac{B}{hw} MAC=hw(c1)+Bg/c1+hwB
    也就是当c1, h, w,B都不变的情况下,g越大,虽然c2可以增大,但是会增大MAC(c2增大MAC也增大这是很直接的,不知道为什么要用这么绕的表达)
  • 因此,group的数目不应该太大,否则要增大总的channel数(让我想起了mobile net v1)

网络碎片化会降低并行度

  • 在一些通过NAS得到的网络中包含大量的”小“op,这样能够在有限的FLOPs下提升模型精度,但是会带来额外的开销:比如CUDA Kernel的运行,以及Kernel之间的同步

Element-wise的操作不容忽视

  • 这意味着,形如ResNet中的add + ReLU操作需要慎用

ShuffleNet v2

论文笔记:ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design_第2张图片

  • ShuffleNet v1的核心:
    • 使用了point-wise group conv,减少pointwise的计算量
    • 在此基础上通过channel转置弥补channel之间的沟通
  • ShuffleNet v2基本单元如Fig 3.所示:
    • 输入Feature Map根据channel分为两等分,其中一个不动,另一个部分经过bottleneck的可分离卷积之后和另一部分concat
    • 为了满足G2,减少group的个数,不用pointwise group conv,改为普通的pointwise
    • 通道数不变,concat之后的channel数和concat之前的数目相比没有变化
    • 将shuffle部分放到了concat之后,并且在实现中可以将concat shuffle split放到一起,提升并行度
    • 对于降采样模块,split操作被stride =2 的sep conv取代,因此输出channel加倍
    • 为了减少element-wise操作,没有add操作
    • 具体到整体的网络结构,如Table 5.所示,整体来说和原来的v1差不多,在Global AVg Pooling时加入了额外的1x1 conv,用于混合高层的卷积
      论文笔记:ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design_第3张图片
  • Shuffle更准确的理论分析:
    • 每个block允许放入更多的channel(因为只有一部分参与计算),从而可以增大模型容量
    • 体现了一种前后层之间的特征复用,与densenet类似,增强相邻层之间的融合,特征复用的模型也与densenet很像,如Fig 4. 所示
      论文笔记:ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design_第4张图片

你可能感兴趣的:(论文笔记)