【AI不惑境】模型量化技术原理及其发展现状和展望
大家好,这是专栏《AI不惑境》的第十篇文章,讲述模型量化相关的内容。
进入到不惑境界,就是向高手迈进的开始了,在这个境界需要自己独立思考。如果说学习是一个从模仿,到追随,到创造的过程,那么到这个阶段,应该跃过了模仿和追随的阶段,进入了创造的阶段。从这个境界开始,讲述的问题可能不再有答案,更多的是激发大家一起来思考。
作者&编辑 | 言有三
模型量化是非常实用的模型压缩技术,当前已经在工业界发展比较成熟,本文给大家梳理模型量化的核心技术,发展现状,未来展望以及学习资源推荐。
1 模型量化基础
1.1 什么是模型量化
我们知道为了保证较高的精度,大部分的科学运算都是采用浮点型进行计算,常见的是32位浮点型和64位浮点型,即float32和double64。
对于深度学习模型来说,乘加计算量是非常大的,往往需要GPU等专用的计算平台才能实现实时运算,这对于端上产品来说是不可接受的,而模型量化是一个有效降低计算量的方法。
量化,即将网络的权值,激活值等从高精度转化成低精度的操作过程,例如将32位浮点数转化成8位整型数int8,同时我们期望转换后的模型准确率与转化前相近。
1.2 模型量化的优势
模型量化可以带来几方面的优势,如下。
(1) 更小的模型尺寸。以8bit量化为例,与32bit浮点数相比,我们可以将模型的体积降低为原来的四分之一,这对于模型的存储和更新来说都更有优势。
(2) 更低的功耗。移动8bit数据与移动32bit浮点型数据相比,前者比后者高4倍的效率,而在一定程度上内存的使用量与功耗是成正比的。
(3) 更快的计算速度。相对于浮点数,大多数处理器都支持8bit数据的更快处理,如果是二值量化,则更有优势。
上图展示的是一个二值权重和激活值矩阵的运算,卷积过程中的乘加都可以转换为异或操作,并行程度更高,运算速度因此也更快。
因此,在工业界对模型量化有着非常强烈的需求,接下来我们讲解其中的主要算法。
2 模型量化算法
量化的技术根据不同的量化原理和位宽可以分为许多种。根据量化原理来说,可以分为直接经验量化算法,基于重建的方法,基于梯度和损失优化的算法等。根据位宽常见的有1bit量化,8bit量化,以及任意bit数量化。
由于我们在实际应用的时候更关注量化本身带来的对模型体积的减小和加速效果,因此我们根据位宽的不同来分别介绍常见的代表性模型量化技术。
2.1 二值量化(1bit量化)
二值量化是最高效率的量化方式,也可以称之为1bit量化,即将32位浮点数量化为1bit整型,非常适合FPGA等平台进行并行运算。二值量化模型以Binary Connect和Binarized Neural Networks为代表。
BinaryConnect[1]是首先做二值化研究的论文,它们对权重进行了二值化。将权重和每层的激活值全部二值化的方法有两种方法。第一种就是符号函数,即x>0,则f(x)=1,x<0,则f(x)=-1。另一种是以一定的概率赋值,类似于Dropout技术。
BinaryConnect在前向传播权重量化的时候,使用了随机的二值化方法,如下:
需要注意的是,为了保持精度,权重在前向传播和反向传播计算的时候进行二值化,但是在进行参数更新的时候使用浮点类型。随机的二值化策略能够起到提高模型泛化能力的作用,这与Dropout,Dropconnect等技术是类似的。
在BinaryConnect的基础上,Binarized Neural Networks[2]随后被提出,它对权重和激活值都进行了二值化,并且同时采用了符号函数和随机量化两种策略。对于激活函数,采用了随机量化方法,而其余的都采用符号函数。
针对符号函数的导数并不连续,无法进行梯度传播的问题,该网络方法将符号函数进行松弛,在-1到1之间采用了线性函数:f(x)=max(-1,min(1,x))。
下图展示的就是一个二值化的权重。
当然了,二值量化还有非常多的技术,包括XNorNet[3]等基于重建的模型,优化目标敏感的二值化模型,基于阈值的二值化改进,激活值正则化等,篇幅有限不再详述,读者可以阅读综述文章[4]进行学习。
2.2 8bit量化
8bit量化是当前工业界最常见的量化方法,也是当前精度保持最高的量化类型。Tensorflow,TensorRT等框架都提供了支持,并且各自代表着非对称量化和对称量化的方案,以Nvidia的8bit对称量化方案为例:
TensorRT[5]通过最小化原始数据分布和量化后数据分布之间的KL散度来对激活值进行量化,将FP32降为INT8的操作如下:
FP32(T) = scale_factor(s) * 8-bit(t) +FP32_bias(b)
实验证明偏置实际上是不需要的,去掉偏置后就是T=s∗t。其中s就是比例因子(scaling factor),因此现在的问题就是如何确定比例因子,一个简单的示意图如下:
上图直接将一个tensor中的-|max|和|max|的FP32值线性映射为-127和127,这样的映射是对称的,并且是不饱和的,实验结果显示这样做会导致比较大的精度损失。主要的原因是max值可能会存在一些离散点噪声,如果直接进行线性缩放,可能就放大了这些噪声,TensorRT的改进做法是从127和|max|之间选择好一个阈值T,把大于这个阈值T的部分截断,示意图如下:
只要阈值选取得当,就能将不稳定的大激活值舍弃掉,并且使精度损失不至于降低太多。原始的数据是一个FP32的分布,现在我们要用INT8的分布来表达这个tensor,根据阈值|T|的取值不同有多种选择,只需要选择其中最接近FP32的即可,所以现在的问题是确定|T|。
我们需要一个衡量指标来衡量不同的INT8分布与原来的FP32分布之间的差异程度,这就是相对熵,或者称为KL散度,它是衡量两个分布相似度的经典算法,定义如下:
KL_divergence(P,Q):= SUM(P[i]*log(P[i]/Q[i]),i)
P,Q分别称为参考分布(reference_distribution)、量化分布(quantize_distribution)。在应用的时候,每一层的|T|值都不同,确定每一层的|T|值的过程被称为校准(Calibration)。
所以完整的流程如下:
(1) 首先将FP32的模型在一个数据集(Calibration Dataset)上跑一遍记录下每一层的FP32激活值,这里没必要去跑整个训练集,比较现实的做法是从验证集中选取一个子集,当然它最好有代表性,多样性好。之后对网络的每一层收集激活值,得到直方图,bins的大小官方建议为2048,所以阈值就在128和2047之间。
(2) 对于128和2047之间的不同阈值|T|进行遍历,选取使得KL散度取得最小值的|T|。对每一层计算出|T|,得到一个所谓的CalibrationTable。把0-T组的数值线性映射到0-128之间,超出T的直接映射到128。
具体的代码实现可以看源代码,下表展示的是一些实验结果,证明分类任务上精度损失并不大。
当前8bit的量化还有以Google提出的非对称量化方法[6],篇幅有限不再赘述。
2.3 任意bit量化
除了2bit和8bit两类最常见的量化方法,3bit,4bit,6bit等也经常被研究,以韩松等人提出的Deep Compression[7]为例,Deep Compression综合应用了剪枝、量化、编码三个步骤来进行模型压缩,是2016 ICLR最佳论文。
整个框架如上所示,包括三个步骤:
(1) 网络剪枝
即移除不重要的连接,包括3个步骤,分别是普通网络训练,删除权重小于一定阈值的连接得到稀疏网络,对稀疏网络再训练,这是一个反复迭代的过程。
(2) 权重量化
如下图,这是一个4×4的权值矩阵,量化权重为4阶,即2bit,分别对应浮点数-1.0,0,1.5,2.0。
对weights矩阵采用cluster index进行存储后,原来需要16个32bit float,现在只需要4个32bit float,与16个2bit uint,参数量为原来的(16×2+4×32)/(16×32)=0.31。
这就完成了存储,那如何对量化值进行更新呢?事实上,文中仅对码字进行更新,也就是量化后的2bit的权重。
将索引相同的地方梯度求和乘以学习率,叠加到码字,这就是不断求取weights矩阵的聚类中心。原来有成千上万个不同浮点数的weights矩阵,经过一个有效的聚类后,每一个值都用其聚类中心进行替代,作者的研究表明这样并不会降低网络的效果。而聚类的迭代过程,通过BP的反向传播完成。
(3) 霍夫曼编码
霍夫曼编码是一种成熟的编码技巧,与CNN无关,它有效地利用了权重的有偏分布,可以进一步减少需要存储的参数体积。
3 模型量化算法的展望
在第二部分,我们简单对2bit,8bit,任意bit量化方法介绍了代表性的框架,但是其实量化本身还有非常多的研究方向,下面列举其中比较具有代表性的。
3.1 混合精度量化
所谓混合精度量化,它可以指不同的网络层有不同的量化位阶,或者权重,激活以及输出采用不同的量化方案,当下可以利用AutoML技术来实现,以HAQ[78]框架为例。
3.2 量化训练框架
目前前向传播中权重和激活的量化比较成熟,但是训练中大部分的计算在反向传播步骤,如果能够将量化技术应用在反向传播中,则可以加速卷积的反向梯度传播过程,不过这需要对梯度也进行量化操作,而梯度的分布比较复杂,容易带来误差造成训练过程的不稳定。如何让量化模型的训练更加稳定,这是非常值得研究的方向[9]。
3.3 非均匀量化方案
通常来说量化函数是一个分段的常数函数,不同的量化等级之间的距离是相等的,即均匀量化,然而数据的分布往往不是均匀的,所以均匀量化不是最合理的方案,因此有一些研究针对量化函数本身进行学习[10]。
除此之外,还有基于重建与损失敏感的量化方法,量化正则化方法,量化网络结构的设计,量化的具体硬件实现等内容。
我们不再一一介绍,对模型量化感兴趣的同学,欢迎到有三AI知识星球的网络结构1000变-模型压缩-模型量化板块进行学习,数十期内容定能满足你的求知欲。
扫码即可加入,了解有三AI知识星球详情请阅读以下文章。
参考文献
[1] Courbariaux M, Bengio Y, David J, et al. BinaryConnect: training deep neural networks with binary weights during propagations[C]. neural information processing systems, 2015: 3123-3131.
[2] Courbariaux M, Hubara I, Soudry D, et al. Binarized neural networks: Training deep neural networks with weights and activations constrained to+ 1 or-1[J]. arXiv preprint arXiv:1602.02830, 2016.
[3] Rastegari M , Ordonez V , Redmon J , et al. XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks[J]. 2016.
[4] Qin H, Gong R, Liu X, et al. Binary neural networks: A survey[J]. Pattern Recognition, 2020.
[5] 8-bit-inference-with-tensorrt
[6] Jacob B, Kligys S, Chen B, et al. Quantization and training of neural networks for efficient integer-arithmetic-only inference[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018: 2704-2713.
[7] Han S, Mao H, Dally W J. Deep compression: Compressing deep neural networks with pruning, trained quantization and huffman coding[J]. arXiv preprint arXiv:1510.00149, 2015.
[8] Wang K, Liu Z, Lin Y, et al. HAQ: Hardware-Aware Automated Quantization with Mixed Precision[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2019: 8612-8620.
[9] Zhu F, Gong R, Yu F, et al. Towards Unified INT8 Training for Convolutional Neural Network.[J]. arXiv: Learning, 2019.
[10] Zhang D, Yang J, Ye D, et al. LQ-Nets: Learned Quantization for Highly Accurate and Compact Deep Neural Networks[C]. european conference on computer vision, 2018: 373-390.
总结
本次我们总结了模型量化的核心技术,并对其重要方向进行了展望,推荐了相关的学习资源,下一期我们将介绍知识蒸馏与迁移学习相关内容。
有三AI秋季划-模型优化组
如果你想系统性地学习模型优化相关的理论和实践,并获得持续的指导,欢迎加入有三AI秋季划-模型优化组,系统性地学习数据使用,模型使用和调参,模型性能分析,紧凑模型设计,模型剪枝,模型量化,模型部署,NAS等内容。