标量量化入门

2024-07-04 22:36:20 浏览数 (1)

Scalar Quantization 101

标量量化简介

大多数嵌入模型输出的是 float32 向量值。虽然这提供了最高的精度,但对于向量中实际重要的信息来说,这是浪费的。在给定的数据集中,嵌入向量的每个维度都不需要所有 20 亿种可能的值。尤其是在维度较高(如 386 维及以上)的向量中,这种情况更为明显。量化允许以有损的方式对向量进行编码,从而在略微降低精度的同时大大节省空间。

了解标量量化中的桶

标量量化将每个向量维度划分为一些较小的数据类型。在本文中,我们将假设将 float32 值量化为 int8。准确地划分这些值并不是简单地将浮点数值四舍五入到最近的整数。许多模型输出的向量维度在 -1.0, 1.0 范围内连续分布。所以,两个不同的向量值 0.123 和 0.321 都可能被四舍五入到 0。最终,一个向量在 int8 中只会使用 255 个可用桶中的 2 个,失去了太多的信息。

量化示意图量化示意图

图 1:量化目标示意图,将连续值从 -1.0 到 1.0 划分为离散的 int8 值。

数值转换背后的数学并不复杂。由于我们可以计算浮点范围的最小值和最大值,我们可以使用最小-最大规范化 然后线性地转换这些值。

int8 ≈ 127 * (float32 - min) / (max - min)
float32 ≈ (max - min) / 127 * int8 min

图 2:int8float32 之间转换的公式。请注意,这些是有损转换,而不是精确的。在以下示例中,我们仅使用 int8 内的正值。这与 Lucene 的实现保持一致。

标量量化中的统计作用

分位数 是包含一定百分比值的分布切片。例如,99% 的浮点值可能位于 -0.75, 0.86 范围内,而不是 −1.0, 1.0 的真正最小值和最大值。任何小于 -0.75 和大于 0.86 的值都被视为离群值。如果在尝试量化结果时包括离群值,您的大多数常见值将有更少的可用桶。更少的桶可能意味着更低的准确性,从而导致信息丢失。

分位数示意图分位数示意图

图 3:99% 置信区间和各个分位数值的示意图。99% 的所有值都落在 -0.75, 0.86 范围内。

这一切都很好,但是既然我们知道如何量化值,我们实际上如何计算两个量化向量之间的距离呢?这是否与常规的点积一样简单?

标量量化中的代数作用

我们仍然缺少一个重要部分:如何计算两个量化向量之间的距离。尽管在本文中我们没有回避数学问题,但现在我们将进行更多的数学运算。是时候拿出铅笔并试着回忆多项式和基础代数了。

点积和余弦相似性的基本要求是能够将浮点值相乘并将其结果相加。我们已经知道如何在 float32int8 值之间进行转换,那么在我们的转换中,乘法是什么样子的呢?

float32_i * float32_i' ≈ (max - min) / 127 * int8_i min) * ((max - min) / 127 * int8_i' min)

然后我们可以展开这个乘法,并简化为:

α^2 * int8_i * int8_i' α * int8_i * min α * int8_i' * min min^2

其中 α = (max - min) / 127

更有趣的是,这个方程中只有一部分需要同时包含两个值。然而,点积不仅仅是两个浮点数的乘积,而是向量的每个维度的所有浮点数的乘积。拥有向量维度计数 dim 后,以下所有内容都可以在查询时间和存储时间预先计算。

dim * α^2 可以存储为单个浮点值。

∑(min * α * int8_i) 可以预先计算并存储为单个浮点值或在查询时计算一次。

dim * min^2 可以预先计算并存储为单个浮点值。

所有这些加起来:

dim * α^2 * dotProduct(int8, int8') ∑(min * α * int8_i) ∑(min * α * int8_i') dim * min^2

对于点积所需的唯一计算是 dotProduct(int8, int8') ,结合一些预计算值得到结果。

确保量化的准确性

那么,这到底有多准确?量化会导致信息丢失吗?是的,会,但是量化利用了我们不需要所有信息的事实。对于学习到的嵌入模型,各个维度的分布通常没有肥尾分布。这意味着它们是局部的且相对一致的。此外,通过量化引入的每个维度的误差是独立的。也就是说,误差在我们通常的向量运算(如点积)中会相互抵消。

结论

哇,这覆盖了很多内容。但现在你已经对量化的技术优势、背后的数学原理以及如何在考虑线性变换的情况下计算向量之间的距离有了很好的了解。接下来看看我们如何在 Lucene 中实现这一点以及这里所面临的一些独特挑战和好处。

0 人点赞