二. 量化
简单介绍目前比较SOTA的量化方法,也是最近看的。
2.1 DSQ Differentiable Soft Quantization:Bridging Full-Precision and Low-Bit Neural Networks
本文的创新点主要在于引入了可微软量化的方法,来模拟近似量化过程。
通俗来说也就是,传统的量化方法都是利用round来取整,这就导致了量化的不可微。我们一般的处理方法都是使用STE(Straight Through Estimator),也就是跳过对round的微分,直接让他等于1。
这会存在什么问题?误差。尤其是当我们进行低bit量化时,误差就会非常大。所以,如果我们可以提出一种量化函数,可微的同时还可以无限靠近round函数,那就很好的解决了STE的问题。所以本文定义了一个可以模拟round函数的函数。
具体推导这里不做过多讲解,因为比较复杂,笔者也没太搞懂。anyway,这是个可以训练的函数,通过不断训练可以更好的贴合我们的量化函数。
随着 k 增大,DSQ 和一般的伪量化越来越接近,而 DSQ 由于可导,还能近似模拟 round 的梯度。因此,在量化训练的时候,我们可以直接把伪量化换成 DSQ 函数 。
但同时,作者注意到,无论怎么贴合训练,两者还是会有一定的误差,所以作者又引入了α,来衡量DSQ函数和round函数之间的误差。
α越小,证明误差越小。最后在损失函数中加上对α的约束即可。
故本文的核心思想就是使得量化可微。
2.2 LSQ:Learned Step Size Quantization
本文的创新点就是让S不再是通过min,max来确定,而是将他定为一个可训练的参数。
step size也就是scale,就是s,这里将s设置为可训练的参数,通过反向传播计算出更好更适应每一层的s。
同时,作者通过画出v与step size的微分图,发现这样训练还有一个好处。
这是round函数对于V的输出,我们知道round函数采用的四舍五入的方法,也就是如图,小于0.5输出0,大于0.5输出1,所以0.5处的斜率应该是非常大的 。
作者画出了LSQ与QIL,PACT量化的微分图,可以看到只有LSQ在0.5处有微分陡增,所以LSQ的效果应该更好 。
同时,研究表明当网络中所有权值层的平均更新幅度与平均参数幅度的比值近似相同时,可以获得良好的收敛性,所以作者认为step size的平均更新幅度也应该与平均参数幅度的比值近似相同。所以作者设计了一个比例系数来约束s的梯度。
然而,我们期望步长参数随着精度的增加而减小,也就是量化bit增加时,step size会减小,得到更为精确的量化。当量化比bit减少时,step-size会变大。为了让step-size的参数更新,能够适应量化比特数的调整,需要将step-size的梯度乘以一个scale系数。
第一个g乘在了权重上,第二个g乘在了激活值上。
以上就是LSQ的核心思想和要点。
2.3 PACT:PArameterized Clipping Activation for Quantized Neural Networks
这篇论文的核心思想主要是提出一个新的激活函数PACT。在大多数量化方法上,都专注于对于权重的量化,而对于激活的量化,均采用与权重相同的方法。
但这样其实是不合理的,首先,权重的量化误差可以通过训练学习而得到补偿,但是激活不可以。其次,权重的值与激活相比相对较小,同时现在大火的relu,他的问题就在于没有上界,可能会导致某些离散极大值点干扰量化。
如图,作者通过测试relu激活函数的量化前后的损失函数,发现在量化relu后,会产生较大的损失。
于是,作者提出了PACT激活函数,他可以在训练的过程中自动优化量化尺度。也就是截断式的relu。用α来截断,控制量化范围,这个α是可以训练的。同时,为了使得α可以较小,会对α使用L2正则化的操作。
然后,作者通过几组实验验证了PACT激活函数的优势。
如有错误,欢迎各位批评指正!!