当前位置: 首页 > >

模型压缩:关于MobileNet和ShuffleNet v1v2一些点

发布时间:

1. MobileNet(2017):


将传统卷积改成depthwise separable convolutions(每个kernel只和对应的一个channel的feature map进行卷积操作) && pointwise 1*1 convolutions(常规的1*1卷积),大大降低参数量和计算量,压缩比:







1


N



+



1



D


k


2




,


N


=


o


u


t


p


u


t


_


c


h


a


n


n


e


l


s


,



D


k



=


k


e


r


n


e


l


_


s


i


z


e



frac{1}{N} + frac{1}{D_k^2}, N=output\_channels, D_k=kernel\_size


N1?+Dk2?1?,N=output_channels,Dk?=kernel_size

除首层采用常规卷积,其余层均为dw conv && pw conv的组合。

所有的pooling操作用stride=2的卷积代替。

所有增加channel的卷积皆为1*1 pointwise conv。

fc之前使用avg pooling将feature map的大小变为1。

1*1的卷积在卷积实现(GEMM)时效率高(考虑到稀疏矩阵)。

RMSprop,异步更新。

no data augumentation and l2 regularization on dw conv。

使用超参数




α





(


0


,


1


]



alpha in (0,1]


α∈(0,1]控制feature map的channels数,使用超参数




ρ





(


0


,


1


]



ho in (0,1]


ρ∈(0,1]控制图像和feature map的大小,更加灵活的压缩模型:






1



α


N




+



1



D


k


2





frac{1}{alpha N} + frac{1}{D_k^2}


αN1?+Dk2?1?

PS:在某些实验中




ρ



ho


ρ对性能的影响要大于




α



alpha


α,下表中的dw只指3*3的那层卷积。

ImageNet, Large Scale Geolocalizaton, Face Attributes, Object Detection


Type / StrideFilter ShapeInput Size
Conv / s23*3*3*32224*224*3
Conv dw / s13*3*32 dw112*112*32
Conv / s11*1*32*64112*112*32
Conv dw / s23*3*64 dw112*112*64
Conv / s11*1*64*12856*56*64
Conv dw / s13*3*128 dw56*56*128
Conv / s11*1*128*12856*56*128
Conv dw / s23*3*128 dw56*56*128
Conv / s11*1*128*25628*28*128
Conv dw / s13*3*256 dw28*28*256
Conv / s11*1*256*25628*28*256
Conv dw / s23*3*256 dw28*28*256
Conv / s11*1*256*51214*14*256
5 * Conv dw / s1
Conv / s1
3*3*512 dw
1*1*512*512
14*14*512

当前主流的SOTA模型只对3*3的卷积进行了group conv或者dw conv的操作而忽略了1*1的卷积,实际上这对设计小模型是非常不利的,因为这些1*1的卷积占据了绝大部分的计算量,这个从MobileNet的原文统计中也可以看到。但是如果直接用group conv对所有1*1的卷积操作,会导致某个输出channel的信息仅仅来于输入的某些固定的channel,解决方案:pointwise group convolution && channel shuffle, 即对group conv操作的feature map进行channel shuffle后作为下一层的输入。模型主要由3个stage组成,每个stage有多个unit,unit分为两种:
    stride=1,此时残差连接为identity connection,另一分支为1*1 group conv ReLU->channel shuffle -> 3*3 dw conv(st=1) -> 1*1 group conv,两个分支add后ReLU。stride=2,此时残差连接为3*3 avg pooling,另一分支为1*1 group conv ReLU->channel shuffle -> 3*3 dw conv(st=2) -> 1*1 group conv,两个分支concat后ReLU

    stage2的第一个卷积为常规卷积,因为此时channel过少。每个stage内channel数不变,stage后channel数double, bottleneck 的值为1/4(如果fusion为add,bottleneck的channel直接为1/4,如果为concat,bottleneck的channelw为输出的channel数-输入的channel数除以4)。less data augumentation and 4e-5 l2 regularization。性能优于MobileNet 7.8% ImageNet。
    LayerOutput sizeKSizeStrideRepeatOuput channels(




    g



    g


    g groups)
    MaxPool
    112*112
    56*56
    2

    bottleneck认为高维的特征能够嵌入一个低维的流形,文中说明,虽然Relu对导致小于0的部分died,但是它仍然具备保留所有信息的能力,前提是输入的流形确实能够嵌入输入空间一个低维的子空间。但是当维度很低的时候,非线性(e.g. ReLU)会严重导致数据坍塌,因此channel少的feature map后面不应该接ReLU,如果在bottleneck使用了非线性,会影响性能,因此在bottleneck的地方移除了Relu。基于上,bottleneck已经保留了几乎所有有用的信息,因此现有的一些后面紧接的expansion layer是不必要的,MobileNets v2直接用跳接连接bottleneck。实验结果表明,expansion rate取5-10较好,且模型越大取值应该越大。使用和MobileNet相同的两个超参数探索性能,不同的是当




    α


    <


    1



    alpha<1


    α<1时,v2不在最后一个卷积层降低channel,实验证明这对小模型的性能有所提升。MobileNet v2能够只保留很少的中间变量(在求非残差分支的时候,分为t路,2-5,太大会因为cache miss导致性能下降),因为(1)最中间的变换是per-channel的dw conv(2)其余的变换输入和输出的channel比率都很大(bottleneck的压缩和还原)。虽然这样做并不会减少总的multiply-add的操作次数bottleneck分为两种:
      stride=1,此时残差连接为identity connection,另一分支为1*1 conv,ReLU6 -> 3*3 dw conv(st=1) -> 1*1 conv, Linear,两个分支add。stride=2,此时没有残差连接,另一分支为1*1 conv,ReLU6 -> 3*3 dw conv(st=2) -> 1*1 conv, Linear。
    ImageNet:
      RMSprop, momentum=decay=0.9init lr=0.045 decay by 0.98 per epoch,l2 regularizarion=4e-516 GPU异步更新, batch size=96
    Object Detection: SSDLite(把ssd的预测层的卷积替换为dw conv)特别重要的一点!第一个stage的t=1,结构不再是131,而是31,dw conv 前没有 1*1的conv,官方给出的tf源码,论文中没有提及,同时只要按照官方tf的代码,mb v2的FLOP才能和shufflenet v2中匹配
    bottleneck
    InputOperatorOutput





    h


    ?


    w


    ?


    k



    h*w*k


    h?w?k
    1*1 Conv, ReLU6




    h


    ?


    w


    ?


    t


    k



    h*w*tk


    h?w?tk





    h


    ?


    w


    ?


    t


    k



    h*w*tk


    h?w?tk
    3*3 dw Conv st=




    s



    s


    s, ReLU6






    h


    s



    ?



    w


    s



    ?


    t


    k



    frac{h}{s}*frac{w}{s}*tk


    sh??sw??tk






    h


    s



    ?



    w


    s



    ?


    t


    k



    frac{h}{s}*frac{w}{s}*tk


    sh??sw??tk
    Linear 1*1 Conv




    h


    ?


    w


    ?



    k


    ?




    h*w*k^*


    h?w?k?

    Architecture
    InputOperator




    t



    t


    t





    c



    c


    c





    n



    n


    n





    s



    s


    s
    224*224*3Conv 3*3-3212
    112*112*32bottleneck11611
    112*112*16bottleneck62422
    56*56*24bottleneck63232
    28*28*32bottleneck66442
    14*14*64bottleneck69631
    14*14*96bottleneck616032
    7*7*160bottleneck632011
    7*7*320Conv 1*1-128011
    7*7*1280avgpool 7*7--1-
    1*1*1280conv 1*1-k-

    Each line describes a sequence of 1 or more identical (modulo stride) layers, repeated n times. All layers in the same sequence have the same number c of output channels. The first layer of each sequence has a stride s and all others use stride 1. All spatial convolutions use 3 × 3 kernels. The expansion factor t is always applied to the input size

    4. ShuffleNet v2(2018):


    此类网络的评价不能仅仅考虑FLOPS,同时要考虑运行速度,相同的FLOPS也会有速度上的差异,因此提出了四个新的评价指标:


      MAC(Equal channel width minimizes memory access cost),等量channel下能最小化的内存访问成本,考虑到大部分网络使用dw conv,而dw conv中1*1的conv占据了绝大部分的计算量,因此这里只考虑常规1*1参与的计算:






      M


      A


      C





      2




      h


      w


      B




      +



      B



      h


      w




      ,


      B


      =


      h


      w



      c


      1




      c


      2



      =


      #


      F


      L


      O


      P


      S


      ,



      MAC ge 2 sqrt{hwB} + frac{B}{hw}, B=hwc_1c_2=#FLOPS,


      MAC≥2hwB
      ?+hwB?,B=hwc1?c2?=#FLOPS,

    ??





    c


    1



    ,



    c


    2




    c_1,c_2


    c1?,c2? ?are ?input/output? channel ?. corresponding
    ??且实验证明当





    c


    1



    =



    c


    2




    c_1=c_2


    c1?=c2?时MAC最小,速度最快(相等规模的FLOPS下)
    2. Excessive group convolution increases MAC.考虑到group。 conv降低了FLOPS但是提高了MAC,这里考虑1*1的group conv:





    M


    A


    C


    =


    h


    w


    (



    c


    1



    +



    c


    2



    )


    +





    c


    1




    c


    2




    g



    =


    h


    w



    c


    1



    +




    B


    g




    c


    1




    +



    B



    h


    w




    ,


    B


    =




    h


    w



    c


    1




    c


    2




    g



    ,


    g


    =


    #


    g


    r


    o


    u


    p



    MAC = hw(c_1 + c_2) + frac{c_1c_2}{g}=hwc_1 + frac{Bg}{c_1} + frac{B}{hw}, B=frac{hwc_1c_2}{g},g=#group


    MAC=hw(c1?+c2?)+gc1?c2??=hwc1?+c1?Bg?+hwB?,B=ghwc1?c2??,g=#group
    ??且实验证明group越大速度越慢,两者非线性负相关。


      Network fragmentation reduces degree of parallelism,网络细分会导致并行度下降从而是的速度降低,在GPU上影响比较大,细分包括同一个block里面的1*1卷积操作,pooling操作等等。

      Element-wise operations are non-negligible,元素级的操作带来的速度影响不能忽略,element-wise的操作一般有较高d的MAC/FLOPS,比如ReLU,resnet中的跳接(Add操作),因为dw conv也有较高的MAC/FLOPS,这里也把它归为一种element-wise的操作。

    给出设计轻量网络的建议:(1)卷积层不要频繁变换channel维度,保证输入输出一致(2)使用group conv时精心选择g的大小(3)减少不必要的网络细分(4)减少不必要的element-wise操作。

    常用的两种技术用来解决给定FLOPS的情况下增加特征的channel数:group conv和bottleneck,但是这俩会增加MAC,本文采取channel split的方式来缓解这个问题。同样包含两种unit:


      stride=1,在unit开始的时候,进行channel split(一般等分),一个分支为identity(满足c),另一个分支:1*1 conv,ReLU -> 3*3 dw conv(st=1) -> 1*1 conv, ReLU后concat,然后channel shuffle,将1*1 group conv 变成常规conv满足b,一个unit输入输出采用concat保证channel一致满足a,同时ReLU这样的element-wise的操作只放到一个分支满足d。这样split还有一个好处就是对比densenet,后者的连接会有很大一部分冗余的,而在这里这种连接密度会随着连接距离呈指数递减,降低了冗余。stride=2, 一个分支:1*1 conv,ReLU -> 3*3 dw conv(st=1) -> 1*1 conv ReLU,另一个分支为3*3 dw conv(st=2) -> 1*1 conv ReLU后两者concat,然后channel shuffle。

    LayerOutput SizeKSizeStrideRepeatOutput channels
    0.5*? 1.0*? 1.5*? 2.0*
    Image224*2243???3???3???3
    Conv1
    MaxPool
    112*112
    56*56
    3*32
    2
    124???24???24???24
    Stage228*28
    28*28
    2
    1
    1
    3
    48??116??176??244
    Stage314*14
    14*14
    2
    1
    1
    7
    96??232??352??488
    Stage47*7
    7*7
    2
    1
    1
    3
    192????464????704????976
    Conv57*71*11024??1024??1024??2048
    GlobalPool1*17*7
    FC1000??1000??1000??1000
    FLOPS41M??146M??299M??591M
    # of Weights1.4M??2.3M??3.5M??7.4M

    Compare
    ModelTOP-1 AccuaryMillion Muli-AddsMillion Parameters
    GoogleNet69.8%15506.8
    VGG 1671.5%15300138
    Inception V384%500023.2
    1.0 MobileNet-22470.6%5694.2
    ShuffleNet 1.5*(g=3)71.5%2923.4
    ShuffleNet 2*(g=3)73.7%5245.4
    MobileNet v272.0%3003.4
    MobileNet v2(1.4)74.7%5856.9
    ShuffleNet v2 2*74.9%5916.7

    限定FLOPS
    ModelMFLOPSTOP1-errGPU Speed(Batchessec.)
    ShuffleNet v2 0.5*4139.7417
    ShuffleNet v1 (g=3) 0.5*3855.1351
    0.25 MobileNet v14149.7502
    0.15 MobileNet v23955.1351
    0.4 MobileNet v24343.4333
    ShuffleNet v2 1.0*14630.6341
    ShuffleNet v1(g=3) 1.0*14032.6213
    0.5 MobileNet v114936.3382
    0.75 MobileNet v214532.1235
    0.6 MobileNet v214133.3249
    ShuffleNet v2 1.5*29927.4255
    ShuffleNet v1(g=3) 1.5*29228.5164
    0.75 MobileNet v132531.6314
    1.0 MobileNet v230028180



    友情链接: