什么是量化?
量化(Quantization)是一种在计算机科学和深度学习中广泛应用的技术,其基本目标是通过减少模型中数值表示的位宽来降低计算和存储成本。简单来说,量化就是将高精度(通常是浮点数)转换为低精度(通常是定点数)表示,同时尽量保持模型的性能和准确性。
量化通常用于深度学习模型(尤其是大模型)中,以减小模型的存储空间和提高推理速度。量化不仅可以减少模型的内存占用,还能提高硬件的计算效率,尤其是在低功耗设备(如移动端、嵌入式系统、边缘计算设备)上。
定点表示(Fixed-Point Representation)
定点表示是将数字表示为整数,且在数字的整数部分和小数部分之间有一个固定的分界点。也就是说,定点数有固定的精度和范围,数字的小数部分的位数是事先定义的,不会动态变化。
结构:
定点数的表示形式可以看作是一个整数,通过乘上一个固定的缩放因子来表示小数。例如,一个定点数可以用两个部分表示:
- 整数部分:用于表示数字的整数部分
- 小数部分:表示小数部分,通常通过预定的比例因子来控制精度(例如,乘以 2 k 2^k 2k 来得到小数部分)
举例:
假设我们选择一个8位的定点数,其中3位表示整数部分,5位表示小数部分。
数字 3.25
会被表示为
3.25
×
2
5
=
104
3.25 \times 2^5 = 104
3.25×25=104,然后存储为整数104。在计算过程中,每次使用这个定点数时,会用一个固定的因子(如
2
5
2^5
25)来转换为小数。
优点:
- 计算效率高:定点数的加减乘除操作比浮点数简单且快速,因为它们可以使用整数运算。
- 存储效率高:定点数在存储上比浮点数节省空间,因为没有存储指数部分,所有的数字都用固定的位宽表示。
- 确定性:定点表示在每次运算中使用相同的精度和范围,没有浮动。
缺点:
- 灵活性差:定点数的精度和表示范围是固定的,不能动态调整。在表示非常大或非常小的数字时可能会失去精度。
- 精度限制:小数部分的精度是有限的,如果数字超出了预定的表示范围或需要更高精度,可能会发生溢出或精度丢失。
浮点表示(Floating-Point Representation)
浮点表示是一种更灵活的数字表示方式,它通过使用科学记数法的形式来表示数字,通常由三个部分组成:
- 符号位(Sign bit):表示数字的正负
- 指数部分(Exponent):表示数值的数量级
- 尾数部分(Mantissa 或 Fraction):表示数字的有效位,确定数字的精度
结构:
浮点数的标准形式是:
( − 1 ) s × m × b e (-1)^s \times m \times b^e (−1)s×m×be
其中:
- s s s 是符号位(0表示正数,1表示负数)
- m m m 是尾数(也称为有效数字或分数)
- b b b 是基数(通常为2)
- e e e 是指数,用来表示数字的范围
举例:
假设我们有一个32位的浮点数表示(符合IEEE 754标准),其组成如下:
- 1位符号位
- 8位指数
- 23位尾数
对于数字 3.25
,可以表示为:
3.25 = 1.625 × 2 1 3.25 = 1.625 \times 2^1 3.25=1.625×21
其中,符号位是0(正数),指数是1,尾数是1.625。根据IEEE 754规范,尾数会进行标准化,并存储为一个二进制数。
优点:
- 表示范围大:浮点数可以表示非常大或非常小的数,动态范围非常广泛。
- 精度灵活:浮点数通过动态调整指数部分,可以在需要时增加或减少精度。
- 适应性强:可以处理各种规模的数据,特别是需要高精度或者需要表示大范围数值的场景,如科学计算和机器学习。
缺点:
- 计算成本高:浮点数的运算比定点数复杂,需要额外的硬件支持(如浮点运算单元)来处理指数和尾数部分。
- 存储空间大:浮点数需要存储指数和尾数,相比定点数,它们需要更多的存储空间(如32位或64位)。
- 可能存在精度问题:浮点数在计算时可能会因为舍入误差而引入精度丢失,尤其是在处理非常小或非常大的数字时。
两者的区别
特征 | 定点表示(Fixed-Point) | 浮点表示(Floating-Point) |
---|---|---|
表示范围 | 受限于固定的小数位数,适用于较小的数字范围。 | 表示范围非常大,可以表示极大或极小的数字。 |
精度 | 小数位数固定,精度在表示过程中不可调整。 | 精度可以根据需要进行调整,动态范围灵活。 |
计算速度 | 计算速度快,适合硬件实现。 | 计算较慢,涉及指数运算,硬件成本较高。 |
存储需求 | 存储效率高,数据量小,适合资源受限的环境。 | 存储开销大,尤其是高精度浮点数(如64位)。 |
硬件支持 | 易于在低功耗、低资源的硬件上实现(如嵌入式设备)。 | 浮点硬件支持较为复杂,且功耗较高。 |
应用场景 | 适用于对精度要求不高且对性能和存储有严格要求的场景,如嵌入式系统。 | 适用于对计算精度要求较高、范围广的科学计算、机器学习等场景。 |
量化的过程
量化的过程可以细分为几个重要步骤,其中 范围选择、精度设置 和 量化函数 是关键环节。以下是这三个步骤的详细说明:
1. 范围选择(Range Selection)
范围选择是量化过程中的第一步,决定了要将浮点数值映射到什么样的定点数范围。选择合适的量化范围至关重要,因为它直接影响量化后模型的精度和性能。
步骤:
- 收集统计数据:首先需要对待量化的变量(如权重或激活)的值进行统计,通常使用训练数据或者校准数据(如果是量化感知训练或后训练量化)来计算。
- 最大值和最小值:确定数据的最大值和最小值是选择量化范围的关键。如果使用对称量化,最大值和最小值的绝对值相同;如果使用非对称量化,最大值和最小值可以不对称。
选择量化范围:
- 对称量化:对于对称量化,量化范围通常是围绕0对称的。例如,如果最大值是+3.5,最小值是-3.5,量化范围就是从-3.5到+3.5。
- 非对称量化:如果量化范围不对称,可以选择分别计算最大值和最小值。例如,最大值为+5,最小值为0,那么量化范围就是从0到+5。
- 动态范围选择:在某些情况下,量化范围是动态选择的。例如,随着训练的进行,模型的参数可能发生变化,这时需要动态地调整量化范围。
影响因素:
- 数据的分布:数据是对称的还是偏态分布?偏态分布时,非对称量化可能更合适。
- 精度要求:量化范围的选择会影响到数值的表示精度,过小的范围可能导致溢出,过大的范围可能浪费存储。
2. 精度设置(Precision Setting)
精度设置决定了量化后数值的位宽,即每个数值使用多少位来表示。这一步骤决定了量化的精度和计算效率,涉及以下几个方面:
步骤:
-
选择位宽:量化位宽是量化过程中最关键的参数,通常以比特数(bit)来表示。常见的量化位宽有8-bit、4-bit、2-bit等。选择位宽时需要权衡存储和精度。
- 8-bit量化:广泛用于神经网络,通常能在存储和计算效率之间取得较好的平衡。
- 低位宽量化:对于嵌入式设备或其他资源有限的硬件,可能需要4-bit、2-bit或甚至1-bit量化来提高效率。
-
选择量化精度:
- 权重量化:模型权重的量化,通常较为精确,因为它们是固定的,并且在整个推理过程中保持不变。
- 激活量化:激活量化通常较为复杂,因为激活值在每次前向传播时都会变化,量化过程中需要动态考虑输入数据的分布。
-
选择适合的量化位宽:
- 低位宽量化(例如4-bit或2-bit)通常需要更多的调优和实验,以确保精度损失最小。
- 高位宽量化(例如16-bit或32-bit)通常保持较高的精度,但计算效率的提升较低。
影响因素:
- 存储限制:存储空间有限时,较低的位宽可以显著减少存储占用。
- 计算效率:较低的位宽能够加速计算,尤其是在硬件上执行时,低位宽能够显著提高推理速度。
- 精度要求:较低的位宽可能导致精度损失,因此需要确保精度损失在可接受的范围内。
3. 量化函数(Quantization Function)
量化函数是将浮点数转换为低精度整数的实际数学操作。量化函数的目标是根据所选范围和精度,将浮点数转换为定点数(整数),并尽量保留模型性能。
步骤:
量化函数可以通过以下几个步骤实现:
-
计算量化步长(Quantization Scale):量化步长是量化过程中最重要的参数,它表示每个整数步长所代表的浮动量。对于对称和非对称量化,步长的计算方式不同。
计算公式(对于非对称量化):
step size = max − min 2 b − 1 \text{step size} = \frac{\text{max} - \text{min}}{2^b - 1} step size=2b−1max−min
其中, b b b 是量化位宽, max \text{max} max 和 min \text{min} min 分别是待量化数据的最大值和最小值。
对于对称量化,步长的计算方式类似,但因为范围对称,计算起来可能更简单。
-
量化操作(Quantization Operation):将浮点数转换为定点数的过程,可以通过以下公式实现:
q ( x ) = round ( x − min step size ) q(x) = \text{round}\left(\frac{x - \text{min}}{\text{step size}}\right) q(x)=round(step sizex−min)
其中, x x x 是浮点数, min \text{min} min 是量化范围的最小值, step size \text{step size} step size 是量化步长, round \text{round} round 是四舍五入操作。
-
还原操作(Dequantization):量化后,定点数(整数)需要通过一定的公式还原成浮点数,才能用于推理。还原公式为:
x ^ = q ( x ) × step size + min \hat{x} = q(x) \times \text{step size} + \text{min} x^=q(x)×step size+min
其中, q ( x ) q(x) q(x) 是量化后的整数, x ^ \hat{x} x^ 是还原后的浮点数。
举例:
假设我们有一个浮点数 x = 3.25 x = 3.25 x=3.25,量化范围为 [0, 10],量化步长为 0.1(10个离散值,位宽为4位),那么:
量化后的整数值为:
q ( 3.25 ) = round ( 3.25 − 0 0.1 ) = round ( 32.5 ) = 33 q(3.25) = \text{round}\left(\frac{3.25 - 0}{0.1}\right) = \text{round}(32.5) = 33 q(3.25)=round(0.13.25−0)=round(32.5)=33
还原回浮点数时,得到:
x ^ = 33 × 0.1 + 0 = 3.3 \hat{x} = 33 \times 0.1 + 0 = 3.3 x^=33×0.1+0=3.3
量化后结果是3.3,相比原始浮点数3.25有一定误差。
影响因素:
- 量化函数的选择:量化函数的选择(例如,舍入方法)会直接影响量化后精度的损失。
- 精度与性能平衡:选择不同的量化步长和舍入策略会影响最终模型的推理性能和存储效率。
总结
量化的过程包括三个主要步骤:
- 范围选择:确定量化数据的最小值和最大值,从而决定数据的量化范围。
- 精度设置:选择适当的量化位宽,决定量化后的精度(即每个量化数值使用多少位表示)。
- 量化函数:使用适当的数学操作(如步长计算和舍入)将浮点数转换为低精度整数,并执行还原操作以确保数值的恢复。
通过这些步骤,可以将浮点数值高效地转换为定点数,从而减少模型存储需求、加速推理过程,同时尽量保留模型的准确性。
标签:浮点数,-----,定点数,量化,十四,3.25,精度,范围 From: https://blog.csdn.net/red_guy/article/details/143511161