1. EasyQuant: Post-training Quantization via Scale Optimization
本文通过优化缩放参数(scale)提出了一种更为简单高效的后量化方法,称为EasyQuant(EQ),可以达到与训练中量化相近的精度。
EasyQuant优化了每一层权重和激活值的量化因子的取值,使得卷积后达到更高的量化精度;随后将权重和激活值的位宽降至7bit,中间值以int16形式存储,来加速推理。实验结果显示在不同计算机视觉任务中EQ比TensorRT效果更佳,7bit位宽后量化达到了接近int8的精度。
本文从优化S的角度出发,很简单就是使得量化前后的值更加相似,量化+反量化后的浮点数与原本的浮点数越相似,证明量化的误差越小。
Q为量化后的整型int8,而O为反量化后的浮点型。
O尖为伪量化后的输出,O为正常浮点输出。
因此,最大化两者的相似性即可。
同时,本文还采取贪心算法,逐层逐步量化优化,缩减优化搜索空间。量化的基本流程
本文的scale优化步骤分两步走:
(1)首先固定激活值的缩放因子Sa,调整权重的缩放因子Sw;
(2)随后固定Sw优化Sa。
Sw和Sa交替优化直至cosing相似度收敛或者达到预设的值。
最开始Sw和Sa分别初始化为权重和激活的最大值;随后将搜索空间分为n段进行搜索[aSl,bSl]
具体还有什么量化到7bit的好处之类的,不太懂,没仔细看。
2 .Data-Free Quantization Through Weight Equalization and Bias Correction
文章核心点:Data-Free, Weight Equalization, Bias Correction
跨层均衡:per channel一般不需要,主要就是针对于per_tensor,像深度可分离卷积,这种每个通道是分开计算的,权重的分布差异性很大,而per_tensor这种,整层一个scale的,就会产生非常大的损失(谷歌白皮书),为了解决这个问题。
详情关注AI小男孩,量化高阶。 这里把公式列上
Data free quantization(DFQ)Through Weight Equalization and Bias Correction 论文解析 - 知乎 (zhihu.com)参考知乎解析
跨层均衡会带来一个问题,即在si<1的时候,会导致b那层的bias变大,从而可能导致激活变大,对量化产生负面影响。为了避免不同channel的激活值范围差异过大,文章采取策略是:吸收高偏差到下一层。主要也是利用Relu的特性。
Bias Correction:量化偏差修正
涨点杀器:
就是说量化会带来整体偏差,为了修正这个整体偏差,我们可以采取一些数据,分别推理一次量化后的模型和全精度的模型。
3. Up or Down? Adaptive Rounding for Post-Training Quantization
本文就是针对于round函数,一般情况下我们是采用四舍五入的做法,作者尝试了,全部舍去和全部进一步的方法,均不如四舍五入,但是如果随机舍入就会出现比四舍五入好的情况。
因此想要探究round对于损失函数的影响:
一脸懵逼,其实是用了泰勒展开来逼近,这里可以参考AI小男孩公众号的推导
具体就是将损失函数在W处展开,2阶展开就够用了。
带入到公式中
也就是g是一阶导数,h是二阶导数。当函数收敛,就意味着一阶导数一定趋近于0.故只用考虑H这一项。
所以想要将这一项最小,可以分别小这三项,对于前两项来说,一定是四舍五入最好的,因为这样的误差最低嘛,但是对后一项就不一定了,符号不同的话是负数,就会更小,因此不一定是四舍五入为最优。
现在已经从公式上证明了嗯对,不一定是四舍五入最好,那该如何优化呢?
本文将该优化问题定义为一个二元无约束的优化问题 (QUBO,Quadratic Unconstrained Binary Optimization)。因为对于w的取值,只能是向上取整或向下取整两种。
由于深度神经网络的结构通常很复杂,为了避免问题复杂化,论文就限制这个优化函数只针对网络中的每一层单独进行。
后面的推导有一丢丢复杂,对于我这个数学渣渣就有点困难了,谁爱看谁看吧()
最终得出就是优化结果
但问题是w是离散的,不好优化,那就把它松驰成连续空间