深度神经网络在人工智能的应用中,包括语音识别、计算机视觉、自然语言处理等各方面,在取得巨大成功的同时,这些深度神经网络需要巨大的计算开销和内存开销,严重阻碍了资源受限下的使用。本章总结了模型压缩、加速一般原理和方法,以及在移动端如何部署。
17.1 模型压缩理解
模型压缩是指利用数据集对已经训练好的深度模型进行精简,进而得到一个轻量且准确率相当的网络,压缩后的网络具有更小的结构和更少的参数,可以有效降低计算和存储开销,便于部署再受限的硬件环境中。
17.2 为什么需要模型压缩和加速
(1)随着AI技术的飞速发展,越来越多的公司希望在自己的移动端产品中注入AI能力。
(2)对于在线学习和增量学习等实时应用而言,如何减少含有大量层级及结点的大型神经网络所需要的内存和计算量显得极为重要。
(3)模型的参数在一定程度上能够表达其复杂性,相关研究表明,并不是所有的参数都在模型中发挥作用,部分参数作用有限、表达冗余甚至会降低模型的性能,
(4)复杂的模型固然有更好的性能,但是高额的存储空间、计算资源消耗都是使其难以有效的应用在各硬件平台上的重要原因。
(5)智能设备的流行提供了内存、CPU、能耗和宽带等资源,使得深度旭熙模型部署在智能移动设备上变得可行。
(6)高效的深度学习方法可以有效的帮助嵌入式设备、分布式系统完成复杂工作,在移动端部署深度学习有很重要的意义。
17.3 模型压缩的必要性及可行性
必要性 | 首先是资源受限,其次在许多网络结构中,如VGG-16网络,参数数量1亿3千多万,占用500MB空间,需要进行309亿次浮点运算才能完成一次图像识别任务。 |
---|---|
可行性 | 模型的参数在一定程度上能够表达其复杂性,相关研究表明,并不是所有的参数都在模型中发挥作用,部分参数作用有限、表达冗余,甚至会降低模型的性能。论文提出,很多的深度神经网络仅仅使用很少一部分(5%)权值就足以预测剩余的权值。该论文还提出这些剩下的权值甚至可以直接不用被学习。也就是说,仅仅训练一小部分原来的权值参数就有可能达到和原来网络相近甚至超过原来网络的性能(可以看作一种正则化)。 |
最终目的 | 最大程度的减小模型复杂度,减少模型存储需要的空间,也致力于加速模型的训练和推测 |
17.4 目前有哪些深度学习模型压缩方法
目前深度学习模型压缩方法主要分为更精细化模型设计、模型裁剪、核的稀疏化、量化、低秩分解、迁移学习等方法,而这些方法又可分为前端压缩和后端压缩。
17.4.1 前段压缩和后端压缩对比
对比项目 | 前端压缩 | 后端压缩 |
---|---|---|
含义 | 不会改变原始网络结构的压缩技术 | 会大程度上盖拜年原始网络结构的压缩技术 |
主要方法 | 知识蒸馏、紧凑的模型结构设计、滤波器层面的剪枝 | 低秩近似、未加限制的剪枝、参数量化、二值网络 |
实现难度 | 较简单 | 较难 |
是否可逆 | 可逆 | 不可逆 |
成熟应用 | 剪枝 | 低秩近似、参数量化 |
待发展应用 | 知识蒸馏 | 二值网络 |
17.4.2 网络剪枝
深度学习模型因其稀疏性,可以被裁剪为结构精简的网络模型,具体包括结构性剪枝与非结构性剪枝。
事项 | 特点 | 举例 |
---|---|---|
非结构化剪枝 | 通常是连接级、细粒度的剪枝方法,精度相对较高,但依赖于特定算法库或硬件平台的支持 | Deep Compression[5],Sparse-Winograd[6]算法等 |
结构化剪枝 | 是filter级或layer级、粗粒度的剪枝方法,精度相对较低,但剪枝策略更为有效,不需要特定算法库或硬件平台的支持,能够直接在成熟深度 | 如局部方式的、通过layer by layer方式的、最小化输出FM重建差的Channel Pruning[7],ThiNet[8],Discrimination-aware Channel Pruning[9];全局方式的、通过训练期间对BN层Gamma系数施加L1正则约束的Network Slimming[10];全局方式的、按Taylor准则对Filter作重要性排序的Neuron Pruning[11];全局方式的、可动态重新更新pruned filters参数的剪枝方法[12];深度学习模型压缩与优化加速_模型优化和加速 量化-CSDN博客 |
如果按剪枝粒度分,从粗到细,可分为中间隐含层剪枝、通道剪枝、卷积核剪枝、核内剪枝、单个权重剪枝。下面按照剪枝粒度的分类从粗(坐)到细(右)。
(a)层间剪枝 (b)特征图剪枝 (c)k*k核剪枝 (d)核内剪枝
事项 | 特点 |
---|---|
单个权重粒度 | 早期Le Cun[16]提出的OBD(optimal brain damage)将网络中的任意权重参数都看作单个参数,能够有效地提高预测准确率,却不能减小运行时间;同时,剪枝代价过高,只使用于小网络 |
核内权重粒度 | 网络中的任意权重被看作是单个参数并进行随机非结构化剪枝,该粒度的剪枝导致网络连接不规整,需要通过稀疏表达来减少内存占用,进而导致在前向传播预测时,需要大量的条件判断和额外空间来标明零或非零参数的位置,因此不适用于并行计算 |
卷积核粒度与通道粒度 | 卷积核粒度与通道粒度属于粗粒度剪枝,不依赖于任何稀疏卷积计算库及专用硬件;同时,能够在获得高压缩率的同时大量减小测试阶段的计算时间 |
从剪枝目标上分类,可分为减少参数/网络复杂度、减少过拟合/增加泛化能力/提高准确率、减小部署运行时间/提高网络效率及减小训练时间等。
17.4.3 典型剪枝方法对比
剪枝方法 | 修剪对象 | 修剪方式 | 效果 |
---|---|---|---|
Deep Compression | 权重 | 随机修剪 | 50倍压缩 |
Structured Pruning | 权重 | 组稀疏 排他性稀疏 | 性能提升 |
Network Sliming | 特征图通道 | 根据尺度因子修剪 | 节省计算资源 |
mProp | 梯度 | 修剪幅值小的梯度 | 加速 |
17.4.4. 网络蒸馏
网络蒸馏是指利用大量未标记的迁移数据(transfer data),让小模型去拟合大模型,从而让小模型学到与大模型相似的函数映射。网络蒸馏可以看成在同一个域上迁移学习[34]的一种特例,目的是获得一个比原模型更为精简的网络,整体的框架图如图4所示。
17.4.5 前端压缩
(1)知识蒸馏
一个复杂模型可由多个简单模型或者强约束条件训练得到。复杂模型特点是性能好,但其参数量大,计算效率低。小模型特点是计算效率高,但是其性能差。
知识蒸馏是让复杂模型学习到的知识迁移到小模型当中,使其保持其快速的计算速度前提下,同时拥有复杂模型的性能,达到模型压缩的目的。
(2)紧凑的模型结构设计
紧凑的模型结构设计主要是对神经网络卷积的方式进行改进,比如使用两个3x3的卷积替换一个5x5的卷积、使用深度可分离卷积等等方式降低计算参数量。
目前很多网络都是基于模块化设计思想,在深度和宽度两个维度上都很大,导致参数冗余。因此有很多关于模型设计的研究,如SqueezeNet、MobileNet等,使用更加细致、高效的模型设计,能够很大程度的减少模型尺寸,并且也具有不错的性能。
(3)滤波器层面的剪枝
滤波器层面的剪枝属于非结构化剪枝,主要是对较小的权重矩阵整个剔除,然后对整个神经网络进行微调。此方式由于剪枝过于粗放,容易导致精度损失较大,而且部分权重矩阵中会存留一些较小的权重造成冗余,剪枝不彻底。具体操作是在训练时使用稀疏约束(加入权重的稀疏正则项,引导模型的大部分权重趋向于0)。完成训练后,剪去滤波器上的这些0。
优点是简单;缺点是剪的不干净,非结构化剪枝会增加内存访问成本。
17.4.6 后端压缩
(1)低秩近似
在卷积神经网络中,卷积运算都是以矩阵相乘的方式进行。对于复杂网络,权重矩阵往往非常大,非常消耗存储和计算资源。低秩近似就是用若干个低秩矩阵组合重构大的权重矩阵,以此降低存储和计算资源消耗。
事项 | 特点 |
---|---|
优点 | 可以降低存储和计算消耗; 一般可以压缩2-3倍; 精度几乎没有损失。 |
缺点 | 模型越复杂,权重矩阵越大,利用低秩近似重构参数矩阵不能保证模型的性能; 超参数的数量随着网络层数的增加呈线性变化趋势,例如中间层的特征通道数等等; 随着模型复杂度的提升,搜索空间急剧增大。 |
(2)未加限制的剪枝
完成训练后,不加限制地剪去那些冗余参数。
(3)参数量化
神经网络的参数类型一般是32位浮点型,使用较小的精度代替32位所表示的精度。或者是将多个权重映射到同一数值,权重共享。量化其实是一种权值共享的策略。量化后的权值张量是一个高度稀疏的有很多共享权值的矩阵,对非零参数,我们还可以进行定点压缩,以获得更高的压缩率。
(4)二值网络
相对量化更为极致,对于32bit浮点型数用1bit二进制数 -1 或者 1 表示,可大大减小模型尺寸。
(5)三值网络
事项 | 特点 |
---|---|
优点 | 想对于二值神经网络,三值神经网络(Ternary Weight Networks)在同样的模型结构下可以达到成百上千倍的表达能力提升;并且,在计算时间复杂度上,三元网络和二元网络的计算复杂度是一样的。 例如,对于ResNet-18层网络中最常出现的卷积核(3x3大小),二值神经网络模型最多可以表达2的3x3次方(=512)种结构,而三元神经网络则可以表达3的3x3次方(=19683)种卷积核结构,在表达能力上,三元神经网络相对要高19683/512=38倍。因此,三元神经网络模型能够在保证计算复杂度很低的情况下大幅的提高网络的表达能力,进而可以在精度上相对于二值神经网络有质的飞跃。另外,由于对中间信息的保存更多,三元神经网络可以极大的加快网络训练时的收敛速度,从而更快、更稳定的达到最优的结果。 |