LSQ+: Improving low-bit quantization through learnable offsets and better initialization
本文是对lsq:Learned Step-size Quantization的改进。
关于lsq,这篇文章讲得很清楚:
https://blog.****.net/nature553863/article/details/104275477
简单来说,就是通过学习来确定量化间隔。
在lsq提出时,当时流行的**函数是ReLU。它的特点是,将小于0的**值都置为0,因此lsq在量化**值时使用非对称量化:即只量化正的**值,负值直接量化为0。这在当时是没问题的,但后来swish、H-swish以及Leaky-ReLU这类负值区域的**值不为0的**函数被提出,如果再这样做,就会导致精度的下降(lsq+的作者通过实验证明了这一点)。
但是如果采取和量化权重一样的,对称量化**值也会带来一个问题:量化的间隔是有限的,分出一半给负值就会减少正值的表示能力,而且负值区域相较正值来说要少很多,这样做并不值得。
为了解决这个问题,lsq+的作者给**值加了一个可学习参数β:
由于权重是被对称量化的,所以**值的计算过程如下:
可以看到,引入一个β,代价仅是一个常数时间的bias计算,但却能很好地提高准确率,是非常值得的。
本文的另一个创新是,修改了lsq的s值的初始化方法。
lsq对权重的s的初始化方法为:
lsq+则使用
效果很好:
至于**值的s和β初始化,作者试了两种方法:
但这种方法用以受到异常值的影响。
以及:
所以最后作者采取的方法是先使用几个batch的数据对参数进行校正。
实验结果如下:
可以看出,config3的效果大多比config4好,但也有例外。所以具体采取哪种方式,还是要看具体情况。