作者:来自 Elastic John Wagster

现代量化技术在使用较旧模型或不是正态分布的嵌入时会降低召回率。了解预处理如何通过随机正交投影修复这些向量,使 BBQ 更有效并恢复召回率。
从向量搜索到强大的 REST API,Elasticsearch 为开发者提供了最全面的搜索工具包。深入 Elasticsearch Labs 仓库中的示例 notebooks,尝试一些新的内容。你也可以从今天开始免费试用,或者在本地运行 Elasticsearch。
作为一个向量数据库,Elasticsearch 提供了像 Better Binary Quantization( BBQ )这样的全面量化技术。 BBQ 和其他类似的现代量化技术可以将向量压缩到每个维度仅一个比特,从而在保留令人印象深刻的距离近似准确性的同时减少内存使用。对于来自深度学习模型(例如 Cohere 模型)生成的向量来说,这种方法效果很好;然而,对于其他类型的向量,例如图像数据或直方图特征,召回率可能会受到很大影响。预处理通过在量化之前对向量应用随机正交旋转来解决这个问题,将方差均匀地重新分布到各个维度,使每一位都能捕捉有意义的信号,在某些情况下可以将召回率提高接近 75%。
在这里,我们将提供一些关于这个问题以及预处理如何解决它的直观理解。
问题
BBQ 对向量的每个维度独立进行量化:高于均值的值变为 1,低于均值的值变为 0。当每个维度大致携带相同数量的信息时,这种方法效果很好。基于 Transformer 的嵌入通常天然具有这种特性,因此它们的各个维度是能够将方差均匀分布的学习表示。
但现实世界中有很多向量并非如此。考虑一个表示灰度图像的 784 维向量,例如在 Fashion-MNIST 数据集中。图像中心附近的某些像素(也就是衣物实际出现的地方)在整个数据集中变化很大。然而,其他像素(例如靠近角落的像素)大多是单一颜色,几乎没有变化。当 BBQ 对这些向量进行量化时,高方差维度会丢失精度,因为单个比特无法捕捉其范围,而低方差维度则变得毫无用处。最终得到的量化向量对原始向量的近似效果很差,召回率也会下降。
Fashion-MNIST 图像表示的图片。(来源: geeksforgeeks.org )
预处理
为了解决这个问题,我们希望将信息更均匀地分布到各个维度上,使每一位都能捕捉大致相同数量的信息。
预处理在量化之前对每个向量应用线性变换。该变换是一种正交旋转,它会重新分配信息在各个维度之间的分布,同时不会改变向量之间的距离。如果你想深入了解数学原理,可以查看关于带预处理器的优化标量量化( OSQ )的详细分析。
下面的图示有助于说明在应用量化时预处理如何发挥作用。这个简化的二维图展示了正交旋转如何帮助增加信息的分散程度或范围,而这些信息之前是相当压缩的。虽然这个二维动画并不能精确表示预处理,但它很好地直观展示了在更高维空间中大致会发生什么 ------ 在这些空间中,维度的分组会被独立转换,而随机投影可以显著改善分布。可以想象, y 轴表示 Fashion-MNIST 图像角落的一个像素,这些像素主要是单一色调、方差很低;而 x 轴表示图像中心的一个服装像素,其方差非常高。如果没有预处理,将向量量化为单个代表点并不是一个特别好的区分方式。

让我们来看看数据
如今, DiskBBQ 已支持预处理。下面是一个基准测试,展示了在访问向量数据集不同比例时的影响。
| 访问向量比例 | 基线召回率 | 预处理后召回率 | 提升百分比 |
|---|---|---|---|
| 0.5% | 0.45 | 0.77 | 71% |
| 3% | 0.49 | 0.77 | 57% |
| 5% | 0.50 | 0.87 | 74% |
| 10% | 0.55 | 0.91 | 65% |
| [Fashion-MNIST 召回率( 784 维,60K 文档,5x 过采样,k:10 )] |
| 访问向量比例 | 基线召回率 | 预处理后召回率 | 提升百分比 |
|---|---|---|---|
| 0.1% | 0.49 | 0.69 | 41% |
| 0.2% | 0.70 | 0.77 | 10% |
| 0.3% | 0.73 | 0.85 | 16% |
| 0.5% | 0.78 | 0.88 | 13% |
| [GIST(960 维,100 万文档,5x 过采样,k:10)] |
| 访问向量比例 | 基线召回率 | 预处理后召回率 | 提升百分比 |
|---|---|---|---|
| 0.5% | 0.48 | 0.60 | 25% |
| 1% | 0.59 | 0.71 | 20% |
| 3% | 0.71 | 0.87 | 23% |
| 7% | 0.72 | 0.90 | 25% |
| [SIFT(128 维,100 万文档,5x 过采样,k:10)] |
这是一个不错的召回率提升;然而,这种提升是有成本的。对所有嵌入向量盲目应用预处理是不高效的,在查询延迟上会带来约 2--4% 的额外开销,而对于那些本身不需要预处理的数据集来说,召回率也不会有任何提升。在索引阶段,这种方法还会带来高达 20% 以上的额外开销。对于生产环境中一开始召回率较低的场景,你可能需要结合自己的模型和数据集来评估预处理的实际影响。
实现方式如下
预处理已支持在 bbq_disk 索引类型中使用。只需在 index_options 中将 precondition 设置为 true,例如:
bash
`
1. {
2. "mappings": {
3. "properties": {
4. "my_vector": {
5. "type": "dense_vector",
6. "dims": 784,
7. "index_options": {
8. "type": "bbq_disk",
9. "precondition": true
10. }
11. }
12. }
13. }
14. }
`AI写代码
请查看 dense vector mapping 文档以获取更多细节。
结论
BBQ 对深度学习嵌入向量非常有效,但对于在各维度方差分布不均的嵌入(例如特征工程生成的向量)效果可能较差。预处理通过重新分布这些方差,使量化过程更加有效。在某些数据集(例如 Fashion-MNIST)上,我们观察到了高达 74% 的召回率提升!
目前,我们将预处理设为可选项。希望你现在能够更清楚地判断它何时有帮助,并在需要时自行尝试。在未来,我们计划进一步优化性能,并自动检测何时应用预处理。