你好! 解决这一问题,通常有两种方案:基于统计的方法和基于学习的方法。
就与统计的方法: 量化的目标是把 Tensor 中的浮点数通过 scale 参数均匀地映射到 int8 表示的 [-128, 127] 的范围上。既然是均匀映射,那么很容易得到 scale 的计算方法:
def compute_scale(x: Tensor):
xmin, xmax = x.max(), maxv = x.min()
return max(xmin.abs(), xmax.abs()) / 256.0
基于学习的方法: 虽然 round 的梯度为 0,研究者通过实验发现,在该场景下,如果直接设置其梯度为 1 也可以使得模型收敛到预期的精度(这种方法也称作 ‘直通估计器(STE: Straight-Through Estimator )’)。
1. STE 的作用:
在量化感知训练(QAT)中,量化操作(如舍入操作)是不可微的,这意味着它的导数在数学上是未定义的。然而,为了训练模型,我们需要计算梯度并更新权重。STE 的作用就是解决这个问题:
在正向传播时,执行量化操作(如舍入)。
在反向传播时,忽略量化操作的不可微性,直接将上游梯度传递到下游。
通过这种方式,STE 使得量化操作可以无缝地集成到深度学习框架的反向传播过程中。