PQ以及有关索引的笔记Faiss: The Missing Manual

参考Faiss

索引结构总结:

各种方法的对比
为了加深记忆,介绍一下Inverted File Index(IVF)的名字由来:
IVF索引的名字源自“倒排文件”(Inverted File)的概念。在传统的信息检索中,倒排文件是一种索引结构,用于记录每个词汇和文档之间的关系,从而快速定位包含特定词汇的文档。
“倒排”是相对于文档顺序的“正排”而言的。在传统的信息检索中,文档是按照其自然顺序存储的,称为“正排文件”(Forward File)。在这种结构中,每个文档包含的信息是完整的,比如文档的内容以及可能包含的所有词汇。如果需要搜索某个词汇,系统就需要遍历所有文档,逐个检查是否包含这个词汇,这样效率会非常低。

而“倒排文件”(Inverted File)则是通过将词汇和文档之间的关系“倒转”过来实现的。它先建立一个词汇表(词典),然后为每个词汇记录它所出现的文档编号或位置。这样,当查询某个词汇时,系统可以直接通过倒排文件快速定位到包含该词汇的文档,而不需要逐一扫描所有文档。这种方法显著提高了检索速度。

在向量相似性搜索中,IVF索引借用了这种倒排结构的思想,但将其应用于向量空间。数据集的向量被划分到多个“簇”(clusters)或“细胞”(cells)中。这些簇是通过对向量进行聚类(Clustering)创建的,每个簇有一个中心点(Centroid)。查询向量(Query Vector)通过与中心点的比较确定属于哪个簇,然后搜索范围限制在该簇或多个簇中。这种方法减少了搜索范围,提高了搜索效率。

PQ(Product Quantization)

名字的由来

Product(产品、乘积)一词的核心意义在于:

  • 向量的整体量化是多个子空间量化的“乘积”,通过将整体问题分解成多个子问题,从而减少计算复杂性(所以这里product有点类似“分解”的意思)。
  • 通过将一个高维向量拆分为多个子向量,并分别对这些子向量进行量化,最终的编码可以看作这些独立量化的“笛卡尔乘积”。

“Quantization”:指的是“量化”过程。量化的目的是用有限的质心(centroids)来近似表示连续向量空间,从而大幅降低存储和计算成本。

“Product Quantization”表达了该技术的核心思想:通过对向量进行分解(product)和量化(quantization)以高效处理大型数据集。这种方法在保持精确性的同时显著减少了存储需求和计算开销。

如何做查询

如何构建参看上述Faiss链接
已知构建好后数据集中的data都可以表示为质心ID。

查询方法一:

  1. 查询向量量化:查询向量同样被分割为子向量,并映射到其各自子空间的最近质心,这使得查询向量也可以被表示为一组质心ID。
  2. 计算距离:系统利用这些质心的编码信息来快速计算查询向量与数据库中存储向量之间的距离。由于向量被量化到有限的质心集合,这种计算变得更加高效。
  3. 最近邻检索:最终,系统基于计算的距离返回最接近查询向量的多个候选向量(通常是 Top-k 结果)。

这里详细解释一下计算距离的操作,既然大家都是查询编号了,我们是可以把查询编号反映射回向量的,所以直接计算对应质心向量之间的(每个子空间的)距离结果求和(而非把重构的结果组合成完整的高维向量再做计算距离)的,但是这样太慢了。
可以发现我们总是在求质心之间的距离,其实非常没必要,我们可以是事先把每个子空间中的质心之间的的距离提前计算出来存着,要计算对应两个质心的距离时直接查表即可(这样也就不用映射回向量了!)。

查询方法二:

  1. 查询向量量化:查询向量同样被分割为子向量<但不映射为对应的ID,方法一在映射时也需要计算查询向量的子向量到对应质心的向量的距离来判断对应哪个ID>。
  2. 计算距离:详见下。
  3. 最近邻检索:最终,系统基于计算的距离返回最接近查询向量的多个候选向量(通常是 Top-k 结果)。

可以直接计算查询向量的子向量到对应子空间的所有质心的距离,做成一个表<查询向量与质心的表,注意与查询一是构建质心之间的距离表>(不需要映射到最近的质心了,但其实也遍历了与质心计算,少了对q的编码那一步)。因为数据集中的数据已经表示为对应的质心ID了,所以到查询向量到数据集中的data只需要查表然后累加。
相对简洁些。

IVFPQ(Inverted File Index + Product Quantization)

相较于IndexPQ直接对向量 x x x 进行 PQ 量化,IVFPQ 先用 IVF 聚类,再对残差进行PQ,相对量化误差小,精度高,当然速度上会逊于单纯的IndexPQ。

1. 预处理阶段(构建索引)

在执行查询之前,系统已经执行了以下步骤:
1.1 构建 IVF(倒排文件索引)

  • 对所有数据库向量运行 K-Means 聚类,得到 K 个簇中心(centroids)
  • 每个数据库向量x被分配到距离它最近的簇中心 C i C_i Ci,并存储在该簇的倒排列表中

1.2 对簇内的向量进行 PQ(产品量化)

  • 对每个数据库向量的偏移量 x − C i x-C_i xCi进行PQ
  • 只存储PQ编码不存储原始向量

2.查询阶段

给定查询向量 q q q,IVFPQ 执行以下步骤来查找最近邻:

Step 1:使用 IVF 找候选集

用 IVF 簇中心索引快速筛选候选集,避免遍历整个数据库。

  • 计算 q q q 到所有K 个聚类中心的距离: d ( q , C i ) d(q,C_i) d(q,Ci)
  • 选取最近的前n个簇(通常 n < < K n<<K n<<K),只在这些簇的数据库向量中进行搜索,而不扫描整个数据库。
Step 2:计算查询向量到候选向量的距离(使用 PQ)

对候选向量使用 PQ 查表计算近似距离,加速计算。
对于每个候选簇中的数据库向量:

  1. 计算查询向量相对簇中心的偏移量: q ′ = q − C i q'=q-C_i q=qCi
  2. 利用 PQ 查找表计算近似距离:(1)预计算查询向量到PQ质心的距离表<方式二>;(2)读取数据库向量的 PQ 编码,从查找表中快速查找距离;(3)每个向量的距离计算变成了查表 + 加法操作,而不需要逐维计算欧几里得距离
Step 3:返回最近邻

在候选集中排序,选取最近的 k k k个向量作为最终查询结果。

为什么是对残差进行PQ

  1. 减少量化误差
  • 直接对整个数据库向量 x x x进行 PQ 时,可能会出现较大的量化误差。
  • 但如果先用 IVF 找到最接近的簇中心,然后对其 残差进行 PQ 量化,则编码更加精细,可以减少误差。
  1. 提高检索精度
  • 由于每个簇内的向量与簇中心的偏移较小(即残差较小),因此残差的值域更小,产品量化的效果更好。
  • 这样,查询时可以用更少的 PQ 码字(即更低的存储成本)来获得更高的搜索精度。

问题:nprobe 的选择(找候选集的个数)

较低的nprobe会进一步加快速度,但是同时也大概率降低recall,可以适当提高nprobe
这里放上手册中的对比图:
对比

总结:PQ很快但是召回率较低,注意使用场景

这里给上GPT的回答:
各压缩方法对比
补充一下里面未涉及的有关量化的方法:
SQ
VQ
HNSW+SQ/PQ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/900063.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win10彻底让图标不显示在工具栏

关闭需要不显示的软件 打开 例此时我关闭了IDEA的显示 如果说只是隐藏&#xff0c;鼠标拖动一个道理 例QQ 如果说全部显示不隐藏

关税核爆72小时!跨境矩阵防御战紧急打响

一、T86崩塌&#xff1a;全球贸易链的至暗时刻 &#xff08;配图&#xff1a;美国海关系统深夜弹出红色警报&#xff09; 5月2日凌晨2:17&#xff0c;杭州某光伏企业的供应链系统突然发出刺耳警报——其价值1800万美元的逆变器模块被划入34%关税清单。这场代号"黑天鹅突…

蓝桥杯Java B组省赛真题题型近6年统计分类

困难题 题号题型分值代码量难度通过率内容2024-F解答1581困难0.12最短路问题 Dijkstra 期望2024-G解答20116困难0.19模拟 暴力 搜索 DFS 剪纸 枚举2023-H解答2070困难0动态规划2022-H解答20109困难0.032022-J解答25141困难0搜索2021-H解答2041困难0.18二分 思维 规律2021-I解答…

【网络流 图论建模 最大权闭合子图】 [六省联考 2017] 寿司餐厅

题目描述&#xff1a; P3749 [六省联考 2017] 寿司餐厅 题目描述 Kiana 最近喜欢到一家非常美味的寿司餐厅用餐。 每天晚上&#xff0c;这家餐厅都会按顺序提供 n n n 种寿司&#xff0c;第 i i i 种寿司有一个代号 a i a_i ai​ 和美味度 d i , i d_{i, i} di,i​&…

前端面试题(三):axios有哪些常用的方法

Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;用于浏览器和 Node.js 中发送 HTTP 请求。它提供了一些常用的方法来处理不同类型的请求。以下是 Axios 中常用的一些方法&#xff1a; 1. axios.get() 用于发送 GET 请求&#xff0c;从服务器获取数据。 axios.get(/api/d…

python match case语法

学习路线&#xff1a;B站 普通的if判断 def if_traffic_light(color):if color red:return Stopelif color yellow:return Slow downelif color green:return Goelse:return Invalid colorprint(if_traffic_light(red)) # Output: Stop print(if_traffic_light(yellow)) …

LLaMA-Factory大模型微调全流程指南

该文档为LLaMA-Factory大模型微调提供了完整的技术指导&#xff0c;涵盖了从环境搭建到模型训练、推理和合并模型的全流程&#xff0c;适用于需要进行大模型预训练和微调的技术人员。 一、docker 容器服务 请参考如下资料制作 docker 容器服务&#xff0c;其中&#xff0c;挂…

【HCIA】静态综合实验练习笔记

实验拓扑图如下&#xff1a; 实验配置思路如下&#xff1a; 1、网段划分、配置IP地址 2、配置DHCP&#xff0c;使客户端获得ip地址 3、配置静态明细路由&#xff0c;内网全网通 4、配置空接口防环 5、配置优先级&#xff0c;实现选路最佳 6、配置缺省路由&#xff0c;实现公网通…

大数据(4.5)Hive聚合函数深度解析:从基础统计到多维聚合的12个生产级技巧

目录 背景一、Hive聚合函数分类与语法1. 基础聚合函数2. 高级聚合函数 二、6大核心场景与案例场景1&#xff1a;基础统计&#xff08;SUM/COUNT&#xff09;场景2&#xff1a;多维聚合&#xff08;GROUPING SETS&#xff09;场景3&#xff1a;层次化聚合&#xff08;ROLLUP&…

RTOS基础 -- NXP M4小核的RPMsg-lite与端点机制回顾

一、RPMsg-lite与端点机制回顾 在RPMsg协议框架中&#xff1a; Endpoint&#xff08;端点&#xff09; 是一个逻辑通信端口&#xff0c;由本地地址&#xff08;local addr&#xff09;、远程地址&#xff08;remote addr&#xff09;和回调函数组成。每个消息都会发送到特定的…

NineData云原生智能数据管理平台新功能发布|2025年3月版

本月发布 15 项更新&#xff0c;其中重点发布 3 项、功能优化 11 项、性能优化 1 项。 重点发布 基础服务 - MFA 多因子认证 新增 MFA 多因子认证&#xff0c;提升账号安全性。系统管理员开启后&#xff0c;所有组织成员需绑定认证器&#xff0c;登录时需输入动态验证码。 数…

DAY 35 leetcode 202--哈希表.快乐数

题号202 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&a…

Maven+Spring实现后端开发

一、前置知识的介绍 1.Spring 轻量级的 DI / IoC 和 AOP 容器的开源框架 容器的开源框架网址&#xff1a;https://spring.io/projects/spring-framework 作用&#xff1a;可简化管理创建和组装对象之间的依赖关系 将controller----->service------->dao层的依赖配置…

解锁界面设计密码,打造极致用户体验

界面设计是对软件、网站、移动应用等产品的用户界面进行设计的过程&#xff0c;旨在为用户提供美观、易用、高效的交互体验。以下是关于界面设计的一些主要方面&#xff1a; 一、设计原则 用户中心原则&#xff1a;以用户为中心&#xff0c;了解用户的需求、期望、行为和习惯…

Joint Receiver Design for Integrated Sensing and Communications

摘要——在本文中&#xff0c;我们研究了集成感知与通信(ISAC)系统的联合接收机设计&#xff0c;其中通信信号和目标回波信号同时被接收和处理&#xff0c;以在两种功能之间实现平衡性能。特别地&#xff0c;我们提出了两种设计方案来解决联合感知和通信问题中的接收信号处理。…

DeepSeek接入飞书多维表格,效率起飞!

今天教大家把DeepSeek接入飞书表格使用。 准备工作&#xff1a;安装并登录飞书&#xff1b;可以准备一些要处理的数据&#xff0c;确保数据格式正确&#xff0c;如 Excel、CSV 等&#xff0c;也可直接存储到飞书多维表格。 创建飞书多维表格&#xff1a;打开飞书&#xff0c;点…

【C语言入门】由浅入深学习指针 【第二期】

目录 1. 指针变量为什么要有类型&#xff1f; 2. 野指针 2.1 未初始化导致的野指针 2.2 指针越界导致的野指针 2.3 如何规避野指针 3. 指针运算 3.1 指针加减整数 3.2 指针减指针 3.3 指针的关系运算 4. 二级指针 5. 指针数组 5.1 如何使用指针数组模拟二维数组 上…

OpenCV 图形API(13)用于执行两个矩阵(或图像)逐元素乘法操作的函数mul()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 描述 计算两个矩阵的每个元素的缩放乘积。 mul函数计算两个矩阵的逐元素乘积&#xff1a; dst ( I ) saturate ( scale ⋅ src1 ( I ) ⋅ src2 ( I ) ) …

人工智能混合编程实践:C++调用封装好的DLL进行图像超分重建

人工智能混合编程实践:C++调用封装好的DLL进行图像超分重建 前言相关介绍C++简介ONNX简介ONNX Runtime 简介**核心特点**DLL 简介**核心特点****创建与使用****应用场景****优点与挑战**图像异常检测简介应用场景前提条件实验环境项目结构C++调用封装好的DLL进行图像超分重建C…