背景 目前神经网络在许多前沿领域的应用取得了较大进展,但经常会带来很高的计算成本,对内存带宽和算力要求高。另外降低神经网络的功率和时延在现代网络集成到边缘设备时也极其关键,在这些场景中模型推理具有严格的功率和计算要求。神经网络量化是解决上述问题有效方法之一,但是模型量化技术的应用会给模型带来额外噪音,从而导致精度下降,因此工程师对模型量化过程的理解有益于提高部署模型的精度。
目录
1.2 Uniform Affine Quantizer(非对称量化)
1.3 Uniform symmetric quantizer(对称量化)
1. 量化基础知识
1.1 量化理论
量化实际上就是把高位宽表示的权值和激活值用更低位宽来表示。定点运算指令比浮点运算指令在单位时间内能处理更多数据,同时,量化后的模型可以减少存储空间。假设一次浮点运算为:

(1)
为了从浮点运算转移到高效的定点运算,我们需要一种将浮点向量转换为整数的方案。浮点向量x可以近似表示为标量乘以整数值向量:

(2)
其中,sx是浮点比例因子,xint是整数向量,例如INT8。我们将向量的量化版本表示为x'。通过量化权重和激活,我们可以写出公式(1)的量化版本:

(3)
请注意,对权重和激活分别使用单独的比例因子sx和sw。这提供了灵活性并减少了量化误差。由于每个比例因子应用于整个张量,因此该方案允许将比例因子从等式(3)中的累加中分离出来,并以定点格式执行MAC操作。现在有意忽略偏置量化,因为偏置通常存储在较高的比特宽度(32比特)中,其比例因子取决于权重和激活的比例因子。一般来说,偏置的比例因子为权重和激活的比例因子的乘积,这样做的好处是可以把sx和sw作为一个公因项提取出来,如下面的公式所示:

(4)
从以上的阐述不难看出,如何求比例因子是关键所在。
1.2 Uniform Affine Quantizer(非对称量化)
非对称量化由三个量化参数定义:比例因子s、零点z和比特宽度b。比例因子和零点用于将浮点值映射到整数网格,其size取决于比特宽度。比例因子通常表示为浮点数,并指定量化器的步长。零点是一个整数,确保实零(real zero)被量化而没有误差。这对于确保诸如零填充或ReLU之类的常见操作不会引起量化误差非常重要。
下图是一个uint8非对称量化的映射过程:

首先,量化前要计算比例因子,包括步长和零点两个量化参数。比例因子就是用来保证浮点区间内的变量都能无一缺漏的映射到要量化bit数的取值区间内。其中,步长和零点的计算公式如下:

(5)
这里要重点说下零点z,也叫做偏移,为何这里需要零点?实际上,浮点型的0会映射到零点,这个零点是一个整型数,用来确保0没有量化误差。具体就是,0有特殊意义,比如padding时,0值也是参与计算的,浮点型的0进行8bit量化后还是0就不对了,所以加上这个零点后,浮点型0就会被映射到0-255这个区间内的一个数,这样的量化就更精确。就相当于让映射后区间整体偏移,浮点最小值对应0。计算完量化因子,再从浮点区间任取一值的量化过程,

(6)
其中clamp用于将超出范围的值截断,因为xint有可能溢出。反量化时的公式为:

(7)
接下来我们模拟一层卷积定点运算过程,图1中表示了卷积层的定点量化计算过程。计算过程中 biases(b)、weight(w)、input(x) 和output(y) 全部为定点格式。计算公式如下:
y = Clamp(Round([(x-x_z)*s_x*(w-w_z)* s_w +(s_x*s_w)*(b-b_z)]/s_y))
红色部分是对输入进行反量化为浮点型,蓝色部分对权重进行反量化为浮点型,绿色部分对偏置反量化为浮点型,橙色部分对输出重量化为INT8类型,该式子还可以展开写出来,但是也可以看出来这一系列计算可能比浮点计算还要复杂。

图1 卷积层的定点量化计算过程
1.3 Uniform symmetric quantizer(对称量化)
对称量化是非对称量化的简化版本,即对称量化就是非对称量化中z=0的情况,下图是一个INT8对称量化的映射过程:

因此对称量化的公式为:

(8)
对称量化的反量化为:

(9)
如图1中使用对称量化的公式为:
y = Clamp(Round([(scale_x*x)*(scale_weight*w)+(scale_x*scale_w)*b]/scale_y))
= Clamp(Round( (x*w+b)*(scale_x*scale_w)/scale_y))
= Clamp(Round( (x*w+b)*scale))
红色部分是对输入进行反量化为浮点型,蓝色部分对权重进行反量化为浮点型,绿色部分对偏置反量化为浮点型,橙色部分对输出重量化为INT8类型,紫色部分可以提前计算好。然而scale还是一个浮点值,对于一些不支持浮点计算的硬件平台来说,可以将scale转成定点:

(10)
其中N和P都是整数,可以通过统计得出误差最小的N和P,这样上面的式子就可以表示为:
y= Clamp( Round( (x*w+b)*P>>N ) )
更进一步的,公式(10)可以修改为:

(11)
那么上面的式子就可以更加精简:
y= Clamp( Round( (x*w+b)>>N ) )
这种方式会带来更大的误差,这就需要后面提到的QAT来恢复精度。
2. 比例因子如何求得
比例因子可以利用一些标准来决定。前文中的量化参数是根据浮点值的最大最小值计算出,这种计算比例因子实际是有问题的,这种属于不饱和的线性量化,会导致精度损失较大。

图2.左图不饱和量化,右图饱和量化

文章详细介绍了神经网络量化的基础知识,包括量化理论、非对称量化与对称量化,以及比例因子的求解方法。量化是为了解决计算成本和功耗问题,但可能导致精度下降。非对称量化通过比例因子和零点确保零值映射无误,对称量化简化了这一过程。比例因子的计算涉及量化策略,如饱和量化和不饱和量化。训练后量化(PTQ)和量化感知训练(QAT)是两种常见的量化方法,QAT能在训练过程中保持较高精度。文章还讨论了量化不适用的情况和问题,以及如何处理这些问题。
最低0.47元/天 解锁文章
1203

被折叠的 条评论
为什么被折叠?



