相似性搜索:第 1 部分- kNN 和倒置文件索引

news2024/11/23 7:39:08

图片来源:维亚切斯拉夫·叶菲莫夫

一、说明

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

        在数据科学中,相似性搜索经常出现在NLP领域,搜索引擎或推荐系统中,其中需要检索最相关的文档或项目以进行查询。通常,文档或项目以文本或图像的形式表示。但是,机器学习算法不能直接处理原始文本或图像,这就是为什么文档和项目通常被预处理并存储为数字向量的原因。

        有时,向量的每个组件都可以存储语义含义。在这种情况下,这些表示也称为嵌入。这样的嵌入可以有数百个维度,它们的数量可以达到数百万个!由于数量如此之大,任何信息检索系统都必须能够快速检测相关文档。

在机器学习中,向量也称为对象

二、索引指数

        为了提高搜索性能,在数据集嵌入之上构建了一个特殊的数据结构。这种数据结构称为索引。该领域已经有很多研究,并且已经发展了许多类型的索引。在选择要申请某项任务的索引之前,有必要了解它在引擎盖下的运作方式,因为每个索引都有不同的用途,并且各有优缺点。

        在本文中,我们将看看最幼稚的方法 — kNN。基于 kNN,我们将切换到倒排文件 — 用于更具可扩展性的搜索的索引,可以将搜索过程加速数倍。

2.1 kNN

        kNN是最简单、最幼稚的相似性搜索算法。考虑一个向量数据集和一个新的查询向量 Q。我们想找到与 Q 最相似的前 k 个数据集向量。要考虑的第一个方面是如何测量两个向量之间的相似性(距离)。事实上,有几个相似性指标可以做到这一点。其中一些如下图所示。

相似性指标

2.2 knn相似性训练和使用

2.2.1 训练

        kNN是机器学习中为数不多的不需要训练阶段的算法之一。选择合适的指标后,我们可以直接进行预测。

2.2.2 推理

        对于新对象,该算法会详尽地计算到所有其他对象的距离。之后,它找到距离最小的 k 个对象并将它们作为响应返回。

kNN 工作流程

        显然,通过检查到所有数据集向量的距离,kNN 保证 100% 准确的结果。但是,就时间性能而言,这种蛮力方法效率非常低。如果数据集由 n 个具有 m 维的向量组成,则对于 n 个向量中的每一个,都需要 O(m) 时间来计算从查询 Q 到它的距离,这会导致 O(mn) 的总时间复杂度。正如我们稍后将看到的,存在更有效的方法。

        此外,原始矢量没有压缩机制。想象一个包含数十亿个对象的数据集。将它们全部存储在RAM中可能是不可能的!

        kNN 性能。具有 100% 的准确性且没有训练阶段会导致在向量推理和无内存压缩期间进行详尽搜索。注意:这种类型的图表显示了不同算法的相对比较。根据情况和所选的超参数,性能可能会有所不同。

2.3 如何应用

        kNN 的应用范围有限,应仅在以下场景之一中使用:

  • 数据集大小或嵌入维度相对较小。这方面确保算法仍然快速执行。
  • 算法所需的精度必须为 100%。在准确性方面,没有其他最近邻算法可以超越kNN的性能。

        根据一个人的指纹检测一个人是需要100%准确性的问题的一个例子。如果该人犯罪并留下了指纹,则仅检索正确的结果至关重要。否则,如果系统不是100%可靠的,那么另一个人可能会被判犯有罪行,这是一个非常严重的错误。

        基本上,有两种主要方法可以改善 kNN(我们将在后面讨论):

  • 缩小搜索范围。
  • 降低矢量的维数。

使用这两种方法之一时,我们不会再次执行详尽搜索。这种算法被称为近似最近邻(ANN),因为它们不能保证100%准确的结果。

三、倒排文件索引

“倒排索引(也称为帖子列表帖子文件或倒排文件)是一种数据库索引,存储从内容(如单词或数字)到其在表格、文档或一组文档中的位置的映射” — 维基百科

        执行查询时,将计算查询的哈希函数,并从哈希表中获取映射值。这些映射值中的每一个都包含其自己的一组潜在候选项,然后根据条件完全检查这些候选项,使其成为查询的最近邻域。这样,所有数据库向量的搜索范围都会缩小。

        倒排文件索引工作流

        此索引有不同的实现,具体取决于哈希函数的计算方式。我们将要研究的实现是使用Voronoi图(或狄利克雷镶嵌)的实现。

3.1 训练

该算法的思想是创建每个数据集点所属的几个非相交区域。每个区域都有自己的质心,指向该区域的中心。

有时沃罗诺伊地区被称为单元分区

沃罗诺伊图的示例。白点是包含一组候选项的相应分区的中心。

Voronoi 图的主要性质是,从一个质心到其区域的任何一点的距离小于从该点到另一个质心的距离。

3.2 推理

        当给定一个新对象时,将计算到Voronoi分区的所有质心的距离。然后选择距离最小的质心,然后将该分区中包含的向量作为候选。

通过给定的查询,我们搜索最近的质心(位于绿色区域)

最终,通过计算到候选人的距离并选择离候选人最近的前 k 个,返回最终答案。

查找所选区域中最近的邻居

如您所见,这种方法比前一种方法快得多,因为我们不必查看所有数据集向量。

3.3 边缘问题

        随着搜索速度的提高,反转文件有一个缺点:它不能保证找到的对象始终是最近的。

        在下图中,我们可以看到这样的场景:实际的最近邻位于红色区域,但我们仅从绿色区域中选择候选人。这种情况称为边缘问题

边缘问题

        当查询的对象位于与另一个区域的边界附近时,通常会发生这种情况。为了减少这种情况中的错误数量,我们可以增加搜索范围,并根据最接近对象的前 m 个质心选择几个区域来搜索候选者。

在多个区域内搜索最近的邻居 (m = 3)

探索的区域越多,结果就越准确,计算它们所需的时间就越多。

3.4 应用

        尽管存在边缘问题,但反转文件在实践中显示出不错的结果。在我们想要权衡精度略有下降以实现多次速度增长的情况下,它是完美的选择。

        其中一个用例示例是基于内容的推荐系统。想象一下,它根据用户过去看过的其他电影向用户推荐一部电影。该数据库包含一百万部电影可供选择。

  • 通过使用kNN,系统确实为用户选择了最相关的电影并推荐它。但是,执行查询所需的时间很长。
  • 让我们假设使用倒排文件索引,系统会推荐第 5 部最相关的电影,这在现实生活中可能就是这种情况。搜索时间比 kNN 快 20 倍。

        从用户体验来看,很难区分这两个推荐的质量结果:第 1 和第 5 个最相关的结果都是来自一百万个可能的电影的好推荐。用户可能会对这些建议中的任何一个感到满意。从时间的角度来看,倒置文件显然是赢家。这就是为什么在这种情况下最好使用后一种方法。

        倒排文件索引性能。在这里,我们略微降低了在推理过程中实现更高速度的精度。

四、Faiss库实施

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

根据 Faiss 文档中的信息,我们将了解如何创建和参数化索引。

4.1 实现kNN

        实现 kNN 方法的索引在 Faiss 中被称为平面索引,因为它们不压缩任何信息。它们是保证正确搜索结果的唯一索引。实际上,Faiss中存在两种类型的平面索引:

  • 索引平L2.相似性计算为欧几里得距离。
  • 索引平面IP。相似性计算为内积。

        这两个索引都需要在其构造函数中包含一个参数 d:数据维度。这些索引没有任何可调参数。

IndexFlatL2 和 IndexFlatIP 的 Faiss 实现

存储矢量的单个分量需要 4 个字节。因此,要存储维度为 d 的单个向量,需要 4 * d 字节。

4.2 倒排文件索引

        对于描述的倒置文件,Faiss 实现了类 IndexIVFFlat。与 kNN 的情况一样,单词“Flat”表示原始向量没有解压缩并且它们已完全存储。

        要创建此索引,我们首先需要传递一个量化器 — 一个确定如何存储和比较数据库向量的对象。

        IndexIVFFlat 有 2 个重要参数:

  • nlist:定义训练期间要创建的多个区域(Voronoi 单元)。
  • nprobe:确定搜索候选项的区域数。更改 nprobe 参数不需要重新训练。

Faiss 实现 IndexIVFFlat

与前面的情况一样,我们需要 4 * d 字节来存储单个向量。但是现在我们还必须存储有关数据集向量所属的Voronoi区域的信息。在 Faiss 实现中,此信息每个向量占用 8 个字节。因此,存储单个向量所需的内存为:

五、结论

        我们已经在相似性搜索中经历了两种基本算法。实际上,朴素的kNN几乎不应该用于机器学习应用程序,因为它的可扩展性很差,除非在特定情况下。另一方面,反转文件为加速搜索提供了良好的启发式方法,可以通过调整其超参数来提高其质量。仍然可以从不同的角度增强搜索性能。在本系列文章的下一部分中,我们将介绍一种旨在压缩数据集向量的方法。

系列下篇:相似性搜索:第 2 部分:产品量化_无水先生的博客-CSDN博客

参考资源

  • 倒排索引 |维基百科
  • 费斯文档
  • 费斯存储库
  • 费斯指数摘要
  • 选择索引的准则

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

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

相关文章

课题学习(七)----粘滑运动的动态算法

一、 粘滑运动的动态算法 在实际钻井过程中,钻柱会出现扭振和粘滑现象(粘滑运动–B站视频连接),但并不总是呈现均匀旋转。如下图所示,提取一段地下数据时,转盘转速保持在100 r/min,钻头转速在0-…

Namomo Summer Camp 23 Day 1

Namomo Summer Camp 23 Day 1 - Virtual Judge B - Brexiting and Brentering AC代码: #include<bits/stdc.h> #define endl \n //#define int long long using namespace std; string s; void solve() {cin>>s;int x-1;for(int is.size()-1;i>0;i--){if(s[i…

YOLOv5训练自己的数据集(超详细)

YOLOv5训练自己的数据集整个过程主要包括&#xff1a;环境安装----制作数据集----模型训练----模型测试----模型推理 一、准备深度学习环境 本人的笔记本电脑系统是&#xff1a;Windows10 首先进入YOLOv5开源网址 &#xff0c;手动下载zip或是git clone 远程仓库&#xff0c;本…

【C++心愿便利店】No.8---C++之重识类和对象

文章目录 前言一、再谈构造函数二、static成员三、友元四、内部类五、匿名对象六、再次理解类和对象 前言 &#x1f467;个人主页&#xff1a;小沈YO. &#x1f61a;小编介绍&#xff1a;欢迎来到我的乱七八糟小星球&#x1f31d; &#x1f4cb;专栏&#xff1a;C 心愿便利店 &…

6、docker下mysql修改配置文件

1、查看mysql镜像 如果没有mysql镜像则下载 docker images |grep mysql 2、查看mysql容器 docker ps |grep mysql 如果没有显示mysql容器信息&#xff0c;则创建 3、创建容器 docker run -it --name mysql-test -e MYSQL_ROOT_PASSWORDroot -p 3306:3306 -d f9653 4、在…

AB实验--科学增长

涉及的内容&#xff1a; AB实验的前置知识 AB实验的架构 AB实验的创建 AB实验的分析 AB实验的展示 AB实验的监控 AB扩展---指标监控 AB扩展---指标异动 AB扩展---异动分析 AB实验参考书籍 1.什么是AB AB 测试&#xff08;也称为拆分测试&#xff09;是一种统计方法&a…

SiC外延片测试方案

外延材料是实现器件制造的关键&#xff0c;主要技术指标有外延层厚度、晶格布局&#xff0c;材料结构&#xff0c;形貌以及物理性质&#xff0c;表面粗糙度和掺杂浓度等。下面阐述SiC外延表面常见的测试手段&#xff1a; 1. 外延层厚度&#xff08;傅里叶变换红外FT-IR&#xf…

xray安装与bp组合使用-被动扫描

xray安装与bp组合使用-被动扫描 文章目录 xray安装与bp组合使用-被动扫描1 工具官方文档&#xff1a;2 xray官网3 工具使用4 使用指令说明5 此为设置被动扫描6 被动扫描-启动成功7 启动bp7.1 设置bp的上层代理7.2 添加上层代理7777 --》指向的是xray7.3 上层代理设置好后&#…

实施运维03

一.制作启动盘&#xff08;老毛桃&#xff0c;大白菜&#xff0c;傲梅&#xff09; 1.网上下载启动盘工具 https://msdn.itellyou.cn/ 二.重装系统 1.1.插上启动盘 2.电脑关机 3.电脑开机&#xff0c;开机的时候按住F12键 4.选择启动盘进去&#xff0c;选择一个要重装的系统…

关于mybatis中collection出现的问题(ofType 和 javaType )

关于mybatis中collection出现的问题 我在代码中的collection标签中使用了javaType导致映射是失败的&#xff0c;我使用了ofType就可以了&#xff0c;下面介绍这两个标签之间的区别。 ofType 和 javaType 属性都用于指定集合或关联对象的类型&#xff0c;但它们的使用方式和含义…

蓝牙资讯|2024年智能家居新趋势,蓝牙助力智能家居发展

2024年将迎来变革&#xff0c;智能家居趋势不仅会影响我们的生活空间&#xff0c;还会提高我们的生活质量&#xff0c;让我们有更多时间享受属于自己的时光。 2024年智能家居新趋势 趋势一&#xff1a;多功能科技 2024年预示着多功能技术的趋势&#xff0c;创新将成为焦点。混…

主机jvisualvm连接到tomcat服务器查看jvm状态

​使用JMX方式连接到tomcat&#xff0c;连接后能够查看前边的部分内容&#xff0c;但是不能查看Visual GC&#xff0c;显示不受此JVM支持&#xff0c; 对了&#xff0c;要显示Visual GC&#xff0c;首先要安装visualvm工具&#xff0c;具体安装方式就是根据自己的jdk版本下载…

【PWN · 栈迁移】[CISCN 2019东南]PWN2

一道非常典型、适合用作学习栈迁移的题目。 前言 当存在栈溢出但是溢出字符数并不多的情况下&#xff0c;可以尝试在别处构造rop链&#xff0c;通过栈迁移到目标内存区域&#xff0c;执行rop链。这里不讲栈迁移原理&#xff0c;仅是对题目的分析&#xff0c;适合对栈迁移有初步…

Java 操作 Excel:生成数据、设置单元格样式、设置数据有效性(hutool)

必读信息 该篇文章&#xff0c;主要通过 Java 代码对 Excel 文件的常用操作&#xff0c;包括&#xff1a;生成表格、修改单元格样式、设置数据有效性。 该篇文章&#xff0c;在官网文献下增加个人的看法和理解&#xff0c;如文中有出现不符、错误或需要补充的地方&#xff0c…

CVE-2017-12615 Tomcat远程命令执行漏洞

漏洞简介 2017年9月19日&#xff0c;Apache Tomcat官方确认并修复了两个高危漏洞&#xff0c;漏洞CVE编号&#xff1a;CVE-2017-12615和CVE-2017-12616&#xff0c;其中 远程代码执行漏洞&#xff08;CVE-2017-12615&#xff09; 当 Tomcat 运行在 Windows 主机上&#xff0c;…

AutoDL平台transformers环境搭建

AutoDL平台transformers环境搭建 租借GPU可以参考 AutoDL平台租借GPU详解 一、激活base环境 1.进入终端 vim ~/.bashrc2、然后按英文模式的 i 进入编辑&#xff0c;按键盘下键到最后输入 source root/miniconda3/etc/profile.d/conda.sh3、然后先按键盘Esc键&#xff0c…

Linux系统编程01

C语言程序编译过程 多个源文件生成一个可执行文件的过程 预处理阶段主要是将带 # 号的类似于 #include #define #ifdef等进行处理替换 gcc -S 下面讲解C语言源代码编译成汇编语言之后&#xff0c;之间的对应情况 源代码 使用gcc -S test15.c -o test15.s指令让源代码进行编译…

Adaptive AUTOSAR CM模块介绍(五)

Proxy Class API’s proxy class类提供类&#xff08;静态&#xff09;方法来FindService() 实例&#xff0c;服务是动态的&#xff0c;因此&#xff0c;AUTOSAR提供了两个方法来提供发现服务。 StartFindService():是一个类方法&#xff0c;它在后台启动一个周期性的“FindS…

联想电脑的Microsoft Edge启动总是百度页面的修改方法

前言 拿到联想电脑&#xff0c;打开浏览器的搜索引擎默认是百度&#xff0c;在浏览器中的设置总是更改不了。这是因为联想管家启动浏览器保护&#xff0c;我们是无法更改的&#xff0c;除非在联想管家中更改启动页的打开网址。操作流程往下看。 操作 &#x1f388;打开联想管…

苹果放出快捷指令专题介绍页面,大大提高了 Mac 使用效率

近日&#xff0c;苹果发布 macOS Sonoma 更新的同时&#xff0c;还上线了“《快捷指令》助你效率倍增”专题页面&#xff0c;其目标是在 Mac 上让好用的 App 更强大。 快捷指令功能可以让设备自动完成常用或繁琐的操作&#xff0c;大大提升 Mac 的效率。 快捷指令能帮你在《邮…