当前位置: 首页 > news >正文

Elasticsearch:更好的二进制量化(BBQ)对比乘积量化(PQ)

作者:来自 Elastic  Benjamin Trent

为什么我们选择花时间研究更好的二进制量化而不是在 Lucene 和 Elasticsearch 中进行生产量化。

我们一直在逐步使 Elasticsearch 和 Lucene 的向量搜索变得更快、更实惠。我们的主要重点不仅是通过 SIMD 提高搜索速度,而且还通过标量量化降低成本。首先是 4 倍,然后是 8 倍。然而,这还不够。通过乘积量化(Product Quantization 简称 PQ)等技术,可以在不显著降低召回率的情况下实现 32 倍的减少。我们需要实现更高级别的量化,以在速度和成本之间提供足够的权衡。

一种实现这一目标的方法是专注于 PQ(乘积量化)。另一种则是直接改进二值量化。剧透如下:

  • BBQ 的向量量化速度比 PQ 快 10-50 倍
  • BBQ 的查询速度比 PQ 快 2-4 倍
  • BBQ 的召回率与 PQ 相当或更好

那么,我们到底测试了什么?结果如何?

我们到底要测试什么?

从理论上讲,PQ 和 Better Binary Quantization(BBQ) 都有各种优缺点。但我们需要一套静态的标准来测试两者。拥有一个独立的 “优点和缺点(pros & cons)” 列表是一种过于定性的衡量标准。当然,事物有不同的好处,但我们希望有一套定量的标准来帮助我们做出决策。这遵循了类似于 Rich Hickey 解释的决策矩阵的模式。

我们的标准是:

  • 搜索速度
  • 索引速度平稳
  • 使用 HNSW 的索引速度
  • 合并速度
  • 内存减少可能
  • 该算法是否众所周知并在生产环境中经过实战测试?
  • 粗粒度聚类是否绝对必要?或者,该算法如何公平地只使用一个质心
  • 需要强力(brute force)过采样才能实现 95% 的召回率
  • HNSW 索引仍然有效,并且可以在与强力类似的重新排序下实现 +90% 的召回率

显然,几乎所有标准都是可衡量的,我们确实有一个我们认为重要的定性标准。对于未来的可支持性,成为一种众所周知的算法很重要,如果所有其他措施都与之相关,这可能是决策的转折点。

我们如何测试它?

Lucene 和 Elasticsearch 都是用 Java 编写的,因此我们直接用 Java 编写了两个概念证明。这样,我们就可以在性能上进行同类比较。另外,在进行乘积量化(Product Quantization, PQ)时,我们仅测试了最高 32 倍的空间压缩。虽然 PQ 可以通过减少码本数量(code books)进一步压缩空间,但我们发现对于许多模型来说,召回率会迅速下降到不可接受的水平,从而需要更高比例的过采样。

此外,由于优化 PQ(Optimized PQ)对计算资源要求较高,我们没有采用这种技术。

我们测试了不同的数据集和相似性指标。特别是:

  • e5Small,它只有 384 个维度,与其他模型相比,它的向量空间相当窄。你可以在我们的位向量博客中看到 e5small 的简单二进制量化表现有多差。因此,我们希望确保二进制量化的演变能够处理这样的模型。
  • Cohere 的 v3 模型,它有 1024 个维度,并且喜欢被量化。如果量化方法不适用于此方法,那么它可能不适用于任何模型。
  • Cohere 的 v2 模型有 768 个维度,其出色的性能依赖于最大内积的非欧几里得向量空间。我们希望确保它能够像乘积量化一样处理非欧几里得空间。

我们在基于 ARM 的 MacBook 上进行了本地测试,并在更大的 x86 机器上进行了远程测试,以确保无论 CPU 架构如何,我们发现的任何性能差异都是可重复的。

那么,结果如何呢?

e5small quora

这是一个较小的数据集,使用 e5small 构建了 522k 个向量。它的维度很少,嵌入空间很窄,因此无法与简单的二进制量化一起使用。由于 BBQ 是二进制量化的演变,因此验证它与 PQ 相比在如此不利的模型下是否有效非常重要。

在 M1 Max ARM 笔记本电脑上测试:

Algorithmquantization build time (ms)brute-force latency (ms)brute-force recall @ 10:50hnsw build time (ms)hnsw recall @ 10:100hnsw latency (ms)
BBQ10411199%10481796%0.25
Product Quantization593972099%23966096%0.45

CohereV3

此模型在量化方面表现出色。我们希望在单个粗粒度质心中处理更多向量(30M),以确保我们的小规模结果实际上可以转化为更多向量。

此测试是在 Google Cloud 中一台更大的 x86 机器上进行的:

Algorithmquantization build time (ms)brute-force latency (ms)brute-force recall @ 10:50hnsw build time (ms)hnsw recall @ 10:100hnsw latency (ms)
BBQ998363177698%4004322990%0.6
Product Quantization13116553579098%N/AN/AN/A

当谈到类似召回率的索引和搜索速度时,BBQ 显然是赢家。

内积搜索和 BBQ

我们在其他实验中注意到,在量化时,非欧几里得搜索可能很难准确实现。此外,简单的二值量化对向量的大小不敏感,而向量大小对于内积计算至关重要。

带着这个需要注意的点(脚注),我们花了几天时间研究代数,调整查询估算最后阶段的校正措施。结果是:成功了!

Algorithmrecall 10:10recall 10:20recall 10:30recall 10:40recall 10:50recall 10:100
BBQ71%87%93%95%96%99%
Product Quantization65%84%90%93%95%98%

就这样,圆满结束!

BBQ 与乘积量化的完整决策矩阵。

我们对更优二值量化(Better Binary Quantization, BBQ)感到非常兴奋!经过大量的尝试和验证,我们不断被其结果质量所惊艳 —— 每个向量维度仅保留 1 位信息就能达到如此效果。

敬请期待,它将在未来的 Elasticsearch 版本中与你见面!

Elasticsearch 包含许多新功能,助您构建适合各种场景的最佳搜索解决方案。欢迎查看我们的示例笔记本以了解更多,开启免费的云端试用,或在本地机器上体验 Elastic 的强大功能。

原文:Better Binary Quantization vs. Product Quantization - Search Labs

相关文章:

Elasticsearch:更好的二进制量化(BBQ)对比乘积量化(PQ)

作者:来自 Elastic Benjamin Trent 为什么我们选择花时间研究更好的二进制量化而不是在 Lucene 和 Elasticsearch 中进行生产量化。 我们一直在逐步使 Elasticsearch 和 Lucene 的向量搜索变得更快、更实惠。我们的主要重点不仅是通过 SIMD 提高搜索速度&#xff0…...

【GNU】gcc -g编译选项 -g0 -g1 -g2 -g3 -gdwarf

1、gcc -g的作用 GCC 的 -g 选项用于在编译时生成调试信息,这些信息会嵌入到生成的目标文件或可执行文件中,主要目的是为了支持调试器(如 gdb)对程序的调试工作。 1.1 生成调试信息 当你在编译代码时使用 -g 选项,GCC…...

MySQL【六】

存储过程 存储过程是一组为了完成特定功能的 SQL 语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。 简单的说存储过程就是具有名字的一段代码。 存储过程的创建 CREATE PROC[ED…...

杰发科技AC7801——ADC定时器触发的简单使用

使用场景 在需要多次采样结果的情况下,比如1s需要10w次的采样结果,可以考虑使用定时器触发采样,定时器设置多少的时间就会多久采样转换一次。 再加上使用dma,采样的结果直接放在dma的数组里面。 实现了自动采样,自动…...

VTK知识学习(8)-坐标系统

1、概述 计算机图形学里常用的坐标系统有4种: 1)、Model坐标系统。定义模型时所采用的坐标系统,通常是局部的笛卡儿坐标系。 2)、World坐标系统。是放置Actor的三维空间坐标系。 Actor(vtkActor类&am…...

IO流部分串讲

一、IO流的概念简析: java将输入与输出比喻为"流",英文:Stream. 就像生活中的"电流","水流"一样,它是以同一个方向顺序移动的过程.只不过这里流动的是字节(2进制数据).所以在IO中有输入流和输出流之分,我们理解他们是连接…...

Excel——宏教程(2)

Excel——宏教程(2) 一)、处理单元格 1、直接赋值与引用 将变量、常量值直接赋给单元格、或将单元格的值直接赋给变量、常量,这是在excel中最简单的单元格赋值及引用方法。 如下例将工作表"Sheet1"A1单元格的值赋给Integer变量I,并将I1的值…...

unity 中 RectTransform 的常用几个属性

RectTransform rectTransform this.GetComponent<RectTransform>(); rectTransform this.transform as RectTransform; Vector3 vector1 rectTransform.position; //自身轴心点相对于锚点的位置&#xff08;编译器显示的pos&#xff09; …...

项目-摄像

树莓派摄像头使用方法 Camera教程 https://www.raspi.cc/index.php?cread&id53&page1 nanopc-t4 ​https://www.raspi.cc/index.php?cread&id53&page1 摄像头型号 Raspberry Pi Camera Rev 1.3 检测故障 dmesg | grep -i mipi piNanoPC-T4:~$ dmesg | …...

摄像机ISP和DSP的区别?

影像处理器是现代数字相机、手机等电子设备中极其重要的一部分&#xff0c;它能够对传感器采集的图像进行多种操作&#xff0c;从而得到更高质量的图像。常见的两种影像处理芯片有ISP&#xff08;Image Signal Processor&#xff09;和DSP&#xff08;Digital Signal Processor…...

Ubuntu24安装配置NDK

1、下载NDK 下载压缩包&#xff0c;下载地址如下&#xff0c;建议下载LTS支持版本。 https://developer.android.google.cn/ndk/downloads?hlcs 2、解压缩 将NDK解压到指定文件夹。如&#xff1a;/opt 或者先解压&#xff0c;再移动到指定目录下。 3、配置环境变量 找到…...

【Next】中间件

概述 Next.js 的 中间件 (Middleware) 是一种在请求完成之前运行的函数&#xff0c;用于对入站请求进行处理和操作。它可以在路由匹配前执行逻辑&#xff0c;用于身份验证、请求重写、重定向、设置响应头等任务。 使用场景 身份验证&#xff1a;在用户访问页面前检查登录状态…...

Vulnhub靶场案例渗透[11]- Momentum2

文章目录 一、靶场搭建1. 靶场描述2. 下载靶机环境3. 靶场搭建 二、渗透靶场1. 确定靶机IP2. 探测靶场开放端口及对应服务3. 扫描网络目录结构4. 代码审计5. 反弹shell6. 提权 一、靶场搭建 1. 靶场描述 - Difficulty : medium - Keywords : curl, bash, code reviewThis wor…...

STM32设计防丢防摔智能行李箱-分享

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着科技的不断发展&#xff0c;嵌入式系统、物联网技术、智能设备…...

Vue Mixin混入机制

在 Vue.js 中&#xff0c;Mixin&#xff08;混入&#xff09;是一种可复用代码的机制&#xff0c;用于在多个组件之间共享逻辑。通过混入&#xff0c;可以将通用功能提取到一个独立的文件中&#xff0c;然后在组件中引入并使用&#xff0c;而无需重复代码。 基本概念 Mixin 是…...

数据库类型建表

接着上次的数据库笔记&#xff1a; 初始数据库 &#xff08;是博主自己写的&#xff09; 1.数据库类型 1.1数值类型 数据类型大小说明对应JAVA类型BIT[(M)]M指定位数&#xff0c;默认值为1二进制数&#xff0c;M的范围从1—64&#xff0c;存储数值范围从0—2^M-1常用Bool…...

iOS 18 导航栏插入动画会导致背景短暂变白的解决

问题现象 在最新的 iOS 18 系统中,如果我们执行导航栏的插入动画,可能会造成导航栏背景短暂地变为白色: 如上图所示:我们分别向主视图和 Sheet 弹出视图的导航栏插入了消息,并应用了动画效果。可以看到,前者的导航栏背景会在消息插入那一霎那“变白”,而后者则没有任何…...

深度学习之人脸检测

在目标检测领域可以划分为了人脸检测与通用目标检测&#xff0c;往往人脸这方面会有专门的算法&#xff08;包括人脸检测、人脸识别、人脸其他属性的识别等等&#xff09;&#xff0c;并且和通用目标检测&#xff08;识别&#xff09;会有一定的差别&#xff0c;着主要来源于人…...

解决前后端发版本时候,手动清除浏览器缓存

在.html页面中添加标签 后端配置nginx,让index.html不缓存 location /index.html { add_header Cache-Control “no-cache, no-store”; }在vite.config.ts中添加 rollupOpyions: { output: { // 输出编译后的文件名称&#xff1a;【文件名称.时间戳】、【文件名称.版本号.…...

mysql8.4+mysql router读写分离

以下为容器环境内搭建 准备工作: 拉取镜像: 镜像版本mysql8.4container-registry.oracle.com/mysql/community-router8.4 下载mysql_shell mysql-shell-9.0.1-linux-glibc2.17-x86-64bit.tar.gz 下载地址: https://downloads.mysql.com/archives/shell/ 参考 这里对这篇文章…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...