【10分钟掌握深度学习17】模型压缩及移动端部署1

17.1 为什么需要模型压缩和加速?

(1)对于在线学习和增量学习等实时应用而言,如何减少含有大量层级及结点的大型神经网络所需要的内存和计算量显得极为重要。
(2)智能设备的流行提供了内存、CPU、能耗和宽带等资源,使得深度学习模型部署在智能移动设备上变得可行。
(3)高效的深度学习方法可以有效的帮助嵌入式设备、分布式系统完成复杂工作,在移动端部署深度学习有很重要的意义。
https://blog.csdn.net/Touch_Dream/article/details/78441332

17.2 目前有哪些深度学习模型压缩方法?

https://blog.csdn.net/wspba/article/details/75671573
https://blog.csdn.net/Touch_Dream/article/details/78441332

17.2.1 前端压缩

(1)知识蒸馏(简单介绍)
一个复杂的模型可以认为是由多个简单模型或者强约束条件训练而来,具有很好的性能,但是参数量很大,计算效率低,而小模型计算效率高,但是其性能较差。知识蒸馏是让复杂模型学习到的知识迁移到小模型当中,使其保持其快速的计算速度前提下,同时拥有复杂模型的性能,达到模型压缩的目的。但与剪枝、量化等方法想比,效果较差。(https://blog.csdn.net/Lucifer_zzq/article/details/79489248)
(2)紧凑的模型结构设计(简单介绍)
紧凑的模型结构设计主要是对神经网络卷积的方式进行改进,比如使用两个3x3的卷积替换一个5x5的卷积、使用深度可分离卷积等等方式降低计算参数量。
(3)滤波器层面的剪枝(简单介绍)
滤波器层面的剪枝属于非结构花剪枝,主要是对较小的权重矩阵整个剔除,然后对整个神经网络进行微调。此方式由于剪枝过于粗放,容易导致精度损失较大,而且部分权重矩阵中会存留一些较小的权重造成冗余,剪枝不彻底。

17.2.2 后端压缩

(1)低秩近似 (简单介绍,参考链接补充优缺点)
在卷积神经网络中,卷积运算都是以矩阵相乘的方式进行。对于复杂网络,权重矩阵往往非常大,非常消耗存储和计算资源。低秩近似就是用若干个低秩矩阵组合重构大的权重矩阵,以此降低存储和计算资源消耗。
优点:

  • 可以降低存储和计算消耗;

  • 一般可以压缩2-3倍;精度几乎没有损失;

缺点:

  • 模型越复杂,权重矩阵越大,利用低秩近似重构参数矩阵不能保证模型的性能

(2)未加限制的剪枝 (简单介绍,参考链接补充优缺点)
剪枝操作包括:非结构化剪枝和结构化剪枝。非结构化剪枝是对神经网络中权重较小的权重或者权重矩阵进剔除,然后对整个神经网络进行微调;结构化剪枝是在网络优化目标中加入权重稀疏正则项,使部分权重在训练时趋于0。

优点:

  • 保持模型性能不损失的情况下,减少参数量9-11倍;

  • 剔除不重要的权重,可以加快计算速度,同时也可以提高模型的泛化能力;

缺点:

  • 非结构化剪枝会增加内存访问成本;

  • 极度依赖专门的运行库和特殊的运行平台,不具有通用性;

  • 压缩率过大时,破坏性能;

(3)参数量化 (简单介绍,参考链接补充优缺点)
神经网络的参数类型一般是32位浮点型,使用较小的精度代替32位所表示的精度。或者是将多个权重映射到同一数值,权重共享
优点:

  • 模型性能损失很小,大小减少8-16倍;

缺点:

  • 压缩率大时,性能显著下降;

  • 依赖专门的运行库,通用性较差;

(4)二值网络 (简单介绍,参考链接补充优缺点)
对于32bit浮点型数用1bit二进制数-1或者1表示。
优点:

  • 网络体积小,运算速度快

目前深度学习模型压缩方法的研究主要可以分为以下几个方向:
(1)更精细模型的设计。目前很多网络基于模块化设计思想,在深度和宽度两个维度上都很大,导致参数冗余。因此有很多关于模型设计的研究,如SqueezeNet、MobileNet等,使用更加细致、高效的模型设计,能够很大程度的减少模型尺寸,并且也具有不错的性能。
(2)模型裁剪。结构复杂的网络具有非常好的性能,其参数也存在冗余,因此对于已训练好的模型网络,可以寻找一种有效的评判手段,将不重要的connection或者filter进行裁剪来减少模型的冗余。
(3)核的稀疏化。在训练过程中,对权重的更新进行诱导,使其更加稀疏,对于稀疏矩阵,可以使用更加紧致的存储方式,如CSC,但是使用稀疏矩阵操作在硬件平台上运算效率不高,容易受到带宽的影响,因此加速并不明显。
(4)量化
(5)Low-rank分解
(6)迁移学习

17.3 目前有哪些深度学习模型优化加速方法?

模型优化加速能够提升网络的计算效率,具体包括:
(1)Op-level的快速算法:FFT Conv2d (7x7, 9x9), Winograd Conv2d (3x3, 5x5) 等;
(2)Layer-level的快速算法:Sparse-block net [1] 等;
(3)优化工具与库:TensorRT (Nvidia), Tensor Comprehension (Facebook) 和 Distiller (Intel) 等;

原文:https://blog.csdn.net/nature553863/article/details/81083955

17.4 影响神经网络速度的4个因素

  1. FLOPs(FLOPs就是网络执行了多少multiply-adds操作);
  2. MAC(内存访问成本);
  3. 并行度(如果网络并行度高,速度明显提升);
  4. 计算平台(GPU,ARM)

17.5 改变网络结构设计为什么会实现模型压缩、加速?

1. Group convolution

Group convolution最早出现在AlexNet中,是为了解决单卡显存不够,将网络部署到多卡上进行训练。Group convolution可以减少单个卷积1/g的参数量。
假设输入特征的的维度为H * W * c1;卷积核的维度为h1 * w1 * c1,共c2个;输出特征的维度为 H1 * W1 * c2。
传统卷积计算方式如下:
在这里插入图片描述

传统卷积运算量为:

A = H * W * h1 * w1 * c1 * c2

Group convolution是将输入特征的维度c1分成g份,每个group对应的channel数为c1/g,特征维度H * W * c1/g;,每个group对应的卷积核的维度也相应发生改变为h1 * w1 * c1/9,共c2/g个;每个group相互独立运算,最后将结果叠加在一起。
Group convolution计算方式如下:
在这里插入图片描述

Group convolution运算量为:

B = H * W * h1 * w1 * c1/g * c2/g * g

Group卷积相对于传统卷积的运算量:

\dfrac{B}{A} = \dfrac{ H * W * h1 * w1 * c1/g * c2/g * g}{H * W * h1 * w1 * c1 * c2} = \dfrac{1}{g}

由此可知:group卷积相对于传统卷积减少了1/g的参数量。

2. Depthwise separable convolution

Depthwise separable convolution是由depthwise conv和pointwise conv构成。
depthwise conv(DW)有效减少参数数量并提升运算速度。但是由于每个feature map只被一个卷积核卷积,因此经过DW输出的feature map不能只包含输入特征图的全部信息,而且特征之间的信息不能进行交流,导致“信息流通不畅”。
pointwise conv(PW)实现通道特征信息交流,解决DW卷积导致“信息流通不畅”的问题。
假设输入特征的的维度为H * W * c1;卷积核的维度为h1 * w1 * c1,共c2个;输出特征的维度为 H1 * W1 * c2。
传统卷积计算方式如下:
在这里插入图片描述

传统卷积运算量为:

A = H * W * h1 * w1 * c1 * c2

DW卷积的计算方式如下:
在这里插入图片描述

DW卷积运算量为:

B_DW = H * W * h1 * w1 * 1 * c1

PW卷积的计算方式如下:
在这里插入图片描述

B_PW = H_m * W_m * 1 * 1 * c1 * c2

Depthwise separable convolution运算量为:

B = B_DW + B_PW  

Depthwise separable convolution相对于传统卷积的运算量:

\dfrac{B}{A} = \dfrac{ H * W * h1 * w1 * 1 * c1 + H_m * W_m * 1 * 1 * c1 * c2}{H * W * h1 * w1 * c1 * c2}  

= \dfrac{1}{c2} + \dfrac{1}{h1 * w1}

由此可知,随着卷积通道数的增加,Depthwise separable convolution的运算量相对于传统卷积更少。

3. 输入输出的channel相同时,MAC最小

卷积层的输入和输出特征通道数相等时MAC最小,此时模型速度最快。
假设feature map的大小为h*w,输入通道c1,输出通道c2。
已知:

FLOPs = B = h * w * c1 * c2

=> c1 * c2 = \dfrac{B}{h * w}

MAC = h * w * (c1 + c2) + c1 * c2

c1 + c2 \geq 2 * \sqrt{c1 * c2}

=> MAC \geq 2 * h * w \sqrt{\dfrac{B}{h * w}} + \dfrac{B}{h * w} 

根据均值不等式得到(c1-c2)^2>=0,等式成立的条件是c1=c2,也就是输入特征通道数和输出特征通道数相等时,在给定FLOPs前提下,MAC达到取值的下界。

4. 减少组卷积的数量

过多的group操作会增大MAC,从而使模型速度变慢
由以上公式可知,group卷积想比与传统的卷积可以降低计算量,提高模型的效率;如果在相同的FLOPs时,group卷积为了满足FLOPs会是使用更多channels,可以提高模型的精度。但是随着channel数量的增加,也会增加MAC。
FLOPs:

B = \dfrac{h * w * c1 * c2}{g}

MAC:

MAC = h * w * (c1 + c2) + \dfrac{c1 * c2}{g}

由MAC,FLOPs可知:

MAC = h * w * c1 + \dfrac{B*g}{c1} + \dfrac{B}{h * w}

当FLOPs固定(B不变)时,g越大,MAC越大。

5. 减少网络碎片化程度(分支数量)

模型中分支数量越少,模型速度越快
此结论主要是由实验结果所得。
以下为网络分支数和各分支包含的卷积数目对神经网络速度的影响。
在这里插入图片描述

实验中使用的基本网络结构,分别将它们重复10次,然后进行实验。实验结果如下:
在这里插入图片描述

由实验结果可知,随着网络分支数量的增加,神经网络的速度在降低。网络碎片化程度对GPU的影响效果明显,对CPU不明显,但是网络速度同样在降低。

6. 减少元素级操作

元素级操作所带来的时间消耗也不能忽视
ReLU ,Tensor 相加,Bias相加的操作,分离卷积(depthwise convolution)都定义为元素级操作。
FLOPs大多数是对于卷积计算而言的,因为元素级操作的FLOPs相对要低很多。但是过的元素级操作也会带来时间成本。ShuffleNet作者对ShuffleNet v1和MobileNet v2的几种层操作的时间消耗做了分析,发现元素级操作对于网络速度的影响也很大。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水木流年追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值