本文分享自华为云社区《模型量化综述及应用》,作者:Alan_wen。

前言

随着深度学习的不断发展,神经网络广泛应用于不同的领域,取得远超以往的性能,但是深度网络模型的参数也越来越大,严重制约着深度网络在业界的应用,因此本文即将介绍目前业界主要的模型优化的方法,然后对模型量化进行重点阐述,介绍量化的基本原理,方法分类,未来发展,以及对前沿论文进行解读。

1.模型优化的方法

1.1设计高效的网络结构

设计紧凑的网络结构可以实现模型的优化,比如提出的MobileNet系列网络,其中简洁的Depth-Wise Convolution和Point-Wise Convolution。但是目前手工设计的神经网络已逐渐被AutoML和网络结构搜索取代,通过网络结构搜索可以得到高精度而结构又紧凑的网络。

1.2模型剪枝

使用手工设计的网络结构一般可以获得较高的精度,但是巨大的网络参数很难直接应用到工业界的产品中,一般会对模型进行剪枝,模型剪枝分为结构化剪枝和非结构化剪枝,非结构化剪枝一般很难实现底层加速,而模型剪枝也逐渐被网络结构搜索取代。

1.3知识蒸馏

除了剪枝可以将一个大模型缩小为小模型外,知识蒸馏同样可以实现该功能。知识蒸馏将原先大模型作为Teacher模型,而设计的小模型Student模型,通过soft-target引导Student模型训练,实现Teacher模型的知识迁移。

1.4稀疏

稀疏主要是通过对网络权重或者特征进行稀疏,可以通过正则化训练的方式实现稀疏化,而网络权重稀疏后一般通过与模型剪枝的方式结合,对不活跃的权重进行裁剪,以压缩网络结构。

1.5模型量化

模型量化是目前工业界最有效的模型优化方法之一,如FP32-->INT8可以实现4倍的参数压缩,在压缩内存的同时可以实现更快速的计算,进行极端的二值量化理论上甚至可以实现32倍的压缩,但是过度的压缩会导致模型的精度快速下降。下文将对模型量化进行详细介绍。

2.模型量化综述

2.1什么是量化?

在信息系统中量化是将信号的连续取值近似为有限多个离散值的过程 (可以认为是一种信息压缩的方法) 。

在计算机系统中,量化是指定点与浮点等数据之间建立一种数据映射关系,使得以较小的精度损失代价获得了较好的收益,可简单理解为用“低比特”数字表示FP32等数值。

在开始介绍量化的原理之前先问三个问题:

为什么量化有用?

  • 因为卷积神经网络对噪声不敏感,量化相当于对原输入加入了大量的噪声。

为什么用量化?

• 模型太大,比如VGG19大于500MB的参数量,存储压力大;
• 每个层的weights范围基本都是确定的,且波动不大,适合量化压缩;
• 此外,量化既减少访存又可减少计算量

为什么不直接训练低精度的模型?

  • 因为训练需要反向传播和梯度下降,int8为离散数值,举个例子就是我们的学习率一般都是零点几零点几的,int8不匹配无法反向传播更新。

2.2量化原理

量化是指将信号的连续取值近似为有限多个离散值的过程。可理解成一种信息压缩的方法。在计算机系统上考虑这个概念,一般用“低比特”来表示。

模型量化为定点与浮点等数据之间建立一种数据映射关系,使得以较小的精度损失代价获得了较好的收益。详细如下:

R 表示真实的浮点值,Q 表示量化后的定点值,Z 表示 0 浮点值对应的量化定点值,S 则为定点量化后可表示的最小刻度。 由浮点到定点的量化公式如下:

浮点到定点的量化:

2.3量化基础概率

均匀与非均匀量化:

如上图所示,量化可分为均匀量化和非均匀量化,上图左图的均匀量化即为公式(1)方式的线性量化。而网络权重或者特征分布不一定是均匀的,简单的线性量化可能导致原网络明显的信息丢失,因此还可以进行非均匀量化,如使用Kmeans对网络权重进行聚类,得到不同的聚类中心,然后将聚类中心作为同一簇权重的量化代表。

对称与非对称量化:

在理想的情况下,如上图左图所示,特征分布比较均匀,因此可以对模型进行对称量化,即以0点值左右两边绝对值相等进行量化。但是很多情况下模型权重或特征是分布不均匀的,不一定在0点值两边对称,如上图右图所示,直接进行对称量化会某一侧的特征被严重压缩,大量丢失网络信息,因此可为了尽可能以的保持原网络表示的信息,可进行非对称量化。

动态与静态量化:

有不同的校准方法来确定上图[α, β]的剪切范围。量化方法的另一个重要区分因素是裁剪范围的确定。可以静态地计算权重的范围,因为在大多数情况下,参数在推断期间是固定的。然而,每个输入样本的激活映射是不同的。因此,有两种量化激活的方法:动态量化和静态量化。

在动态量化中,在运行时期间为每个激活映射动态计算此范围。这种方法需要实时计算信号统计信息(最小值、最大值、百分位数等),这些统计信息可能具有非常高的开销。然而,动态量化通常能获得更高的精度,因为信号范围是精确计算每个输入的。

另一种量化方法是静态量化,其中剪裁范围是预先计算的,在推理期间是静态的。这种方法在推理过程不会增加任何计算开销,但与动态量化相比,它通常会导致更低的精度。预计算的一种流行方法是运行一系列校准输入以计算典型激活范围。

总的来说,动态量化动态计算每个激活的裁切范围,通常可实现最高精度。然而,动态计算裁切的范围非常消耗计算,因此,业界最常使用静态量化,其中所有输入的裁切范围都是固定的。

不同量化粒度:

在计算机视觉任务中,每层的激活输入有许多不同的卷积滤波器卷积,如图上所示。这些卷积滤波器的每个都可以具有不同的值范围。因此,量化方法的一个区别是如何为权重计算裁切范围[α,β]的粒度。可将它们分类为层量化,分组量化和通道量化:

a)层量化:在这种方法中,裁切范围是通过考虑层卷积滤波器中的所有权重来确定的,如上图的第三列所示。通过该层中整个参数的统计信息(如最小、最大和百分位数等),然后对整层卷积滤波器使用相同的裁切范围。虽然这种方法实现非常简单,但它通常会导致次优解,因为每个卷积滤波器的范围可能会有很大的变化,会使某些参数范围相对较窄的卷积核失去量化分辨率。
b)分组量化:可以将层内的多个不同通道分组,以计算裁切范围(激活或卷积核)。这对于单个卷积/激活中参数分布变化很大的情况可能会有所帮助,分组量化可以在量化分辨率和计算开销之间建立一个很好的妥协。
c)通道量化:裁切范围的一个通常选择是为每个卷积滤波器使用固定值,独立于其他通道,如上图最后一列所示。也就是说,每个通道都被分配了一个专用的缩放因子。这确保了更好的量化分辨率,并通常导致更高的精度,通道量化是目前用于量化卷积核的标准方法。

随机量化

在推理过程中,量化方案通常是确定性的。然而,这并不是唯一的可能性,一些工作已经探索了随机量化用于量化感知训练以及降低精度训练。高层次的直觉是,与确定性量化相比,随机量化可能允许NN进行更多探索。人们通常认为小的权重更新可能不会导致任何权重变化,因为四舍五入操作可能总是返回相同的权重。然而,启用随机舍入可能会为NN提供转变的机会,从而更新其参数。下面公式为在Int量化和二值量化的随机舍入方式。

微调的方法

量化后,通常需要调整神经网络(NN)中的参数。这可以通过retraining模型来执行,该过程称为量化感知训练(QAT),也可以在不retraining的情况下完成,该过程通常称为训练后量化(PTQ)。上图显示了这两种方法之间的示意性比较(左图为量化感知训练,右图为训练后量化),并在下文进一步讨论。

  • 量化感知训练(伪量化)

给定一个训练好的模型,量化可能会对训练好的模型参数引入扰动,这可能会将模型偏离以浮点精度训练时收敛到的点。可以通过使用量化参数重新训练NN模型来解决这个问题,以便模型能够收敛到具有更好损失的点。一种流行的方法是使用量化感知训练(QAT),其中通常的正向和反向传递是在浮点中对量化模型执行的,但模型参数在每次梯度更新后都会量化。特别是,在以浮点精度执行权重更新后,执行此投影非常重要。使用浮点执行向后传递非常重要,因为在量化精度中累积梯度可能会导致零梯度或具有高误差的梯度,特别是在低精度中。

反向传播中的一个重要微妙之处是如何处理不可微量化算子(公式1)。在没有任何近似的情况下,这个运算符的梯度几乎在任何地方都是零,因为在公式中的舍入操作是分段平面运算符。解决这个问题的一种流行方法是通过所谓的直通估计器(STE)近似该运算符的梯度。STE基本上忽略了舍入操作,并使用标识函数近似它,如下图所示。

尽管STE是粗略近似的,但QAT已被证明有效。然而,QAT的主要缺点是重新训练NN模型的计算成本。这种重新训练可能需要执行几百个epoch来恢复精度,特别是对于低位精度量化。如果量化模型要在很长一段时间内部署,如果效率和准确性特别重要,那么在重新训练方面的投资可能是值得的。然而,情况并不总是这样,因为有些模型的寿命相对较短。

  • 训练后量化

替代昂贵的QAT方法是训练后量化(PTQ)执行量化和权重调整,不进行任何微调。因此,PTQ的开销非常低,而且往往可以忽略不计。与QAT不同,QAT需要足够数量的训练数据进行再培训,PTQ还有一个额外的优势,即它可以应用于数据有限或未标记的情况。然而,与QAT相比,这通常是以更低的精度为代价的,尤其是对于低精度量化。

  • Zero Shot(即data-free)

如目前所讨论的,为了在量化后实现最小的精度下降,我们需要访问整个或者部分训练数据。首先,我们需要知道激活的范围,以便我们可以剪裁值并确定适当的缩放因子(文献中通常称为校准)。其次,量化模型通常需要微调来调整模型参数并恢复精度下降。然而,在许多情况下,在量化过程中,不可能访问原始训练数据。这是因为训练数据集要么太大,无法分发,要么是独有的(例如Google的JFT-300M),要么是由于安全或隐私问题(例如医疗数据)而敏感的。目前提出了几种不同的方法来解决这一挑战,我们称之为Zero Shot量化(ZSQ)。根据高通的一个工作的启示[2],可以描述两个不同级别的Zero Shot量化:

第1级:无数据,无微调(ZSQ+PTQ)。
第2级:无数据,但需要微调(ZSQ +QAT).
级别1允许更快、更容易的量化,而无需任何微调。微调通常很耗时,而且通常需要额外的超参数搜索。级别1可通过权重均衡或者BatchNorm的统计参数实现校正,无需微调。
然而,级别2通常会导致更高的精度,因为微调有助于量化模型恢复精度下降,特别是在超低位精度设置中。级别2微调的输入数据主要通过GAN生成,可根据量化前的模型,使用GAN生成近似的分布数据,而无需再访问外部数据。

Zero Shot(又名date-free)量化执行整个量化,而不访问训练/验证数据。这对于希望加快客户工作负载部署而无需访问其数据集的提供商来说尤其重要。此外,这对于安全或隐私问题可能限制对训练数据的访问的情况非常重要。

2.4量化进阶概念

  • FP32,伪量化和定点量化

部署量化NN模型有两种常见的方法,模拟量化(又名伪量化)和仅整数量化(又名定点量化)。在模拟量化中,量化的模型参数存储在低精度中,但操作(如矩阵乘法和卷积)是用浮点算法执行的。因此,量化参数需要在浮点运算之前反量化,如图上图(中间)所示。因此,人们不能完全受益于快速高效的低精度逻辑与模拟量化。然而,在纯整数量化中,所有操作都使用低精度整数算术执行,如上图(右)所示。这允许整个推理可以用有效的整数算法执行,而不需要对任何参数或激活进行任何浮点反量化。

一般来说,使用浮点算法在全精度下执行推理可能有助于最终量化精度,但这是以无法从低精度逻辑中受益为代价的。低精度逻辑在延迟、功耗和区域效率方面与全精度逻辑相比具有多重优势。与模拟/假量化相比,仅整数量化和二进量化更可取。这是因为仅整数使用较低精度的逻辑进行算术,而模拟量化使用浮点逻辑来执行运算。然而,这并不意味着伪量化永远没有用处。事实上,伪量化方法对带宽限制而不是计算限制的问题是有益的,例如在推荐系统中,对于这些任务,瓶颈是内存占用空间和从内存加载参数的成本。因此,在这些情况下,执行伪量化是可以接受的。

  • 混合精度量化

很容易看到,随着我们使用较低精度量化,硬件性能得到了提高。然而,将模型均匀量化到超低精度可能会导致精度显著下降。可以通过混合精度量化来解决这个问题。在这种方法中,每个层都以不同的位精度量化,如上所示。这种方法的一个挑战是,选择此位设置的搜索空间在层数上是指数级的。
目前提出了不同的方法来解决这一巨大的搜索空间。
a)为每个层选择这种混合精度本质上是一个搜索问题,并且已经提出了许多不同的搜索方法。

b)另一类混合精度方法使用周期函数正则化来训练混合精度模型,通过自动区分不同层及其在精度方面的变化重要性,同时学习它们各自的位宽。

c)HAWQ 引入了一种基于模型二阶灵敏度的自动方法来查找混合精度设置。
混合精度量化已被证明是一种有效的硬件高效方法,用于不同神经网络模型的低精度量化。在这种方法中,NN的层被分组为对量化敏感/不敏感,每个层使用高/低位。因此,人们可以最大限度地减少精度下降,并仍然受益于减少内存占用和低精度量化更快的加速。

  • 硬件感知量化

量化的目标之一是提高推理时延。然而,并非所有硬件在量化某个层/操作后都提供相同的速度。事实上,量化的好处取决于硬件,片上内存、带宽和缓存层次结构等许多因素都会影响量化速度。

考虑这一事实对于通过硬件感知量化实现最佳效益非常重要。因此需要模拟硬件延迟,在硬件中部署量化操作时,需测量不同量化位精度的每层的实际部署延迟。

  • 蒸馏辅助量化

量化中一个有趣的工作路线是结合模型蒸馏以提高量化精度。模型蒸馏是一种使用精度较高的大模型作为教师,帮助训练紧凑型学生模型的方法。在学生模型的训练过程中,模型蒸馏提出利用教师产生的软概率,而不是仅仅使用ground-true类标签,该软概率可能包含更多输入信息。也就是说,总体损失函数包括学生损失和蒸馏损失。

  • 极致量化

二值化是最极端的量化方法,其中量化值被限制为1位表示,从而将内存需求大幅降低32×。除了内存优势外,二进制(1位)和三元(2位)操作通常可以使用位算术有效计算,并可以在更高精度(如FP32和INT8)上实现显著的加速。然而,简单的二值化方法将导致精度显著下降。因此,有大量工作提出了不同的解决方案来解决这一问题,主要分为以下三类:

a. 量化误差最小化(使用多个二值矩阵组合模拟近似,或者使用更宽网络)
b. 改进损失函数(例如加入蒸馏损失)
c. 改进训练方法(如反向传播时用更光滑的函数取代sign)

极低位精度量化是一条非常有前途的研究方向。然而,与基线相比,现有方法通常会导致高精度下降,除非执行非常广泛的调谐和超参数搜索。但这种精度下降对于不那么关键的应用可能是可以接受的。

2.5未来量化方向

在这里,我们简要讨论了未来量化研究的几个挑战和机遇。这分为量化工具、硬件和NN架构的共同设计、联合多种压缩方法和量化训练。

量化工具:
使用当前的方法,将不同的NN模型量化并部署到INT8是很简单的,而不会明显失去准确性。有几个软件包可用于部署INT8量化模型(例如,Nvidia的TensorRT、TVM等),每个软件包都有良好的文档。然而,用于低位精度量化的软件并不广泛可用,有时也不存在。例如,Nvidia的TensorRT目前不支持INT8以外的量化。此外,对INT4量化的支持直到最近才被添加到TVM中。使用INT4/INT8进行低精度和混合精度量化在实践中有效和必要的,因此,开发用于低精度量化的高效软件API将产生重要影响。
硬件和NN架构联合设计:
如上所述,低精度量化的经典工作与机器学习的最新工作之间的一个重要区别是,神经网络参数可能具有非常不同的量化值,但仍然可以很好地泛化近似。例如,通过量化感知训练,我们可能会收敛到一个不同的解,远离单一精度参数的原始解,但仍然获得良好的准确率。人们可以利用这种自由度,也可以在NN架构被量化时调整它。例如,改变NN架构的宽度可以减少/消除量化后的泛化间隙。未来的工作之一是在模型被量化时联合调整其他体系结构参数,如深度或单个内核。未来的另一项工作是将这种共同设计扩展到硬件体系结构。
联合多种压缩方法:
如上所述,量化只是有效部署NN的方法之一。其他方法包括高效的NN架构设计、硬件和NN架构的协同设计、剪枝和知识蒸馏、网络框架搜索等。量化可以与这些其他方法结合使用。然而,目前很少有工作探索这些方法的最佳组合。例如,NAS联合量化、剪枝和量化可以一起应用于模型,以减少其开销,理解结构化/非结构化剪枝和量化的最佳组合非常重要。同样,未来的另一个方向是研究这些方法与上述其他方法之间的联合。
量化训练:
也许量化最重要的用途是以半精度加速NN训练。这使得使用更快、更节能的低精度逻辑进行训练。然而,要把这一点进一步推到INT8精确训练是非常困难的。虽然在这一领域存在一些有趣的工作,但所提出的方法通常需要大量的超参数调整,或者它们只适用于一些相对容易的学习任务的NN模型。基本的问题是,在INT8精度的情况下,训练可能会变得不稳定和发散。解决这一挑战可能会对多个应用程序产生很大影响,特别是对于前沿的训练。

3.量化论文解读

3.1Data-Free 量化

Data-Free Quantization Through Weight Equalization and Bias Correction[2]. (ICCV2019)

这是高通提出的一篇文章,提出Data-Free实现训练后量化,文章中的主要创新点是提出了权重均衡和偏移纠正的方法。

如下图(左)所示,同一层的卷积核值范围分布极不均衡,而每通道量化又实现相对复杂和消耗额外的时间,因此提出对权重进行均衡化,如下图(右)所示,经过均衡化后,整体值范围分布相对均衡。

而权重均衡主要是利用了等价伸缩的原理,如公式

的等价,在卷积核全连接层中,对前一层权重的缩放可以通过缩放因子传递到下一层。

偏移纠正是因为在模型量化过程中数据会发生整体的偏移,因此通过计算偏移的误差,然后对误差进行抵消可实现更准确的量化效果。如下表所示,文章中提出的两种方法在层量化的方式中可以实现与每通道量化接近的结果。

Post training 4-bit quantization of convolutional networks for rapid-deployment[3]. (NIPS2019)

该文章使用4bit精度实现了训练后量化,提出了分析计算最佳剪辑范围(ACIQ)和通道位宽设置。ACIQ提出以最小量化误差为优化目标,通过优化的方式得到不同精度量化的最优裁断值,同时还提出了在总bit精度固定的情况下,不同通道设置不同的精度进行量化,可以实现更加合适和准确的量化,但是不同通道设置不同的bit进行量化难以实现工业加速。下表展示了得到的实验结果,在4bit量化下,模型下降2%左右的准确率。

Differentiable Soft Quantization: Bridging Full-Precision and Low-Bit Neural Networks[4].(ICCV2019)

对于低比特量化,如二量化可以有效地加速推理,同时降低深度神经网络的内存消耗,这对于在资源有限的设备(如嵌入式设备)上部署模型至关重要。然而,由于低比特量化的离散性,现有的量化方法往往面临训练过程不稳定和性能严重下降的问题。为了解决这一问题,该文章提出了一种可微软量化(DSQ)方法来弥补全精度网络和低比特网络之间的差距。DSQ可以在训练过程中自动进化,逐步逼近标准量化,如下图所示。由于DSQ的可微性,在适当的限幅范围内,DSQ可以在后向传播中跟踪精确的梯度,减少前向过程中的量化损失。

DSQ采用一系列双曲正切函数逐步逼近阶梯函数进行低比特量化(如1比特情况下的符号函数),同时保持平滑性,便于梯度计算。该文章针对一个近似特征变量重新构造了DSQ函数,并相应地发展了一种进化训练策略来逐步学习微分量化函数。在训练过程中,DSQ和标准量化之间的近似值可以由特征变量控制,特征变量和限幅值可以在网络中自动确定。DSQ减少了由极低比特量化引起的偏差,从而使训练中的前向和后向过程更加一致和稳定。

下表可以看到该方法在较低比特量化的情况下,与FP32相比,基本没有准确率退化。

Mixed Precision Quantization of ConvNets via Differentiable Neural Architecture Search[5].(ICLR2019)

如上图所示,该论文提出了可微分NAS(DNAS),该NAS方法将候选操作以概率θ随机激活,而非直接的softmax进行加权,并且概率θ作为搜索过程中可以优化的参数。由于DNAS前期初始化以相等的概率进行随机激活操作,而在训练后期概率θ会出现明显的差异化,因此DNAS在前期训练时似DARTS,而后期似ENAS。

为了实现混合精度的量化,该论文在DNAS的基础上,将不同bit量化作为不同的结构(如下图所示),搜索优化得到不同层不同的量化精度。

通过可微分搜索得到混合精度量化,如下表所示,在Cifar10数据集上,可以做在10倍以上加速的条件下,量化后准确率还略高于FP32。

APQ: Joint Search for Network Architecture, Pruning and Quantization Policy[6]. (CVPR2020)

该论文提出了APQ,用于在资源受限硬件上高效的深度学习推理。与以前分别搜索神经架构、剪枝策略和量化策略的方法不同,该论文以联合的方式优化它们。为了应对它带来的更大的设计空间,提出训练一个量化感知的精度预测器,以快速获得量化模型的精度,并将其反馈给搜索引擎,以选择最佳拟合。

然而,训练这种量化感知精度预测器需要收集大量量化的模型、精度配对,这涉及量化感知微调,因此非常耗时。为了应对这一挑战,该论文提出将知识从全精度(即fp32)精度预测器转移到量化感知(即int8)精度预测器,这大大提高了样本效率。此外,收集fp32精度预测器的数据集只需要通过从预先训练的once-for-all[7]网络中采样来评估神经网络,而不需要任何训练成本,这是高效的。下图为从全精度预测器迁移训练量化感知的准确率预测器的过程。

下表为在ImageNet数据集上的结果:

参考文献:

  1. A Survey of Quantization Methods for Efficient Neural Network Inference.
  2. Data-Free Quantization Through Weight Equalization and Bias Correction, ICCV2019.
  3. Post training 4-bit quantization of convolutional networks for rapid-deployment, NIPS2019.
  4. Differentiable Soft Quantization: Bridging Full-Precision and Low-Bit Neural Networks, ICCV2019.
  5. Mixed Precision Quantization of ConvNets via Differentiable Neural Architecture Search, ICLR2019.
  6. APQ: Joint Search for Network Architecture, Pruning and Quantization Policy, CVPR2020.
  7. Once for all: Train one network and specialize it for efficient deployment,ICLR2020.
  8. Binary Neural Networks: A Survey, Pattern Recognition, 2020.
  9. Forward and Backward Information Retention for Accurate Binary Neural Networks, CVPR2020.

点击关注,第一时间了解华为云新鲜技术~

03-05 23:39