相似性搜索:第 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 个字节以在倒排文件索引中存储有关向量的信息。
八、结论
利用上一篇文章部分中的知识,我们演练了实现高内存压缩和加速搜索速度的最先进算法的实现。该算法在处理大量数据时广泛用于信息检索系统。
资源
- 最近搜索的产品量化
- 费斯文档
- 费斯存储库
- 费斯指数摘要
除非另有说明,否则所有图片均由作者提供。
相关文章:

相似性搜索:第 3 部分--混合倒排文件索引和产品量化
接续前文:相似性搜索:第 2 部分:产品量化 SImilarity 搜索是一个问题,给定一个查询的目标是在所有数据库文档中找到与其最相似的文档。 一、介绍 在数据科学中,相似性搜索经常出现在NLP领域,搜索引擎或推…...

小程序使用uni.createAnimation只执行一次的问题
思路: 在页面创建的时候,创建一个临时动画对象调用 step() 来表示一组动画完成通过动画实例的export方法导出动画数据传递给组件的animation属性还原动画页面卸载的时候,清除动画数据 <template><view class"content"&g…...

win10取消ie浏览器自动跳转edge浏览器
建议大家看完整篇文章再作操作 随着windows10 日渐更新,各种不同的操作,规避IE浏览器跳转Edge浏览器的问题 算了,找了台云机装的server 有自带的IE 1.(失败)思路 协助Edge浏览器 管理员身份打开 PowerShell 一般e…...

目录启示:使用 use 关键字为命名空间内的元素建立非限定名称
文章目录 参考环境三种名称非限定名称限定名称完全限定名称举个栗子 useuse 关键字use ... as .. 命名冲突真假美猴王两个世界 参考 项目描述搜索引擎Bing、GoogleAI 大模型文心一言、通义千问、讯飞星火认知大模型、ChatGPTPHP 官方PHP ManualPHP 官方language.namespaces.ra…...

Go语言介绍与安装
介绍与安装 本教程介绍了 Go,并讨论了选择 Go 相对于其他编程语言的优势。我们还将学习如何在Windows 中安装 Go。 介绍 Go也称为Golang,是由 Google 开发的一种开源、编译型、静态类型的编程语言。 Go创造背后的关键人物是Rob Pike、 Ken Thompson和…...
常用傅里叶变换表
傅里叶展开 傅里叶变换 傅里叶逆变换 时域信号 弧频域信号 线性变换 时域平移 频域平移 伸缩变换 微分性质 逆变换的微分性质 卷积定理 原函数变换结果 单位阶跃函数: 符号函数: 矩形函数: 辛格函数:...
生活中的视音频技术
生活中的视音频技术 平时我们打开电脑中自己存电影的目录的话,一般都会如下图所示,一大堆五花八门的电影。(其实专业的影视爱好者一概会把影视文件分门别类的,但我比较懒,一股脑把电影放在了一起) 因为下载…...

一种用于肽图分析的烷化剂,Desthiobiotin-Iodoacetamide
中文名:脱硫生物素-碘乙酰胺 英文名:Desthiobiotin-Iodoacetamide 化学式:C14H25IN4O3 分子量:424.28 外观:固体/粉末 规格:10mg、25mg、50mg等(接受各种规格的定制服务,具体可…...

【(数据结构) —— 顺序表的应用-通讯录的实现】
(数据结构)—— 顺序表的应用-通讯录的实现 一.通讯录的功能介绍1.基于动态顺序表实现通讯录(1). 功能要求(2).重要思考 二. 通讯录的代码实现1.通讯录的底层结构(顺序表)(1)思路展示(2)底层代码实现(顺序表) 2.通讯录上层代码实现(通讯录结构…...

macbook磁盘清理免费教程分享
笔记本电脑在是我们工作和生活中重要组成部分,磁盘清理是常有的事,而macbook作为其中的代表之一,也越来越受到人们的青睐。然而,如何进行macbook磁盘清理,也事许多人都会遇到的问题,特别是被提示“磁盘已满…...

cartographer_ros数据加载与处理
node_main.cc 坐标系的读取通过tf_bufferautonode类是cartographer_ros接收传感器数据,并传输到cartographer里,同时还会发布map,轨迹等node_options数据传给两个地方,一个是map_builder进行slam操作,一个是node做数据…...

设计模式-7种结构型模式
适配器模式: 将一个类的接口转换成用户希望得到的另一种接口。它使原本不相容的接口得以协同调用。 桥接模式: 将类的抽象部分和他的实现部分分离开来。是他们可以独立的变化。 它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两…...

华为李鹏:加速5G商业正循环,拥抱更繁荣的5.5G(5G-A)
2023年10月10日,在华为主办的第十四届全球移动宽带论坛上,华为高级副总裁、运营商BG总裁李鹏面向来自全球的运营商和产业伙伴,提出抓住网络需求和趋势的力量——“面向后天的业务,积极规划明天的网络,加速5G商业正循环…...

Marin说PCB之CoilcraftBourns POC 电感的性能对比
十一小长假本来是一件美好事情。可是天有不测风云,小编我却有祸兮来了。本来是公司的硬件同事强哥要回以色列了,最近他们国家那边都在打仗,强哥本着舍身为国的精神回国抗战去了。小编我就想着在他回国之前搞了篮球比赛送别一下他呢࿰…...

聊聊Maven的依赖传递、依赖管理、依赖作用域
1. 依赖传递 在Maven中,依赖是会传递的,假如在业务项目中引入了spring-boot-starter-web依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>…...

centos6/7 SOCKS5 堆溢出漏洞修复(RPM方式)curl 8.4 CVE-2023-38545 CVE-2023-38546
引用 https://darkdark.top/update-curl.html centos6 rpm 升级包下载:https://download.csdn.net/download/sinat_24092079/88425840 yum update libcurl-8.4.0-1.el6.1.x86_64.rpm curl-8.4.0-1.el6.1.x86_64.rpmcentos7 rpm 升级包下载:https://down…...

C#,数值计算——数据建模Proposal的计算方法与源程序
1 文本格式 using System; namespace Legalsoft.Truffer { public class Proposal { public Normaldev gau { get; set; } null; private double logstep { get; set; } public Proposal(int ranseed, double lstep) { this.gau…...

如何使用命令生成动态链接库.dll文件(保姆级教学)
如何使用命令生成动态链接库.dll文件 /*** file 如何使用命令生成动态链接库.dll文件* author jUicE_g2R(qq:3406291309)* * brief 教学演示* tool visual studio2022(2019也适用)* * copyright 2023.10* COPYR…...

Qt之模块介绍
Qt提供了很多功能模块,我们需要知道的是这些模块有些加入了标准库,有一些并没有加入到标准库。至于为什么没有加入到标准库通过chatgpt得到的答案如下: Qt 是一个强大的跨平台 C 框架,它包括了很多核心模块和功能,以支…...

Socks5代理和代理IP
在数字时代,网络工程师必须不断掌握新技术,以解决跨界电商、爬虫数据采集、出海业务扩展、网络安全保护以及游戏性能优化等各种技术挑战。本文将深入探讨Socks5代理和代理IP技术,它们在各个领域中的应用,如何为网络工程师提供了强…...

计算机指令、机器码
目录 背景 在软硬件接口中,CPU 帮我们做了什么事? 从编译到汇编,代码怎么变成机器码? 解析指令和机器码 总结延伸 背景 上大学的时候,我们系里教 C 语言程序设计的老师说,他们当年学写程序的时候&…...

MyLife - Docker安装Consul
Docker安装Consul 个人觉得像consul之类的基础设施在线上环境直接物理机安装使用可能会好些。但是在开发测试环境用docker容器还是比较方便的。这里学习下docker安装consul使用。 1. Consul 镜像库地址 Consul 镜像库地址:https://hub.docker.com/r/hashicorp/consu…...

Leetcode刷题笔记--Hot61-70
1--课程表(207) 主要思路: 用 in 记录每一门课程剩余的先修课程个数,当剩余先修课程个数为0时,将该课程加入到队列q中。 每修队列q中的课程,以该课程作为先修课程的所有课程,其剩余先修课程个数…...

python特别篇—github基本操作手册
一、开始使用 1.1 “Hello world” 1.1.1 github介绍 GitHub是一个基于Git版本控制系统的代码托管平台。它提供了一个在线的代码仓库,使开发者可以将自己的代码存储在云端,并与其他开发者进行协作。GitHub不仅仅是一个代码托管平台,还提供了…...

tiktok直播websocket序列化与反序列化
系列文章目录 websocket训练地址:https://www.qiulianmao.com,正在搭建中 基础-websocket逆向基础-http拦截基础-websocket拦截基础-base64编码与解码基础-protobuf序列化与反序列化视频号直播弹幕采集tiktok protobuf序列化与反序列化实战一:Http轮询更新中tikto...

微信picker弹出之后 , 背景变成灰色是怎么做的
微信小程序在弹出picker组件时,会将页面背景变为半透明的灰色,这是通过设置一个全屏的蒙层来实现的。 具体实现方法如下: 在WXML文件中,添加一个view元素作为蒙层,并设置其样式和属性: <view class&q…...

通用考勤后台管理系统
考勤后台系统,包括待办事项、人员管理、任务中心、任务详情、我的任务、客户管理、考勤功能几大功能,本后台系统以考勤打卡为主要功能,采用分屏布局的方式,简洁大方,使用方便...

LeetCode75——Day5
文章目录 一、题目二、题解 一、题目 345. Reverse Vowels of a String Given a string s, reverse only all the vowels in the string and return it. The vowels are ‘a’, ‘e’, ‘i’, ‘o’, and ‘u’, and they can appear in both lower and upper cases, more t…...

面向C++模块的开源 IFC SDK
早在 VS2019 v16.10 版本的时候,我们就官宣了对 C 模块(以及几乎所有其他 C 20 特性)的全面支持,包括 MSVC 编译器工具集,静态分析,智能感知和调试器等,而实现模块需要将 C 代码实现为一种内部的临时表示形式。 今天&…...

Docker开启远程访问+idea配置docker+dockerfile发布java项目
一、docker开启远程访问 1.编辑docker服务文件 vim /usr/lib/systemd/system/docker.servicedocker.service原文件如下: [Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target docker.socke…...