相似性搜索:第 3 部分--混合倒排文件索引和产品量化

接续前文:相似性搜索:第 2 部分:产品量化 

SImilarity 搜索是一个问题,给定一个查询的目标是在所有数据库文档中找到与其最相似的文档。

一、介绍

        在数据科学中,相似性搜索经常出现在NLP领域,搜索引擎或推荐系统中,其中需要检索最相关的文档或项目以进行查询。在大量数据中,有各种不同的方法可以提高搜索性能。

        在本系列的前两部分中,我们讨论了信息检索中的两种基本算法:倒排文件索引产品量化。它们都优化了搜索性能,但专注于不同的方面:前者加快了搜索速度,而后者将向量压缩为更小、节省内存的表示形式。

        由于两种算法都关注不同的方面,因此自然出现的问题是是否可以将这两种算法合并为一种新的算法。

        在本文中,我们将结合这两种方法的优点来生成一种快速且内存高效的算法。作为参考,大多数讨论的想法将基于本文。

        在深入研究细节之前,有必要了解残差向量是什么,并对它们的有用特性有一个简单的直觉。稍后我们将在设计算法时使用它们。

三、残差向量

        假设执行了一个聚类算法,它产生了几个聚类。每个聚类都有一个质心和与之关联的点。残差是点(向量)与其质心的偏移量。基本上,要找到特定向量的残差,必须从其质心中减去该向量。

        如果聚类是通过 k 均值算法构建的,则聚类质心是属于该聚类的所有点的平均值。因此,从任何点找到残差等效于从中减去聚类的平均值。通过从属于特定聚类的所有点中减去平均值,这些点将以 0 为中心。

左侧显示了原始点聚类。然后从所有聚类点中减去聚类质心。生成的残差向量显示在右侧。

我们可以观察到一个有用的事实:

用残差替换原始向量不会改变它们之间的相对位置。

也就是说,向量之间的距离始终保持不变。让我们简单地看下面的两个等式。

减去平均值不会改变相对距离

        第一个方程是一对向量之间的欧几里得距离公式。在第二个方程中,从两个向量中减去聚类平均值。我们可以看到平均项只是抵消了 — 整个表达式与第一个方程中的欧几里得距离相同!

我们使用 L2 度量(欧几里得距离)的公式证明了这一说法。请务必记住,此规则可能不适用于其他指标。

        因此,如果对于给定查询的目标是查找最近的邻居,则可以仅从查询中减去聚类均值,然后继续执行残差中的正常搜索过程。

从查询中减去平均值不会改变其与其他向量的相对位置

        现在让我们看下图中的另一个示例,其中包含两个聚类,其中每个聚类的向量的残差分别计算。

从聚类的每个向量中减去相应质心的平均值将使所有数据集向量以 0 为中心

        这是一个有益的意见,今后将加以利用。此外,对于给定的查询,我们可以计算所有聚类的查询残差。查询残差允许我们计算到聚类原始残差的距离。

        从每个聚类中减去平均值后,所有点都以 0 为中心。从查询和查询残差到相应聚类的其他点的相对位置不会更改。

四、训练

        在考虑了上一节中有用的观察结果后,我们可以开始设计算法了。

        给定一个向量数据库,构造一个倒排文件索引,将向量集划分为 n 个 Voronoi 分区,从而在推理过程中缩小搜索范围。

        在每个 Voronoi 分区内,从每个向量中减去质心的坐标。结果,来自所有分区的向量彼此更靠近并以 0 为中心。此时,不需要原始向量,因为我们存储它们的残差。

        之后,乘积量化算法在所有分区的向量上运行。

        重要方面产品量化不会为每个分区单独执行 - 这将是低效的,因为分区的数量通常往往很高,这可能会导致存储所有码本所需的大量内存。相反,该算法将同时对所有分区中的所有残差执行

        实际上,现在每个子空间都包含来自不同Voronoi分区的子向量。然后,对于每个子空间,执行聚类算法,并像往常一样构建 k 个聚类及其质心。

训练过程

        用残差替换载体的重要性是什么?如果向量没有被它们的残差替换,那么每个子空间将包含更多不同的子向量(因为子空间将存储来自不同非相交Voronoi分区的子向量,这些子向量在空间中可能彼此相距很远)。现在,来自不同分区的向量(残差)彼此重叠。由于现在每个子空间的种类较少,因此需要更少的复制值来有效表示向量。换句话说:

使用与之前使用的 PQ 代码长度相同的代码,矢量可以更准确地表示,因为它们具有较小的方差。

五、推理

对于给定的查询,可以找到 Voronoi 分区的 k 个最近的质心。这些区域内的所有点都被视为候选点。由于原始向量最初被每个 Voronoi 区域中的残差替换,因此还需要计算查询向量的残差。在这种情况下,需要为每个 Voronoi 分区单独计算查询残差(因为每个区域都有不同的质心)。只有来自所选 Voronoi 分区的残差才会归候选人所有。

然后将查询残差拆分为子向量。与原始乘积量化算法一样,对于每个子空间,计算包含从子空间质心到查询子向量的距离的距离矩阵 d。必须记住,每个Voronoi分区的查询残差是不同的。基本上,这意味着需要为每个查询残差单独计算距离矩阵 d。这是所需优化的计算价格。

最后,对部分距离进行总结,就像之前在乘积量化算法中所做的那样。

5.1 排序结果

        计算完所有距离后,需要选择 k 个最近邻。为了有效地做到这一点,作者建议维护一个MaxHeap数据结构。它的容量有限,为k ,每一步,它存储k电流最小距离。每当计算新距离时,仅当计算的值小于 MaxHeap 中的最大值时,才会将其值添加到 MaxHeap 中。计算完所有距离后,查询的答案已经存储在 MaxHeap 中。使用MaxHeap的优点是其快速的构建时间,即O(n)。

推理过程

六、性能

        该算法利用倒排文件索引和乘积量化。根据推理期间 Voronoi 分区探测的数量,需要计算相同数量的子向量到质心矩阵 d 并将其存储在内存中。这可能看起来像是一个缺点,但将其与整体优势相比,这是一个相当不错的权衡。

该算法从倒排文件索引继承了良好的搜索速度,从产品量化中继承了压缩效率

七、费斯实施

Faiss(Facebook AI Search Similarity)是一个用C++编写的Python库,用于优化的相似性搜索。该库提供了不同类型的索引,这些索引是用于有效存储数据和执行查询的数据结构。

根据 Faiss 文档中的信息,我们将了解如何将倒置文件和产品量化索引组合在一起以形成新的索引。

Faiss 在 IndexIVFPQ 类中实现了所描述的算法,该类接受以下参数:

  • 量化器:指定如何计算向量之间的距离。
  • D:数据维度。
  • nlist:Voronoi 分区的数量。
  • M:子空间的数量。
  • nbits:对单个集群 ID 进行编码所需的位数。这意味着单个子空间中的总聚类数将等于 k = 2^nbits

        此外,还可以调整 nprobe 属性,该属性指定在推理过程中必须使用多少个 Voronoi 分区来搜索候选者。更改此参数不需要重新训练。

费斯对IndexIVFPQ的实现

存储单个向量所需的内存与原始产品量化方法相同,只是现在我们再添加 8 个字节以在倒排文件索引中存储有关向量的信息。

八、结论

利用上一篇文章部分中的知识,我们演练了实现高内存压缩和加速搜索速度的最先进算法的实现。该算法在处理大量数据时广泛用于信息检索系统。

资源

  • 最近搜索的产品量化
  • 费斯文档
  • 费斯存储库
  • 费斯指数摘要

除非另有说明,否则所有图片均由作者提供。

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

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

相关文章

Codeforces Round 903 (Div. 3)

D. Divide and Equalize Example input Copy 7 5 100 2 50 10 1 3 1 1 1 4 8 2 4 2 4 30 50 27 20 2 75 40 2 4 4 3 2 3 1 output Copy YES YES NO YES NO YES NONote The first test case is explained in the problem statement. 很重要很重要的知识点&a…

Windows端口号被占用的查看方法及解决办法

Windows端口号被占用的查看方法及解决办法 Error starting ApplicationContext. To display the conditions report re-run your application with debug enabled. 2023-10-14 22:58:32.069 ERROR 6488 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : ***…

CustomNavBar 自定义导航栏视图

1. 创建偏好设置键 CustomNavBarTitlePreferenceKey.swift import Foundation import SwiftUI//State private var showBackButton: Bool true //State private var title: String "Title" //"" //State private var subtitle: String? "SubTitl…

算法练习13——跳跃游戏II

LeetCode 45 跳跃游戏 II 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回…

螺杆支撑座对注塑机的生产过程有哪些重要影响?

螺杆支撑座对注塑机的生产过程具有重要影响&#xff0c;主要体现在以下几个方面&#xff1a; 1、精度和稳定性&#xff1a;螺杆支撑座能够提高注塑机的精度和稳定性&#xff0c;从而保证塑料制品的品质和一致性。通过提供稳定的支撑和承载&#xff0c;螺杆支撑座可以减少机器运…

React18入门(第三篇)——React Hooks详解,React内置Hooks、自定义Hooks使用

文章目录 概述一、内置 Hook——useState1.1 响应式数据更新1.2 什么是 state1.3 state 特点&#xff08;一&#xff09;——异步更新1.4 state 特点&#xff08;二&#xff09;——可能会被合并1.5 state 特点&#xff08;三&#xff09;——不可变数据&#xff08;重要&#…

MySQL的各种锁

1. MySQL有遇到过死锁的问题吗&#xff1f;你是如何解决的&#xff1f; 死锁&#xff0c;就是两个或两个以上的线程在执行过程中&#xff0c;去争夺同一个共享资源导致互相等待的现象&#xff0c;在没有外部干预的情况下&#xff0c;线程会一直处于阻塞状态&#xff0c;无法往下…

【RocketMQ系列二】通过docker部署单机RocketMQ

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

goland安装教程

安装版本&#xff1a; goland-2023.2.3.exe

spring boot+ vue位置信息大数据综合管理平台源码

spring boot vue位置信息大数据综合管理平台源码 UWB技术的人员定位系统源码 智慧工厂是产业升级的外在表现形式&#xff0c;利用物联网技术加强信息管理的新模式&#xff0c;人员定位管理通过物联网技术、位置信息大数据的综合处理应用&#xff0c;在智慧工厂人员管理方面具有…

git强制删除本地分支 git branch -D

git强制删除本地分支 git branch -D git删除本地分支_zhangphil的博客-CSDN博客git branch -d <分支名>可以通过: git branch 查看所有本地分支及其名字&#xff0c;然后删除特定分支。https://blog.csdn.net/zhangphil/article/details/82255002 使用git branch -d删除…

MacBook/MacOS如何更新到指定的版本

背景 现在是A版本&#xff0c;想要更新到B&#xff0c;而目前能最新更新到C。 是可以做到的&#xff0c;不一定更新就得更新到最新的。 只要下载好B之后更新即可。 方法 思路是下载好目标的版本后更新&#xff0c;这里可以下载&#xff1a; https://support.apple.com/zh-…

Arbitrum Stylus 的工作原理

理解 Arbitrum 如何协调 EVM 和 WASM 的共存是至关重要的。这不仅仅是拥有两个独立的引擎&#xff1b;这是一种增强两者优势的协同关系。 Arbitrum 的独特架构允许 EVM 和 WASM 之间进行无缝和同步的操作&#xff0c;这要归功于其统一的状态、跨 VM 调用和兼容的经济模型。 用…

uniapp小程序实现绘制内容,生成海报并保存截图(Painter和Canvas两种方式举例)

一、Painter方法 Painter插件传送门 1.下载资源包 2.将资源包的如下部分 3.使用页面引入组件 ui样式 <paintercustomStyle=margin-left: 40rpx; height: 1000rpx;palette="{{palette}}"bind:imgOK="onImgOK"/>data 中数据(绘制内容,替换区域) pai…

8.简易无线通信

预备知识 Zigbee无线通信&#xff0c;需要高频的载波来提供发射效率&#xff0c;Zigbee模块之间要可以正常的收发&#xff0c;接收模块必须把接收频率设置和发射模块的载波频率一致。Zigbee有27个载波可以进行通信&#xff0c;载波叫做信道&#xff08;无线通信的通道&#xf…

Umi + React + Ant Design Pro + TS 项目搭建

新建项目目录 mkdir 【项目名称】在对应目录 D:\react\demo 中&#xff0c;安装 Umi 脚手架&#xff1a; yarn create umi接下来&#xff0c;安装将要用到的相关依赖 umijs/plugins&#xff1a; npm i umijs/plugins -Dumijs/plugins 是 Umi 的官方插件集&#xff0c;包含了…

STM32单片机入门学习(六)-光敏传感器控制LED

光敏传感器模块和LED接线 LED负极接B12,正极接VCC 光敏传感模块一DO端接B13,GND接GND&#xff0c;VCC接VCC,AO不接。 如图&#xff1a; 主程序代码&#xff1a;main.c #include "stm32f10x.h" #include "Delay.h" //delay函数所在头文件 #include …

HTTPS 加密全过程

加密协议以前是SSL,现在都是TLS, 而证书现在大多数都是SSL证书 抓包流程: TCP三次握手过后, 客户端发送Client Hello 服务器相应Server Hello 服务器再次响应发送证书: 服务器再发送公钥:

凉鞋的 Godot 笔记 109. 专题一 小结

109. 专题一 小结 在这一篇&#xff0c;我们来对第一个专题做一个小的总结。 到目前为止&#xff0c;大家应该能够感受到此教程的基调。 内容的难度非常简单&#xff0c;接近于零基础的程度&#xff0c;不过通过这些零基础内容所介绍的通识内容其实是笔者好多年的时间一点点…

Servlet的部署与安全

1 Servlet 部署 Servlet规范关于各个东西该放在哪里有许多严格的规则。 1.1 WAR war文件代表Web归档(Web Archive)&#xff0c;war实际就是一个JAR&#xff0c;只不过扩展名是.war而不是.jar。 其采用了一种可移植的压缩形式&#xff0c;把整个Web应用结构&#xff08;去掉…