在深度学习中,模型的参数和激活值通常以浮点数的形式存储在内存中,而嵌入式设备、移动设备等端侧存储空间和计算速度有限。模型量化( Quantization)是一种将深度学习模型中的参数或激活值从浮点数转换为低比特定点数的技术,通过数据存储方式的转换以减少模型的内存占用和计算成本,以较小的精度损失可以显著减少模型的内存和存储占用、降低计算成本。

3.1 整数、定点数与浮点数

在计算机中,整数、定点数、浮点数数据都是以二进制形式存储的。其中整数数据是不包含小数部分的数值类型,在计算机中以二进制补码形式存储。整数数据可以是有符号的(可以表示正数、负数和零)或无符号的(只能表示非负数)。无符号整数中所有位都用来表示数值部分,不包含符号位。例如,一个8位的无符号整数可以表示范围为0到255的整数。而有符号整数中最高位通常用作符号位,0表示正数,1表示负数。其余位表示整数的数值部分。例如,一个8位的有符号整数可以表示范围为-128到+127的整数。
定点数是一种用于表示实数的数值系统,其中小数点的位置是固定的,它们在计算机中以固定的位数表示整数和小数部分。例如有一个8位的定点小数,其中小数点在第4位上。这意味着第1位用来表示符号,第2~4位用于表示整数部分,后面的4位用于表示小数部分(见图)。
未命名文件(19).png
在计算机中,浮点数以二进制形式存储,通常使用IEEE 754标准来定义浮点数的存储方式。该标准定义了单精度浮点数(32位)和双精度浮点数(64位)两种格式。其中,单精度浮点数使用32位(4字节)存储,其中不同部分的位数分配如下:符号位(1位):用于表示数的正负,0表示正数,1表示负数。指数部分(8位):用于表示数的指数部分,以偏置值的形式表示,通常加上127来表示实际指数值。尾数部分(23位):用于表示数的尾数部分,也称为有效位数或尾数,其中包含小数点后面的数字。
未命名文件(20).png

3.2 量化方式

模型量化将浮点数参数或激活值映射到整数或定点数表示,从而实现模型参数和激活值的量化。根据映射函数的性质,可以分为线性量化和非线性量化。
线性量化是一种均匀量化方法,它将连续的浮点数范围线性映射到有限的离散整数值。在这种方法中,每个量化级别之间的间隔是相同的。例如,如果我们使用8位整数(INT8)进行量化,那么量化的范围通常是-128到+127,中间间隔为1。线性量化的公式可以表示为:
image-20240715215047466
其中,𝑅 是原始的浮点值,𝑄是量化后的整数值,𝑆是量化的尺度因子,𝑍是量化的零点(通常是0)。
非线性量化,也称为非均匀量化,是一种量化策略,它允许不同数值区间有不同的量化粒度。这种量化方法对于处理具有非均匀分布数据的模型特别有用,它可以根据数据的统计特性来调整量化的精度。
模型量化根据量化时机可以分为训练后量化(Post-Training Quantization)和量化感知训练(Quantization-Aware Training, QAT)。
训练后量化是一种在模型完成训练后应用的技术,它通过收集模型在推理过程中的统计信息来确定量化参数,然后应用这些参数将模型的权重和激活函数量化为整数格式。这种方法的优点是操作简单,不需要改变原有的训练流程,但它不涉及对模型训练过程的调整,因此可能无法完全补偿量化带来的性能损失。训练后量化通常分为两个步骤:准备(Prepare)和转换(Convert)。首先,通过插入观察者(Observer)来收集量化所需的统计信息。然后,将模型的权重和激活量化到较低的位宽。
量化感知训练是一种在模型训练阶段就引入量化噪声的方法。量化感知训练在模型训练过程中模拟量化操作,允许模型权重在前向传播时被量化,而在反向传播时使用全精度进行更新。在QAT过程中,模型的权重和激活函数在前向传播时会被模拟量化,而在反向传播时则使用全精度的浮点数进行梯度计算。这样可以使模型在训练过程中逐渐适应量化带来的误差,从而在量化后保持更高的精度。QAT的优点在于能够提高量化模型的精度,但缺点是增加了训练的复杂性,并且需要额外的训练时间来完成量化适应。