Learning to Quantize Deep Networks by Optimizing Quantization Intervals with Task Loss
本文提出了一种可学习的量化间隔(Quantization Interval Learning,QIL)方法。
它的思路类似TSQ,都是分两步进行量化,但与TSQ不同,它在每一步里都同时对权重和**值进行处理。
第一步是一个Transformer:其思路与DoReFa-Net类似,将权重变换到[-1,1],将**值变换到[0,1]。
其框架如下:
权重和**值的变换公式分别为:
这里Cw和Cx分别为转换区间的中心值,Dw和Dx分别为中心到边缘的距离。
在做完转换后,第二步是discretizer,使用截断函数将参数离散化:
这里qD是量化级别,假设量化为kbit,那么qD=2的k次-1。
这种方法的优点是:1、缩减了参数的值域,使得在相同的量化粒度下,参数的精度更高;2、使用学习的方法来获得量化的间隔,能够得到较好的结果。3、TSQ是一个逐层的方法,所以它在遇到skip-connection这样跨层的操作时就会不适用。而这个方法并不存在这个问题。
缺点在于:1、学习的方法的一个普遍的问题:开销;2、作者将量化分为两个步骤,第一个步骤是连续的,因此可以求导。但第二个步骤还是离散的,要使用STE来估计梯度。所以只是部分地解决了梯度不匹配问题。
它的另一个特点是:与其它关注量化误差的方法不同,因为它在训练时可以修改量化的间隔,因此它直接以loss来作为量化的评价指标。这种方法我认为更好,因为首先全精度网络的权重并不一定是最优的。而在将其量化后,得到的网络实际上已经是另一个网络了。即使我们使量化误差变得非常小(我们也做不到这一点),得到的点也未必是最优点。所以一个可改变量化范围的方法,效果应该更好些。
算法如下: