zoukankan      html  css  js  c++  java
  • 深度学习模型压缩

      深度神经网络在人工智能的应用中,包括语音识别、计算机视觉、自然语言处理等各方面,在取得巨大成功的同时,这些深度神经网络需要巨大的计算开销和内存开销,严重阻碍了资源受限下的使用。本章总结了模型压缩、加速原理和方法,以及在移动端如何部署。

      模型压缩是对已经训练好的深度模型进行精简,进而得到一个轻量且准确率相当的网络,压缩后的网络具有更小的结构和更少的参数,可以有效降低计算和存储开销,便于部署在受限的硬件环境中。

    模型压缩和加速的重要性

    (1)随着AI技术的飞速发展,越来越多的公司希望在自己的移动端产品中注入AI能力。

    (2)对于在线学习和增量学习等实时应用而言,如何减少含有大量层级及结点的大型神经网络所需要的内存和计算量显得极为重要。

    (3)模型的参数在一定程度上能够表达其复杂性,相关研究表明,并不是所有的参数都在模型中发挥作用,部分参数作用有限、表达冗余,甚至会降低模型的性能。

    (4)复杂的模型固然具有更好的性能,但是高额的存储空间、计算资源消耗是使其难以有效的应用在各硬件平台上的重要原因。

    (5)智能设备的流行提供了内存、CPU、能耗和宽带等资源,使得深度学习模型部署在智能移动设备上变得可行。

    (6)高效的深度学习方法可以有效的帮助嵌入式设备、分布式系统完成复杂工作,在移动端部署深度学习有很重要的意义。

      许多网络结构中,如VGG-16网络,参数数量1亿3千多万,占用500MB空间,需要进行309亿次浮点运算才能完成一次图像识别任务。

      模型的参数在一定程度上能够表达其复杂性,相关研究表明,并不是所有的参数都在模型中发挥作用,部分参数作用有限、表达冗余,甚至会降低模型的性能。论文提出,很多的深度神经网络仅仅使用很少一部分(5%)权值就足以预测剩余的权值。该论文还提出这些剩下的权值甚至可以直接不用被学习。也就是说,仅仅训练一小部分原来的权值参数就有可能达到和原来网络相近甚至超过原来网络的性能(可以看作一种正则化)。

    目的:最大程度的减小模型复杂度,减少模型存储需要的空间,也致力于加速模型的训练和推测

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

      目前深度学习模型压缩方法主要分为更精细化模型设计模型裁剪核的稀疏化量化低秩分解迁移学习等方法,而这些方法又可分为前端压缩和后端压缩。

     前端压缩后端压缩
    含义 不会改变原始网络结构的压缩技术 会大程度上改变原始网络结构的压缩技术
    主要方法 知识蒸馏、紧凑的模型结构设计、滤波器层面的剪枝 低秩近似、未加限制的剪枝、参数量化、二值网络
    实现难度 较简单 较难
    是否可逆 可逆 不可逆
    成熟应用 剪枝 低秩近似、参数量化
    待发展应用 知识蒸馏 二值网络

    网络剪枝

      深度学习模型因其稀疏性,可以被裁剪为结构精简的网络模型,具体包括 结构性剪枝非结构性剪枝

    结构化剪枝

      是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文章】深度学习模型压缩与优化加速

    非结构化剪枝

      通常是连接级-、细粒度的剪枝方法,精度相对较高,但依赖于特定算法库或硬件平台的支持

    举例:Deep Compression [5], Sparse-Winograd [6] 算法等;

      按剪枝粒度分类,从粗到细,可分为中间隐含层剪枝、通道剪枝、卷积核剪枝、核内剪枝、单个权重剪枝。下面按照剪枝粒度的分类从粗(左)到细(右)。

    (a)层间剪枝(b)特征图剪枝(c)k*k核剪枝(d)核内剪枝

    • 单个权重粒度:早期 Le Cun[16]提出的 OBD(optimal brain damage)将网络中的任意权重参数都看作单个参数,能够有效地提高预测准确率,却不能减小运行时间;同时,剪枝代价过高,只适用于小网络
    • 核内权重粒度:网络中的任意权重被看作是单个参数并进行随机非结构化剪枝,该粒度的剪枝导致网络连接不规整,需要通过稀疏表达来减少内存占用,进而导致在前向传播预测时,需要大量的条件判断和额外空间来标明零或非零参数的位置,因此不适用于并行计算
    • 卷积核粒度与通道粒度:卷积核粒度与通道粒度属于粗粒度剪枝,不依赖任何稀疏卷积计算库及专用硬件;同时,能够在获得高压缩率的同时大量减小测试阶段的计算时间。

    从剪枝目标上分类,可分为

    • 减少参数/网络复杂度
    • 减少过拟合/增加泛化能力 / 提高准确率
    • 减小部署运行时间 / 提高网络效率
    • 减小训练时间
    • ...

    典型剪枝方法对比

    剪枝方法修剪对象修剪方式效果
    Deep Compression 权重 随机修剪 50倍压缩
    Structured Pruning 权重 组稀疏+排他性稀疏 性能提升
    Network Slimming 特征图通道 根据尺度因子修剪 节省计算资源
    mProp 梯度 修剪幅值小的梯度 加速

    网络蒸馏

      网络精馏是指利用大量未标记的迁移数据(transfer data),让小模型去拟合大模型,从而让小模型学到与大模型相似的函数映射。整体的框架图如图下所示。

    前端压缩

    (1)知识蒸馏

      一个复杂模型可由多个简单模型或者强约束条件训练得到。复杂模型特点是性能好,但其参数量大,计算效率低。小模型特点是计算效率高,但是其性能较差。知识蒸馏是让复杂模型学习到的知识迁移到小模型当中,使其保持其快速的计算速度前提下,同时拥有复杂模型的性能,达到模型压缩的目的。

    (2)紧凑的模型结构设计 ​

      对神经网络的卷积方式进行改进,比如使用两个3x3的卷积替换一个5x5的卷积、使用深度可分离卷积等等方式降低计算参数量。 目前很多网络基于模块化设计思想,在深度和宽度两个维度上都很大,导致参数冗余。因此有很多关于模型设计的研究,如SqueezeNet、MobileNet等,使用更加细致、高效的模型设计,能够很大程度的减少模型尺寸,并且也具有不错的性能。

    (3)滤波器层面的剪枝 ​

      对较小的权重矩阵整个剔除,然后对整个神经网络进行微调。 具体操作是在训练时使用稀疏约束(加入权重的稀疏正则项,引导模型的大部分权重趋向于0)。完成训练后,剪去滤波器上的这些 0 。

    • 缺点:由于剪枝过于粗放,容易导致精度损失较大,而且部分权重矩阵中会存留一些较小的权重造成冗余,剪枝不彻底。
    • 优点:优点是简单,缺点是剪得不干净,非结构化剪枝会增加内存访问成本。

    后端压缩

    (1)低秩近似 ​

      在卷积神经网络中,卷积运算都是以矩阵相乘的方式进行。对于复杂网络,权重矩阵往往非常大,非常消耗存储和计算资源。低秩近似就是用若干个低秩矩阵 组合重构 大的权重矩阵,以此降低存储和计算资源消耗。

    • 优点
      • 可以降低存储和计算消耗;
      • 一般可以压缩2-3倍;
      • 精度几乎没有损失;
    • 缺点
      • 利用低秩近似重构参数矩阵不能保证模型的性能 ;
      • 随着模型复杂度的提升,搜索空间急剧增大。

    (2)未加限制的剪枝

      完成训练后,不加限制地剪去那些冗余参数。

    • 优点
      • 保持模型性能不损失的情况下,减少参数量9-11倍;
      • 剔除不重要的权重,可以加快计算速度,同时也可以提高模型的泛化能力;
    • 缺点
      • 极度依赖专门的运行库和特殊的运行平台,不具有通用性;
      • 压缩率过大时,破坏性能;

    (3)参数量化

      神经网络的参数类型一般是32位浮点型,使用较小的精度代替32位精度。或者是将多个权重映射到同一数值,权重共享。量化其实是一种权值共享的策略。量化后的权值张量是一个高度稀疏的有很多共享权值的矩阵,对非零参数,我们还可以进行定点压缩,以获得更高的压缩率。

    • 优点
      • 模型性能损失很小,大小减少8-16倍;
    • 缺点
      • 压缩率大时,性能显著下降; 
      • 依赖专门的运行库,通用性较差;

    举例

    • 二值化网络:XNORnet [13],ABCnet with Multiple Binary Bases [14],Bin-net with High-Order Residual Quantization [15],Bi-Real Net [16];
    • 三值化网络:Ternary weight networks [17],Trained Ternary Quantization [18];
    • W1-A8W2-A8量化: Learning Symmetric Quantization [19];
    • INT8量化:TensorFlow-lite [20],TensorRT [21];
    • 其他(非线性):Intel INQ [22],log-net,CNNPack [23] 等;

    【CSDN文章】深度学习模型压缩与优化加速

      最为典型就是二值网络、XNOR网络等。其主要原理就是采用1 bit对网络的输入、权重、响应进行编码。减少模型大小的同时,原始网络的卷积操作可以被bit-wise运算代替,极大提升了模型的速度。但是,如果原始网络结果不够复杂,由于二值网络会较大程度降低模型的表达能力。因此现阶段有相关的论文开始研究n-bit编码方式成为n值网络或者多值网络或者变bit、组合bit量化来克服二值网络表达能力不足的缺点。

    (4)二值网络

    相对量化更为极致,对于32bit浮点型数用1bit二进制数-1或者1表示,可大大减小模型尺寸。

    • 优点:网络体积小,运算速度快,有时可避免部分网络的 overfitting
    • 缺点
      • 二值神经网络损失的信息相对于浮点精度是非常大
      • 粗糙的二值化近似导致训练时模型收敛速度非常慢

    (5)三值网络

      相对于二值神经网络,三值神经网络(Ternary Weight Networks)在同样的模型结构下可以达到成百上千倍的表达能力提升;并且,在计算时间复杂度上,三元网络和二元网络的计算复杂度是一样的。 例如,对于ResNet-18层网络中最常出现的卷积核(3x3大小),二值神经网络模型最多可以表达2的3x3次方(=512)种结构,而三元神经网络则可以表达3的3x3次方(=19683)种卷积核结构。在表达能力上,三元神经网络相对要高19683/512 = 38倍。因此,三元神经网络模型能够在保证计算复杂度很低的情况下大幅的提高网络的表达能力,进而可以在精度上相对于二值神经网络有质的飞跃。另外,由于对中间信息的保存更多,三元神经网络可以极大的加快网络训练时的收敛速度,从而更快、更稳定的达到最优的结果。

    低秩分解

      基于低秩分解的深度神经网络压缩与加速的核心思想是利用矩阵或张量分解技术估计并分解深度模型中的原始卷积核。卷积计算是整个卷积神经网络中计算复杂 度 最 高 的 计 算 操 作,通 过 分 解4D 卷积核张量,可以有效地减少模型内部的冗余性。此外对于2D的全 连 接 层 矩 阵 参 数,同样可以利用低秩分解技术进行处理。但由于卷积层与全连接层的分解方式不同,本文分别从卷积层和全连接层2个不同角度回顾与分析低秩分解技术在深度神经网络中的应用。

      在2013年,Denil等人[57]从理论上利用低秩分解的技术并分析了深度神经网络存在大量的冗余信 息,开创了基于低秩分解的深度网络模型压缩与加速的新思路。如图7所示,展示了主流的张量分解后卷积 计 算。

    总体压缩效果评价指标有哪些?

      网络压缩评价指标包括运行效率参数压缩率准确率。与基准模型比较衡量性能提升时,可以使用提升倍数(speed up)或提升比例(ratio)

    • 准确率:目前,大部分研究工作均会测量 Top-1 准确率,只有在 ImageNet 这类大型数据集上才会只用 Top-5 准确率。
    • 参数压缩率:统计网络中所有可训练的参数,根据机器浮点精度转换为字节(byte)量纲,通常保留两位有效数字以作近似估计。
    • 运行效率:可以从网络所含浮点运算次数(FLOP)、网络所含乘法运算次数(MULTS)或随机实验测得的网络平均前向传播所需时间这 3 个角度来评价

    几种轻量化网络结构对比

    网络结构TOP1 准确率/%参数量/MCPU运行时间/ms
    MobileNet V1 70.6 4.2 123
    ShuffleNet(1.5) 69.0 2.9 -
    ShuffleNet(x2) 70.9 4.4 -
    MobileNet V2 71.7 3.4 80
    MobileNet V2(1.4) 74.7 6.9 149

    网络压缩未来研究方向有哪些?

    网络剪枝、网络精馏和网络分解都能在一定程度上实现网络压缩的目的。回归到深度网络压缩的本质目的上,即提取网络中的有用信息,以下是一些值得研究和探寻的方向。

    (1) 权重参数对结果的影响度量.深度网络的最终结果是由全部的权重参数共同作用形成的,目前,关于单个卷积核/卷积核权重的重要性的度量仍然是比较简单的方式,尽管文献[14]中给出了更为细节的分析,但是由于计算难度大,并不实用。因此,如何通过更有效的方式来近似度量单个参数对模型的影响,具有重要意义。

    (2) 学生网络结构的构造。学生网络的结构构造目前仍然是由人工指定的,然而,不同的学生网络结构的训练难度不同,最终能够达到的效果也有差异。因此,如何根据教师网络结构设计合理的网络结构在精简模型的条件下获取较高的模型性能,是未来的一个研究重点。

    (3) 参数重建的硬件架构支持。通过分解网络可以无损地获取压缩模型,在一些对性能要求高的场景中是非常重要的。然而,参数的重建步骤会拖累预测阶段的时间开销,如何通过硬件的支持加速这一重建过程,将是未来的一个研究方向。

    (4) 任务或使用场景层面的压缩。大型网络通常是在量级较大的数据集上训练完成的,比如,在 ImageNet上训练的模型具备对 1 000 类物体的分类,但在一些具体场景的应用中,可能仅需要一个能识别其中几类的小型模型。因此,如何从一个全功能的网络压缩得到部分功能的子网络,能够适应很多实际应用场景的需求。

    (5) 网络压缩效用的评价。目前,对各类深度网络压缩算法的评价是比较零碎的,侧重于和被压缩的大型网络在参数量和运行时间上的比较。未来的研究可以从提出更加泛化的压缩评价标准出发,一方面平衡运行速度和模型大小在不同应用场景下的影响;另一方面,可以从模型本身的结构性出发,对压缩后的模型进行评价。

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

    模型优化加速方法

    模型优化加速能够提升网络的计算效率,具体包括:

    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) 等;

    TensorRT加速原理

    在计算资源并不丰富的嵌入式设备上,TensorRT之所以能加速神经网络的的推断主要得益于两点:

    1. TensorRT支持int8和fp16的计算,通过在减少计算量和保持精度之间达到一个理想的trade-off,达到加速推断的目的。
    2. TensorRT对于网络结构进行了重构和优化,主要体现在一下几个方面。
      • TensorRT通过解析网络模型将网络中无用的输出层消除以减小计算。
      • 对于网络结构的垂直整合,即将目前主流神经网络的Conv、BN、Relu三个层融合为了一个层,例如将图1所示的常见的Inception结构重构为图2所示的网络结构。
      • 对于网络结构的水平组合,水平组合是指将输入为相同张量和执行相同操作的层融合一起,例如图2向图3的转化。

    图1 

    图2

    图3

      以上3步即是TensorRT对于所部署的深度学习网络的优化和重构,根据其优化和重构策略,第一和第二步适用于所有的网络架构,但是第三步则对于含有Inception结构的神经网络加速效果最为明显。

    Tips: 想更好地利用TensorRT加速网络推断,可在基础网络中多采用Inception模型结构,充分发挥TensorRT的优势。

    TensorRT如何优化重构模型?

    若训练的网络模型包含TensorRT支持的操作

    1.  对于Caffe与TensorFlow训练的模型,若包含的操作都是TensorRT支持的,则可以直接由TensorRT优化重构
    2.  对于MXnet, PyTorch或其他框架训练的模型,若包含的操作都是TensorRT支持的,可以采用TensorRT API重建网络结构,并间接优化重构;

    若训练的网络模型包含TensorRT不支持的操作

    1. TensorFlow模型可通过tf.contrib.tensorrt转换,其中不支持的操作会保留为TensorFlow计算节点;
    2. 不支持的操作可通过Plugin API实现自定义并添加进TensorRT计算图;
    3. 将深度网络划分为两个部分,一部分包含的操作都是TensorRT支持的,可以转换为TensorRT计算图。另一部则采用其他框架实现,如MXnet或PyTorch

    TensorRT加速效果如何?

    以下是在TitanX (Pascal)平台上,TensorRT对大型分类网络的优化加速效果:

    NetworkPrecisionFramework/GPU:TitanXPAvg.Time(Batch=8,unit:ms)Top1 Val.Acc.(ImageNet-1k)
    Resnet50 fp32 TensorFlow 24.1 0.7374
    Resnet50 fp32 MXnet 15.7 0.7374
    Resnet50 fp32 TRT4.0.1 12.1 0.7374
    Resnet50 int8 TRT4.0.1 6 0.7226
    Resnet101 fp32 TensorFlow 36.7 0.7612
    Resnet101 fp32 MXnet 25.8 0.7612
    Resnet101 fp32 TRT4.0.1 19.3 0.7612
    Resnet101 int8 TRT4.0.1 9 0.7574

    影响神经网络速度的4个因素(再稍微详细一点)

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

    压缩和加速方法如何选择?

    1)对于在线计算内存存储有限的应用场景或设备,可以选择参数共享和参数剪枝方法,特别是二值量化权值和激活、结构化剪枝。其他方法虽然能够有效的压缩模型中的权值参数,但无法减小计算中隐藏的内存大小(如特征图)。​

    2)如果在应用中用到的紧性模型需要利用预训练模型,那么参数剪枝、参数共享以及低秩分解将成为首要考虑的方法。相反地,若不需要借助预训练模型,则可以考虑紧性滤波设计及知识蒸馏方法。​

    3)若需要一次性端对端训练得到压缩与加速后模型,可以利用基于紧性滤波设计的深度神经网络压缩与加速方法。​

    4)一般情况下,参数剪枝,特别是非结构化剪枝,能大大压缩模型大小,且不容易丢失分类精度。对于需要稳定的模型分类的应用,非结构化剪枝成为首要选择。​

    5)若采用的数据集较小时,可以考虑知识蒸馏方法。对于小样本的数据集,学生网络能够很好地迁移教师模型的知识,提高学生网络的判别性。​

    6)主流的5个深度神经网络压缩与加速算法相互之间是正交的,可以结合不同技术进行进一步的压缩与加速。如:韩松等人结合了参数剪枝和参数共享;温伟等人以及Alvarez等人结合了参数剪枝和低秩分解。此外对于特定的应用场景,如目标检测,可以对卷积层和全连接层使用不同的压缩与加速技术分别处理。

     参考

    【CSDN文章】深度学习模型压缩与优化加速 (Model Compression and Acceleration Overview)

    【CSDN文章】TensorRT Inference 引擎简介及加速原理简介

    【论文】深度神经网络压缩与加速综述

  • 相关阅读:
    springboot
    POI/JFreeChart
    ssm(6)spring-test
    DBUtils与BeanUtils
    数据连接池C3P0/DBCP/DRUID/自定义连接池
    web核心(3)响应头请求头状态码及dns解析过程
    log4j/Logback/SLF4j
    ssm(4)整合
    列表字典元组方法
    第四天 Python基础语法 编码规范 变量
  • 原文地址:https://www.cnblogs.com/LXP-Never/p/14833772.html
Copyright © 2011-2022 走看看