为什么在伪量化操作前,需要先将激活值限制在0到1之间?这一做法可以追溯到经典的神经网络结构,如AlexNet和ResNet,这些模型中大部分激活值都自然落在0到1的区间内。这种约束为后续的量化过程奠定了良好基础,尤其在模型压缩与加速领域具有重要实践意义。

至于权重部分的处理,则略有差异:首先通过tanh(w)将权重映射到-1到+1之间,接着除以两倍的tanh(w)绝对最大值,并加上1/2,最终把权重整体调整到0到1的范围内。随后,在此区间上执行量化与反量化操作,最后通过乘2减1的仿射变换,将结果还原至-1到1之间。经过这套流程,权重便完成了“数字化改造”,实现了高效的权重量化。
这里提到的量化与反量化操作,在原论文中被称为quantize_k操作,其中k代表量化位数。本质上,这与我们之前讨论的量化公式一致,只是将1/s替换为2^k-1。看起来很简单?当然并非如此,DoReFa-Net的方案在实际应用中仍有其局限性。
DoReFa-Net的这种量化方法虽然简洁,但对于激活值分布范围较广的网络而言,显得不够灵活。为此,研究者提出了改进版——Parameterized Clipping Activation(PACT)。PACT的核心思路是将激活伪量化中的截断阈值alpha设为一个可学习参数,通过梯度下降算法自适应地寻找最优截断点。这样一来,导数被拆分为两部分:小于alpha的区域导数为0,大于等于alpha的区域导数为1,从而打通了整个梯度链路,使得量化训练得以顺利进行。
细看PACT的函数形式,它与ReLU非常相似,都是对大于零的部分施加截断。实际上,PACT的设计初衷正是为了替代ReLU。然而,并非所有模型都采用ReLU作为激活函数。为了让PACT的适用范围更广,PaddlePaddle框架对其进行了进一步改进——对大于零和小于零的激活值均施加相同的截断限制。这一改进的优势在于,在某些场景下能够获得更优的量化范围,从而有效降低量化损失,提升模型精度。
除了PACT,另一种常用的算法是Learned Step Size Quantization(LSQ)。与PACT类似,LSQ也通过训练来确定量化参数;不同之处在于,PACT学习的是截断阈值alpha,而LSQ直接将Scale作为一个可学习参数进行优化。

先看LSQ的计算公式:其中的r_hat代表经过量化与反量化后的数值。这实际上是在对称量化公式的基础上引入了一个scale,完成了一次完整的量化与反量化循环。由于反向传播需要计算梯度,我们需要对该公式求导。在求导环节,LSQ沿用了直通估计的思路,从而得到最终的导数表达式。
这里可以看出:LSQ虽然也采用了直通估计策略,但在截取范围内实际上保留了梯度的计算——梯度并未完全消失。这正是LSQ与纯粹直通估计之间的重要区别,有助于维持训练过程中梯度信息的流动性。
为了让Scale的学习过程更加稳定,LSQ还对其梯度施加了一个缩放系数,该系数主要由张量中的元素数量决定,从而控制参数更新的步长。
既然Scale是可学习参数,就需要给定一个合理的初始值。在PACT中,alpha通常手动设置为常数6;而在LSQ原文中,scale的初始值由张量的L1正则决定。不过在实际工程实践中,更常见的做法是先统计激活分布,通过EMA-minmax、KLD、MSE等PTQ方式计算出一个合适的初始scale值——毕竟,一个好的起点往往能大幅减少后续训练中的调参工作量,加速模型收敛。
审核编辑:xxxxxxxx
