一、轻量化

1.1 轻量化网络

网络名称

记忆点

备注

MobileNetV1

深度可分离卷积替换传统卷积

计算量和参数量下降为原来的1/Dk^2(Dk为卷积核kernel size,一般为3,所以计算量约为1/9)

深度卷积的激活函数是Relu6

深度学习 轻量化网络方法 轻量化计算_卷积

下采样是通过3x3的深度卷积

stride=2

MobileNetV2

Linear Bottelneck

最后的Relu6换成了Linear

深度学习 轻量化网络方法 轻量化计算_深度学习 轻量化网络方法_02

Inverted Residuals

1.点卷积扩充通道,再做深度卷积,再通过点卷积压缩通道。这样的好处是3x3卷积在更深的通道上可以提取到更丰富的特征。

2.对于stride=1的Block加入Residual结构,stride=2的resoution变了,因此不添加。

深度学习 轻量化网络方法 轻量化计算_结构化_03

MobileNetV3

NAS

网络的架构基于NAS实现的MnasNet

platform-aware NAS + NetAdapt

SE

squeeze and excitation 注意力机制

模型的后半段使用h-swish

swish(x) :f(x) = x * sigmoid(βx)

h-swish是因为sigmoid函数在端上计算耗时而提出的改进方案。h-swish的梯度是更好计算的。

深度学习 轻量化网络方法 轻量化计算_ide_04

深度学习 轻量化网络方法 轻量化计算_ide_05

末端调整

Avg提前,好处是计算量减小。

ShuffleNetV1

1x1分组卷积

传统的深度可分离卷积的Flops: c1,c2表示输入输出通道。c1*c2 >> 9,所以深度可分离卷积的瓶颈在于1x1卷积。

深度学习 轻量化网络方法 轻量化计算_深度学习 轻量化网络方法_06

对point-wise covolution分组之后的Flops:g表示分组数,可以看到明显改善了点卷积的瓶颈。

深度学习 轻量化网络方法 轻量化计算_ide_07

但是这样会造成channle的信息流通不畅,精度下降。

channle shuffle

深度学习 轻量化网络方法 轻量化计算_ide_08

打通channel之间的信息。

深度学习 轻量化网络方法 轻量化计算_ide_09

可以看出实际上的shuffle是特征图展开后做了一个转置,操作很简单。

结构

深度学习 轻量化网络方法 轻量化计算_卷积_10

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

ShuffleNetV2

四大设计理念

  1. G1). 使用输入通道和输出通道相同的卷积操作(内存访问代价MAC最小)
  2. G2). 谨慎使用分组卷积;(MAC与分组数g成正比,因此应该避免使用过大的分组)
  3. G3). 减少网络分支数;
  4. G4). 减少element-wise操作。

结构

深度学习 轻量化网络方法 轻量化计算_深度学习 轻量化网络方法_11

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

  • ShuffleNet v2使用了一个通道分割(Channel Split)操作。这个操作非常简单,即将 channelc分为c'和c-c'两组。这种设计是为了尽量控制分支数,为了满足G3。
  • 在分割之后的两个分支,左侧是一个直接映射,右侧是一个输入通道数和输出通道数均相同的深度可分离卷积,为了满足G1。
  • 在右侧的卷积中,  卷积并没有使用分组卷积,为了满足G2。
  • 最后在合并的时候均是使用拼接操作,为了满足G4。
  • 在堆叠ShuffleNet v2的时候,通道拼接,通道洗牌和通道分割可以合并成1个element-wise操作,也是为了满足G4。

1.2 知识蒸馏

基础知识点

知识记忆点

备注

知识蒸馏

原理

  1. 通过对小模型和大模型的softmax引入温度参数T,产生soft targets,进而通过交叉熵损失函数让小模型学习大模型的知识。
  2. 同时小模型对GT的hard targets进行交叉熵损失学习,保证模型的精度。
  3. 最终的loss是二者的结合。

MINIST上的成果

深度学习 轻量化网络方法 轻量化计算_结构化_12

理解温度参数T

深度学习 轻量化网络方法 轻量化计算_结构化_13

简单来讲,引入温度参数T是在神经层输出的logits上,在softmax之前。温度参数的作用就是让模型分概率分布之间的差距缩小,不仅仅关注正确的分类,也关注类别之间的相对关系,表达出更为丰富的信息。当T升高,非正确类别之间蕴含的的信息会更突出,与此同时类别概率的相对大小是不会改变的。

蒸馏的过程

深度学习 轻量化网络方法 轻量化计算_深度学习 轻量化网络方法_14

损失函数的设计

深度学习 轻量化网络方法 轻量化计算_卷积_15

深度学习 轻量化网络方法 轻量化计算_深度学习 轻量化网络方法_16

1.3 剪枝

基础知识点

记忆点

备注

Learning both Weights and Connections for Efficient Nerual Networks(剪枝开山论文)

结构化剪枝和非结构化剪枝

  • 非结构化剪枝就是把某些参数设为0,并没有减少参数量。
  • 结构化剪枝是把整个神经元去掉。对于CNN来说就是把通道剪掉。
  • 非结构化剪枝使用需要额外的参数存储策略,结构化剪枝更适用于终端上,可以直接在终端上获得加速。

基本思路

  1. 在数据集上对模型进行完整的训练,直至收敛,训练的时候施加L2(适用于迭代剪枝)或者L1正则化(适用于单次剪枝无finetune)效果更好。
  2. 对得到的模型根据权重的大小或者权重的范数作为神经元或者通道重要性判断依据。剪掉一批权重小于阈值的神经元。
  3. 在数据集上对剪枝后的模型进行微调,直至恢复精度。
  4. 重复二三步,直到参数量或者计算量小于阈值。

实验结果

在Imagenet数据集上,Alexnet剪枝后的参数只有未剪前的1/9。但是精度几乎不变。最好的方法是L2正则化+迭代式剪枝。

Flops&MAC

FLOPS:每秒浮点数计算量

深度学习 轻量化网络方法 轻量化计算_ide_17

MAC:内存访问成本

计算机在计算的时候需要把数据加载到内存中再进行计算,这个过程是耗时的。分组卷积是对MAC消耗很高的算子。

一般而言,在内存访问速度快的设备上,更关注FLOPs,而在嵌入式设备上,更关注MAC。

Learning Efficient Convolution Networks Through Network Slimming(结构化剪枝,用BN层判断通道的重要性)

基本思路

因为当前的CNN在卷积层之后往往都会跟着BN层,而BN层的参数α代表着对于通道值的缩放。所以如果α很小的话那么这个通道的值就相对也比较小。因此可以根据BN层的参数α来进行剪枝。

深度学习 轻量化网络方法 轻量化计算_卷积_18

 

实验结果

ImageNet上的VGG,剪掉了82.5%参数量,保持精度不变。