量化
A White Paper on Neural Network Quantization
- 为什么要量化
为了追求性能,神经网络模型的体量不断增大,这给在边缘设备上部署模型造成了困难。因此需要一些技术使得模型轻量化,加快模型的推理速度和功率消耗。模型量化就是一种非常有效的模型轻量化算法。它主要通过对模型内的权重和激活值参数进行类型转化(比如浮点型转低位整型,或者混合精度等)来加快模型推理速度。但是,这种粗略的量化方式会引入噪声使得模型精度有所下降。
- 主流量化手段
Post-Training Quantization 训练后量化 (PTQ) :需要预训练和标注的数据,因此,它是一种轻量级的按键式的量化方法。在大多数情况下,PTQ可以达到8比特量化,同时精度接近浮点型。
Quantization-Aware Training 量化感知训练 (QAT):需要微调和标注数据,但是可以完成更低位的量化,取得更有竞争力的结果。
模型训练的时候,权重和激活张量通常以16或32位精度的数据类型存储,而模型量化将权重和激活的张量存储在低精度的张量中。当把权重和激活张量从32位转为8位后,存储张量的内存空间缩小4倍,同时矩阵乘法的计算消耗降低14倍。神经网络已被证实,模型量化到较为低位的带宽之后,精度所受到的影响在可接受的范围之内。除此之外,模型量化还经常和其他模型优化的方法一同使用,比如网络架构搜索,模型压缩,模型剪枝等。所以模型量化是深度学习实际落地应用的一个核心步骤。但它也有缺点:低位宽量化会引入噪声到模型中,导致精度下降。尽管一些网络对噪声具有抗干扰性,但是其他网络还需要额外的工作去最大化量化的好处。
PTQ处理的是已经训练好的网络,使用少量数据或者不需要使用数据进行量化,它需要较少的超参数进行调整,并且不用端到端的训练。这使得PTQ不需要太多工程量和计算消耗,并且可以看作一种push-button方法(按钮启动方法,我理解的是在模型训练的时候不需要考虑,模型训练好之后如果需要PTQ就设置添加PTQ,如果不需要就不用添加,类似于想用的时候只需要按一下即可)
QAT依赖于在训练pipeline中使用模拟量化重新训练神经网络。虽然这需要在训练和潜在的超参数调整方面付出更多努力,但与低位量化的 PTQ 相比,它通常会进一步缩小与全精度精度的差距。
模型量化的理论基础
硬件背景
y=ωx+b
大型矩阵之间相乘和卷积操作的基础模块。这样的硬件模块旨在通过并行计算提升神经网络的推理速度。图1中神经网络加速器的两个基本元素:
一般神经网络的训练都是用32位的浮点数表示权重和激活值。如果我们要使用32位的浮点数执行推理,乘法器和加法器必须支持浮点计算逻辑。并且我们需要将 32 位数据从内存传输到乘法器。计算流程和数据传输消耗了神经网络推理过程中花费的大部分能量。 因此,可以通过使用较低位的定点或量化表示来实现。低位定点表示(比如 INT 8)不仅降低了大量的数据传输,也降低了图1中操作的内存和能量消耗。因为数字算术的成本通常与使用的位数成二次线性关系,并且定点加法比浮点加法更快。
为了从浮点转移到高效的定点运算,我们需要一个将浮点向量转换为整数的方案。浮点向量 x 可以近似表示为标量乘以整数值向量:
Sx: 比例因子 scale factor
X_int: 整数数组integer vector
我们将向量的这个量化版本表示为 ̂x。通过量化权重和激活,我们可以写出累积方程的量化版本
均匀仿射量化(非对称量化)
由三个量化参数定义:比例因子 s、零点 z 和位宽 b。
比例因子和零点用于将浮点值映射到整数网格,其大小取决于位宽。
- 比例因子 s 通常表示为浮点数,并指定量化器的步长;
- 零点 z 是一个整数,可确保对实零进行无误差量化。这对于确保零填充或 ReLU 等常见操作不会引起量化误差很重要。
一旦定义了三个量化参数,我们就可以继续进行量化操作。从实值向量 x 开始,我们首先将其映射到无符号网格中,其中b是位宽。
0
,
2
b
−
1
{0, 2^b - 1}
0,2b−1
[]: 是取整运算符
对称均匀量化
Symmetric uniform quantization
对称量化是不对称情况的简化版本。 对称量化器将零点限制为 0。这减少了在不对称量化中的累加操作期间处理零点偏移的计算开销。 但是偏移量的缺乏限制了整数域和浮点域之间的映射。 因此,有符号或无符号整数网格的选择很重要:
无符号对称量化非常适合单尾分布,例如 ReLU 激活(见图 3)。另一方面,可以为大致关于零对称的分布选择有符号对称量化
均匀量化的三种形式(非对称均匀量化,有符号型对称量化,无符号型对称量化)如图3所示:
资料: