XJ3浮点模型转换工具链使用了后量化技术进行模型的量化部署,常用的后量化方法有根据max,KL等寻找最佳阈值并量化。而学术界也不断涌现后量化相关的论文,本文介绍一篇这个方面相关的研究,该后量化方法称为ACIQ。
在论文《Post training 4-bit quantization of convolutional networks for rapid-deployment》中,介绍了三种方法,用于CNN模型的超低比特量化(4bits)和比特数自动选择。
论文的官方github:submission2019/cnn-quantization
在这篇论文中,作者主要提出了三种方法:
- Analytical Clipping for Integer Quantization(ACIQ),一种阶段阈值选择方法
- Per-channel bit allocation,一种对feature map各个channel实现不同比特量化的方法
- bias-correction,一种偏移修正方法, 用以提高量化后的精度
ACIQ
ACIQ是一种量化阈值选择方法。对于后量化而言,最直接的方法是等价量化,不做截取,但这样损失较为严重(原始连续分布长尾太大)。通常需要找到一个阈值T用来截断,不在区间[-T, T]的值截取为-T或T。这样可以有效提高后量化精度。所以,问题就转变为,如何选择较好的截取值T,传统方法用KL散度,遍历可能的截取值不断计算量化前后分布的KL散度然后选取KL散度最小的T值作为截取值。论文中提出的ACIQ即一种基于优化思想的阈值T选取方法。
首先,对于一个tensor(feature map),ACIQ假设该tensor的分布服从两种可能:拉普拉斯分布或高斯分布。量化过程就是将服从该分布的tensor中的值量化到2^M离散区间中。其中M表示比特数。
ACIQ定义原始浮点分布的密度函数 f(x) ,截取值 a 以及量化函数 Q(x) 。所以,量化前和量化后的L2 loss就等于:
而整个量化问题就被转变为:求解 a,使得上述的loss值最小。
从上述表达式不难看出,量化损失一共分为三段:负无穷到 -a 截断产生的误差, -a 到 a 之间的round量化误差,以及 a 到正无穷的截断误差。论文用可导函数来表示各个阶段的误差进而方便求解。论文正文里以tensor服从拉普拉斯分布的情况进行推导。
量化误差如下:
阶段误差如下:
所以,最终的整体量化损失如下:
此时,量化函数被成功的转换成了一个可以求导的连续函数,只需要对其求偏导,就可以得到使量化误差最小的截断值:
其中, a为截取值, b 为拉普拉斯分布的参数。M为量化后的比特数。最后,求解公式在M = 2,3,4时, a = Tb,T分别取值2.83, 3.89, 5.03。
上述即是ACIQ的核心原理,利用优化的思路来求解量化过程截断值进而最小化量化损失。注意ACIQ有一个较强的先验假设,即tensor的数据分布要符合拉普拉斯分布或高斯分布(高斯分布的截取值计算在论文的附页中)。
Per-channel bit-allocation
Per-channel bit-allocation核心思想是允许一个tensor中的各个channel的量化bits不相同(channel1可能用4bits量化;channel2可能用5bits量化,channel3可能用3bits量化),并找到每个channel的最佳量化bits。同时要求平均每个channel的量化bits值为4。
首先,该方法借用了ACIQ中对连续密度函数和量化后的离散分布之间的L2误差的定义,并在该定义的基础上,引入各个channel的量化比特数作为限定条件。并引入拉格朗日乘子,得到channel变化bits时的量化损失表达式。
其中,第一项为ACIQ中的量化loss表达式,后巷表示拉格朗日乘子引入的约束损失。 Mi表示第i个channel的量化比特,B表示所有channel的量化间隔总和。
对拉格朗日表达式求偏导,得:
最终,我们可以得到各个channel的最佳量化bit和原始浮点数据分布的关系如下:
总体来说,该方法延续了ACIQ的优化方法求解量化问题思想,从算法角度来看可以在有限的bits量化时通过灵活调整各个channel的量化比特数,达到量化损失最小的情况。但在实际应用中,如此各个channel分比特量化必须要配合非常特殊的硬件加速实现,实际应用价值值得商榷。
Bias-Correction
Bias-Correction方法主要用于对weight的量化,作者观察到量化前后权重分布的均值和方差纯在固有的偏差,该方法即通过一种简单的方法补偿weight量化前后偏移的mean和var。
Bias-Correction方法很简单,计算量化前后均值的差值和量化前后方差值的除数。最后更新量化后的权重:
总结一下,Bias-Correction方法简单直接,有效。但奇怪的一点是作者在后续实验并没有给出在量化比特 = 8的情况下(int8量化)的Bias-Correction方法消融实验,是否在8比特量化时并没有严重的偏移损失仍需要实验(int8似乎并不需要Bias-Correction)。
实验
作者选用了常见的几种分类模型,进行了组合/消融实验。同时也分别进行了Weight和feature map用不同比特数量化的实验结果对比,从实验结果来看,作者提出的多种方法,在超低比特量化时还是可以起到很好的效果的。