量化是解决人工智能扩展问题的一种广泛使用的方法。 这个名字听起来很复杂,但它只是对数字进行四舍五入,以减少它们占用的空间。 这意味着更小的 向量模型 (Embeddings),占用更少的内存和存储空间,并且由于比较向量所需的时间更少,因此信息检索速度更快。 量化是一种纯粹的数值技术,它不关心您的模型处理什么类型的数据或您有什么用例,因此它可以带来改进,而无需大量的昂贵的领域知识。
人们可能认为,量化涉及权衡,而且没有什么是免费的——我们必须牺牲一些精度。 在本文中,我们将向您展示一种通过量化感知训练 (QAT) 使其无损的方法。 这项技术用于 jina-embeddings-v4 中,以提供空间关键型应用所需的小 向量模型 (Embeddings)。
tag 量化技术概述
模型量化通常意味着以下四件事之一:
- 训练后量化(PTQ)
- 量化 向量模型 (Embeddings) 输出训练(Output QAT)
- 完全量化模型训练(Full QAT)
- 从现有非量化模型中提炼出一个新的量化模型
训练后量化(PTQ)接受经过训练的 向量模型 (Embeddings) 模型,并且不以任何方式修改它。 这只是丢弃模型产生的浮点值的最低有效数字的问题。 我们只是对数字进行四舍五入,有时还会将它们缩放到一个范围。
Output QAT 意味着微调 向量模型 (Embeddings) 模型以产生最佳的降低精度向量。 这意味着修改模型,但它不会改变模型权重的精度,因此不会减小其大小。 只是输出向量的大小减小了。
Full QAT 从一个完全训练好的、全精度的模型开始,降低模型权重的精度,然后微调这个修改后的模型的性能。 这会产生一个明显更小的模型以及更小的 向量模型 (Embeddings),但代价是需要进行一些微调。
Distillation 是训练一个新模型以匹配现有模型性能的过程。 这意味着创建一个从头开始设计为量化的新模型,然后使用现有模型生成所需的尽可能多的训练数据来训练它,直到它的性能尽可能接近现有模型。
下表总结了这四种方法的好处:
方法 | 更紧凑的 向量模型 (Embeddings)? | 需要训练? | 模型压缩? | 更快的推理? |
---|---|---|---|---|
PTQ | ✓ | ❌ | ❌ | ❌ |
Output QAT | ✓ | ✓ | ❌ | ❌ |
Full QAT | ✓ | ✓ | ✓ | ✓ |
Distillation | ||||
(到更小的模型) | ✓ | ✓ | ✓ | ✓ |
所有这四种方法都产生更紧凑的 向量模型 (Embeddings),但除了 PTQ 之外,所有方法都需要一些额外的训练,而只有 Full QAT 和 Distillation 产生新的、更快的模型。 Full QAT 和 Distillation 的实施成本要高得多,因为它们比 Output QAT 需要更多的训练。
在本文中,我们只关注 PTQ 和 Output QAT,它们不会改变 向量模型 (Embeddings) 模型的大小或速度。
tag 实验设置
对于这些实验,我们的基线模型是带有检索适配器的 jina-embeddings-v4,它产生 2048 维的 32 位精度浮点 (FP32) 向量。 因此,每个 向量模型 (Embedding) 的大小为 8196 字节,即 8kB。
我们使用来自 NanoBEIR benchmark 套件的查询文档检索基准测试任务研究了几个实验条件。 检索过程使用向量之间的余弦相似度来查找和排序与查询最匹配的文档。
- 基线——没有任何量化的 jina-embeddings-v4 向量模型 (Embedding) 的性能。 这些实验都使用了该模型的测试版本,发布性能略好。
- PTQ——我们量化了输出向量为二进制向量,而没有更改模型。
- Output QAT——我们量化了输出向量,并对检索适配器进行了微调,以提高其在量化条件下的性能。
tag 量化级别

我们试验了四个不同的量化级别。
- 8 位整数——FP32 值被缩减为 -128 到 127 范围内的整数,从而将 向量模型 (Embeddings) 缩小 4 倍至 2048 字节。
- 4 位整数——与 4 位整数相同,但我们映射到 -8 到 7 的范围,将向量大小缩小 8 倍,至 1024 字节。
- 三元量化——所有值都映射到三个值之一:-1、0、1。以最佳方式存储时,这会将每个维度减少到 1.6 位,从而将 向量模型 (Embedding) 的大小大致减少 40 倍至大约 230 字节。
- 二进制量化——我们使用
torch.sign
数据类型将 FP32 标量值转换为一位,该数据类型仅提供两个值,占用一位来存储。 这会将 2048 维 向量模型 (Embedding) 从 8192 字节减少到 128 字节,减少了 64 倍。
tag 缩放
对于二进制量化,量化非常简单:如果向量值大于 0 或为正数,则映射为 1。 否则,它映射为 -1。

对于其他量化方案,我们将值归一化到一个范围,然后四舍五入到量化级别允许的最接近的值。 向量模型 (Embedding) 由 -∞ 和 +∞(或实际上,非常大的正数和负数)之间的比例数字组成。 我们使用两个数字 和 来缩放值以进行量化。
对于三元量化,我们采用每个向量分量 并按如下方式转换它:
- 如果 ≥ ,则 变为 1。
- 如果 ≤ ,则 变为 -1。
- 如果 < < ,则 变为 0。

对于 4 位整数:
- 如果 ≥ ,则 变为 7。
- 如果 ≤ ,则 变为 -8。
- 如果 < < ,则 变为 ,然后四舍五入到最接近的整数。 这会将值缩放到 范围。

对于 8 位整数:
- 如果 ≥ ,则 变为 127。
- 如果 ≤ ,则 变为 -128。
- 如果 < < ,则 变为 ,四舍五入到最接近的整数。 这会将值缩放到 范围。

为了计算 和 ,我们使用了两种方法:
- Min/Max——我们分批处理我们的数据,并且对于每一批,我们识别出最高和最低向量分量,将 设置为最高,将 设置为最低。
- 批量滚动平均——对于每一批,我们计算向量分量的平均值和标准差。 当我们处理所有批次时,我们保持平均值和标准差的移动平均值。 如果 是批次平均值的当前移动平均值,而 是标准差的当前移动平均值,那么对于每个批次:
tag QAT 微调
对于 PTQ 实验,我们按原样使用模型,并使用上述方法量化它产生的 向量模型 (Embeddings)。
对于 Output QAT,我们使用直接传递估计微调模型。 这意味着我们反转量化过程,恢复值的完整精度,然后在计算损失(即误差)之前,然后我们使用该损失指标来微调模型。
在每种情况下,我们都进行了 10,000 步的微调,每 500 步保存一个检查点。 然后,我们保留了在 NanoBEIR 基准测试中得分最高的检查点。
tag非对称量化
PTQ 和 Output QAT 降低了向量模型 (Embeddings)的大小,但没有降低模型大小或推理速度;所有的节省都在于存储的文档向量模型 (Embeddings)的大小和检索速度。
因此,我们测试了量化查询向量和在检索时保持它们不量化这两种情况,因为无论哪种方式,它都不会改变存储的向量模型 (Embeddings)的大小。
tag结果
我们总共测试了九种情况,总结在下表中:
条件名称 | 微调 | 量化级别 | 缩放策略 | 量化查询 |
---|---|---|---|---|
基线 | ❌ | 不适用 | 不适用 | 不适用 |
PTQ Both | ❌ | 二值 | 不适用 | ✓ |
PTQ Docs Only | ❌ | 二值 | 不适用 | ❌ |
QAT Binary | ✓ | 二值 | 不适用 | ✓ |
QAT Binary Docs Only | ✓ | 二值 | 不适用 | ❌ |
QAT Trinary | ✓ | 三值 | 滚动平均 | ✓ |
QAT 4-bits | ✓ | 4-bits | 滚动平均 | ✓ |
QAT 8-bits | ✓ | 8-bits | 滚动平均 | ✓ |
QAT 8-bits Min/Max | ✓ | 8-bits | Min/Max | ✓ |
表 2:实验条件
条件名称 | 平均得分 | 与基线的差异 |
---|---|---|
基线 | 60.10 | 不适用 |
PTQ Binary | 58.33 | -1.78 |
PTQ Binary Docs Only | 59.08 | -1.02 |
QAT Binary | 59.22 | -0.89 |
QAT Binary Docs Only | 60.81 | +0.70 |
QAT Trinary | 59.49 | -0.62 |
QAT 4-bits | 61.73 | +1.62 |
QAT 8-bits | 61.67 | +1.56 |
QAT 8-bits Min/Max | 61.29 | +1.19 |
表 3:每种条件在十二个 NanoBEIR 基准测试中的平均得分(以 % 正确率表示)。
从上表可以看出,为量化进行微调可以提高分数。 PTQ Binary 和 QAT Binary 条件之间的唯一区别是微调,并且分数差异显着。 同样,我们看到 PTQ Binary Docs Only 和 QAT Binary Docs Only 条件之间的分数提高了近 2%,它们的区别仅在于相同的微调。
不出所料,我们还看到分数通常会随着量化程度的降低而提高,4-bit 量化的得分高于三值量化,而三值量化又优于二值量化。 然而,进一步提高到 8-bits 似乎并没有改善任何东西。
我们只在二值情况下测试了保留未量化的查询,但这似乎提高了性能。
最后,我们的测试表明,滚动平均缩放方法优于简单的 min/max 方法。
tag结论
量化对于向量模型 (Embeddings)具有一些重要的操作优势,因为它显着减小了向量模型 (Embeddings)的大小并加速了信息检索。 虽然简单的训练后量化 (PTQ) 在内存和存储方面提供了立竿见影的好处,但我们的实验表明,量化感知训练 (QAT) 显着减轻了不可避免的精度损失。 微调始终产生更好的分数。
量化程度直接影响性能,这符合您对基于降低值精度的方法的预期。 较低程度的量化(例如,4-bit)通常优于较高程度的方法(例如,二值),但令人惊讶的是,8-bit 量化和 4-bit 量化之间的性能没有显着差异。 似乎在达到某个不精确的阈值之前,更大量化和更少量化之间几乎没有区别。
缩放策略也很重要,滚动平均方法显示出优于固定 min/max 方法的结果。 使用相对于数据的缩放值似乎效果更好,值得进一步探索。
量化可以让你以更少的成本从向量模型 (Embeddings)中获得更多。 尽管本文没有探讨量化的所有选项,但它探讨了两种易于访问的选项,它们具有真正的优势。 我们正在努力改进和完善量化策略,以便进一步降低用户的成本,并期望在不久的将来发布对 jina-embeddings-v4 的二值支持。