目前,个人主要将当前模型量化的论文分为四个方向:
- 2/3 bit的模型计算
- 量化损失原理分析
- 增量量化
- 量化Tricks
1/2 bit的模型计算
该方向,试图使用极低bit位的计算,使得原来加减乘除的计算变为简单的位加减运算,从而解放硬件上的需求。但由于其精度仍与float运算有一定距离(部分方法的论文未体现大差距,但都在很小的模型或者在冗余度极高的论文上进行试验,本人也未进一步验证),故该方向主要是为了总结思想。
其主要代表有:
- SYQ:将 conv 层的量化目光放在了元素层级上,而 fc 层的量化仍在 layer 级。(元素级:每层的卷积核大小为 K * K * Cin * Cout,在这之前,都是一层提取一个量纲,在2-3元模型上就是 α \alpha α,而SYQ提取 K * K个量纲,每个量纲统计的是 Cin * Cout);
- HORQ(High-Order-Residual-Quantization):就是从残差上再拟合一个二元矩阵,一层通过两次二元矩阵的运算,达到进一步拟合计算效果的功能;
量化损失原理分析
该方向,主要是考虑了量化过程中,retrained过程中的困难,以及量化输入(activation)时所遇到的大量化误差的分析,从原理上分析激活函数等部件;
其主要代表有:
- PACT(PArameterized Clipping Activation):训练多一个参数 α \alpha α ,给激活值一个截断,大概就是 Relu6 —> Relu α \alpha α;
- HWGQ(Half-wave Gaussian Quantization):使用Relu6以及实验稀疏激活值,以及提出一个观点: 最大值池化操作应该在BN层之前;
增量量化
就是一次性量化所有权重,使得模型的retrain操作(想要恢复精度的retrain)变得困难,所以提出了一步步增加量化的比重的观点;
其主要代表有:
- INQ:分组量化,将权重weight分成几个小组,其认为大值较为重要,先量化大值的权重;
- MLQ:多层次量化,multi-layer Quantization,其主要是增加了一个逐层量化的思想:一次量化一层,下面retrain恢复精度的权重慢些量化,且减轻量化难度;
量化Tricks
一些量化的tricks,主要是因为需要量化激活值时,会存在量化权重与量化激活值耦合的问题;
其主要代表有:
- TSQ:Two-Step Quantization,先量化激活值,再量化权重;量化权重时,使用最小二乘法量化;量化激活值时,使用等效替换,从而达到解耦的效果;最后通过EM算法的思路,交替量化权重和激活值;
- TS-PQ-Guide:TS—Two-step、PQ—Progressive Quantization、Guide—Guide training with a full-precision network,教师系统;
限制activation量化的损失,主要有两种手段:1. Relu截断,引导其不上涨,最终由一个较为合理的范围之后再量化;2. 在量化时,使用截断,如人工设置或者使用KL散度进行度量;