机器学习 (ML ML )中的量化是将 FP32(浮点 32 位)中的数据转换为 INT8(整数 8 位)等较小 欢迎来到雲闪世界。机器学习(ML ML)中的量化是将 FP32(浮点 32 位)中的数据转换为 INT8(整数 8 位)等较小精度的过程,并执行 INT8 中的卷积等所有关键操作,最后将较低精度的输出转换为 FP32 中的更高精度。
这听起来很简单,但你可以想象,将浮点数转换为整数会导致错误,而错误会随着计算而增加,因此保持准确性至关重要。在量化中,准确度在原始准确度的 1% 以内。
在性能方面,由于我们处理的是 8 位而不是 32 位,理论上应该快 4 倍。在实际应用中,速度至少提高了 2 倍。
在本文中,我们将快速介绍 机器学习中量化的基础知识。阅读完本文后,您将能够回答:
- 量化中如何恢复准确度?
- 在 INT8 或 FP32 中进行计算如何得出相同的结果?
我们深入讨论的量化主要主题是:
- 精度较低 ; 量化基础知识 ; 范围映射 ;仿射量化 ;尺度量化 ;量化粒度 ;校准 ;训练后量化 ;权重量化 ;激活量化 ;恢复量化精度 ;部分量化 ;量化感知训练 ;学习量化参数 ;整体量化过程
精度较低
较低精度的数据类型可以是:
- FP32 ;FP16 ;INT32 ;INT16 ;INT8 ;INT4 ;INT1
根据当前的研究状况,我们正在努力保持 INT4 和 INT1 的准确性,而 INT32 和 FP16 的性能提升并不显著。
最受欢迎的选择是:INT8
当我们在特定数据类型(例如 INT8)中进行计算时,我们需要另一个具有数据类型的结构,该结构可以保存结果,以便处理溢出。这称为累积数据类型。对于 FP32,累积是 FP32,但对于 INT8,累积是 INT32。
下表让您了解根据数据类型数据大小的减少和数学能力的增加:
量化基础知识
量化有两个基本操作:
- 量化:将数据转换为较低精度,如 INT8
- 反量化:将数据转换为更高精度,如 FP32
一般来说,量化是该过程中的开始操作,而反量化是最后一个操作。
范围映射
INT8 可以存储从 -128 到 127 的值。一般来说,B 位整数的范围是 -(2^B) 到 (2^B-1)。
在范围映射中,我们必须将范围为 [A1, A2] 的数据转换为 B 位整数(在我们的例子中为 INT8)的范围。
因此,问题是将范围为 [A1, A2] 的所有元素映射到范围 [-(2^B), (2^B-1)]。范围 [A1, A2] 之外的元素将被截断到最近的边界。
量化中的范围映射主要有两种类型:
- 仿射量化
- 尺度量化
对于量化,上述技术主要使用两种类型的映射方程:
F(x) = s.x + z
其中,s、x 和 z 是实数。
该等式的特殊情况是:
F(x) = s.x
s 是比例因子,z 是零点。
仿射量化
在仿射量化中,参数s和z如下:
s = (2^B + 1)/(A1-A2) z = -(ROUND(A2 * s)) - 2^(B-1)
对于 INT8,s 和 z 如下:
s = (255)/(A1-A2) z = -(ROUND(A2 * s)) - 128
使用上述公式转换所有输入数据后,我们将获得量化数据。在此数据中,某些值可能超出范围。为了将其纳入范围,我们需要另一个操作“剪辑”,将所有超出范围的数据映射到范围内。
Clip操作如下:
clip(x, l, u) = x ... if x is within [l, u] clip(x, l, u) = l ... if x < l clip(x, l, u) = u ... if x > u
在上式中,l 是量化范围的下限,而 u 是量化范围的上限。
因此,仿射量化中的量化总体方程为:
x_quantize = quantize(x, b, s, z) = clip(round(s * x + z), −2^(B−1), 2^(B−1) − 1)
对于反量化,仿射量化中的方程为:
x_dequantize = dequantize(x_quantize, s, z) = (x_quantize − z) / s
尺度量化
比例量化与仿射量化的区别在于,在这种情况下,零点 (z) 设置为 0,在方程中不起作用。我们在比例量化的计算中使用比例因子 (s)。
我们使用以下公式:
F(x) = s.x
尺度量化有很多变体,最简单的是对称量化。在这种情况下,结果范围是对称的。对于 INT8,范围将是 [-127, 127]。请注意,我们在计算中没有考虑 -128。
因此,在此我们将量化范围从 [-A1, A1] 到 [-(2^(B-1), 2^(B-1)] 的数据。量化方程将是:
s = (2^(B - 1) − 1) / A1
注意,s 是比例因子。
总体方程为:
x_quantize = quantize(x, B, s) = clip(round(s * x), −2^(B - 1) + 1, 2^(B - 1) − 1)
去量化的方程为:
x_dequantize = dequantize(x_quantize, s) = x_quantize / s
量化粒度
输入数据是多维的,为了量化它,我们可以对整个数据使用相同的比例值和零点,或者这些参数可以对于每个维度的每个一维数据都不同,或者对于每个维度都不同。
对量化和反量化过程的数据进行分组的过程称为量化粒度。
量化粒度的常见选择有:
- 每通道 3D 输入
- 对于二维输入,按行或按列
因此,特定数据(如 3D 输入)的比例值将是比例值向量,其中第 i 个值将是 3D 输入的第 i 个通道的比例值。
校准
量化中的校准是计算输入数据(如权重和激活)的范围 [A1, A2] 的过程。校准主要有三种方法:
- 最大限度
- 熵
- 百分位数
最大值:这是最简单的方法,我们实际上比较输入值以获取范围 A1 和 A2 的最大值和最小值。
熵:使用 KL 散度法选择 A1 和 A2,以最小化原始浮点数据和量化数据之间的误差
百分位数:仅考虑特定百分比的值来计算范围,并忽略可能为异常值的其余百分比大值。在剪切操作期间处理被忽略的值。
训练后量化
训练后量化是在训练期间量化可用数据(如权重)并将其嵌入到预训练模型中的过程。训练后量化有两种类型:
- 权重量化
- 激活量化
权重量化
由于ML模型中的权重不依赖于输入,因此可以在训练期间进行量化。使用批量归一化时,我们需要对每个通道进行量化,否则准确度的损失会很大。
因此,对于权重,最常见的选择是每通道最大校准量化。
激活量化
最大校准确实适用于激活量化,但它是特定于模型的。对于某些模型(如 InceptionV4 和 MobileNet 变体),准确率下降很明显(超过 1%)。
对于激活量化,最佳结果是99.99% 或 99.999% 百分位数校准。确切的百分位数取决于模型。
恢复量化精度
量化中的主要挑战是保持准确性,并且与 FP32 推理过程相比,准确性下降不能超过 1%。
在许多 ML模型中,量化后准确度会大幅下降。在这种情况下,可以采用以下几种技术来恢复量化过程中的准确度:
- 部分量化
- 量化感知训练
- 学习量化参数
部分量化
在部分量化中,其想法是仅对特定机器学习模型中的几层进行量化,而忽略其他层。
我们忽略了那些准确度损失最大且难以使用我们探索的其他技术保持准确度的层。对于这些层,我们进行了 FP32 推理。使用部分量化的一个例子是BERT。
量化感知训练
在量化感知训练中,其理念是在训练之前在图中插入假量化操作,并在微调图时使用它。这样做的好处是,在模型训练和计算权重时,量化因子在优化函数中发挥作用。
这种技术提高了除 ResNeXt101、Mask RCNN 和 GNMT 之外的几乎所有模型的准确率。这是因为微调不会影响运行间变化之外的准确率。
学习量化参数
学习量化参数的想法是在模型训练过程中计算权重时找到量化参数的值,如比例值、零点、范围值等。
由于量化参数与权重相关,因此这可以使大多数模型获得良好的精度。
整体量化过程
整体量化流程如下:
因此,您要在权重为量化形式的预训练图上使用量化。量化知识(如这篇 OPENGENUS 文章中所述)有助于将 FP32 输入转换为量化格式,然后像往常一样执行卷积或 ReLU 等操作并再次量化输出,因为结果数据可能不是量化格式。
通过本文,您对机器学习中的量化有了深入的了解。这是未来,请阅读我们所有的量化文章,以了解这个快速发展的研究领域的最新动态。感谢关注雲闪世界
订阅频道 (https://t.me/awsgoogvps_Host)
TG交流群 (t.me/awsgoogvpsHost)