向量检索学习记录

1、Faiss

  • Faiss是一个用于高效相似搜索和密集向量聚类的库;(支持单个/多个GPU)
  • 官方文档:Home · facebookresearch/faiss Wiki · GitHub
    • 安装(如果编译有问题,有些选项需要关下,比如GPU, Python,Test 在CMakeList.txt中
    • -DFAISS_ENABLE_GPU=OFF; -DFAISS_ENABLE_PYTHON=OFF
    • 安装参考:faiss/INSTALL.md at main · facebookresearch/faiss · GitHub
  • feature
    • 能够在向量集合中搜索query向量的1st,2nd,3rd,4th....xth近邻
    • 支持批量检索
    • 用精度换速度。使用速度快10倍或内存少10倍的方法,在10%的情况下给出不正确的结果
    • 使用最大内积搜索而不是最小欧式距离(L2)搜索;对其他类型的距离(L1、Linf等)搜索支持也有限
      • 各种距离参考:简单理解机器学习中的L1距离,L2距离,L-Inf距离-CSDN博客
    • 返回查询点给定半径内的所有元素(range search)
    • 索引数据存储在磁盘上而不是内存里???
    • 索引二进制向量而不是浮点数向量
    • ignore a subset of index vectors according to a predicate on the vector ids.
  • 站在巨人的肩膀上,实现了如下算法 Home · facebookresearch/faiss Wiki · GitHub
    • https://ieeexplore.ieee.org/abstract/document/1238663 在大型数据集中进行非穷举搜索的关键
    • 基于PQ量化压缩的最近邻搜索
    • IndexIVFPQR
    • 等等

2、PQ量化

  • 预训练:2步 cluster(聚类) + assign(分配) (假设原始向量为128维, 切分4段每段32维度,假设聚类中心数nlist为256)
    • cluster-1 把集合中每个128维向量的切分成4个32维的;
    • cluster-2 在切分完的每个32维向量组内进行聚类,得到256个聚类中心点(一般是固定的)

  • assign-1 由于nlist取256, 那么每个聚类中心可以用8bit表示(2^8 == 256);
  • assign-2 那么每个128维的原始向量经过量化编码之后就可以用4个8位表示,如上图右侧
    • 有128维压缩成了4维,4维中的每一维数字代表的是当前段所属的聚类中心id
  • 检索

  • 对于量化后向量集合进行检索的方式有2种;ADC(非对称距离)及SDC(对称距离),后面的讲解是ADC的检索方式:
    • query向量也切分为预训练中的4段,每段计算与预训练好的256个中心的距离【此处为4*256次32维向量的距离运算】,得到query向量与256个聚类中心距离的表; 4*256
    • 此时,库的向量已经被量化成4个簇心 ID(assign-2中说的),而query向量的4段子向量与各自的256个簇心距离已经预计算好了,所以在计算两个向量的时候只用查4次表【由于有N个待对比向量,所以此处是4*N次查表】;
    • 比如库里的某个向量被量化成了[124, 56, 132, 222], 那么首先查表得到query向量第一段子向量与其ID为124的簇心的距离,然后再查表得到query向量第二段子向量与其ID为56的簇心的距离......最后就可以得到四个距离d1、d2、d3、d4,query向量跟库里向量的距离d = d1+d2+d3+d4。
    • 效率对比:所以在提出的例子里面,使用PQ只用4×256次32维向量距离计算加上4xN次查表,而最原始的暴力计算则有N次128维向量距离计算,很显然随着向量个数N的增加,后者相较于前者会越来越耗时;

3、IVFPQ

  • IVFPQ(Inverted File + PQ)(传统PQ的检索加速,本质:空间分割+快速定位x个子空间+在x个子空间内进行遍历)
    • PQ搜索过程中,会进行全空间遍历,即会遍历库里的全部向量并进行距离计算及查表【4*256次32维向量的距离运算 + 4*N次查表】,效率还可以提高
    • IVFPQ优化本质:将全局遍历锁定为感兴趣区域,则可以避免不必要的全局计算及排序;

  • 实现方式
    • PQ量化之前,增加了一个粗量化过程
    • 直接对库里所有向量做KMeans Clustering,假设簇心个数为1024
    • 每来一个query向量,首先计算其与1024个粗聚类簇心的距离,然后选择距离最近的top N个簇
    • 对topN个簇下的向量(PQ量化之后的)进行遍历及距离计算,找到最相似的topK
    • Faiss具体实现有一个小细节,提高计算精度:就是在计算查询向量和一个簇底下的向量的距离的时候,所有向量都会被转化成与簇心的残差,这应该就是类似于归一化的操作,使得后面用PQ计算距离更准确一点
    • 使用IVF过后,需要计算距离的向量个数就少了几个数量级,最终向量检索就变成一个很快的操作
  • faiss支持的索引模式
    • IndexFlatL2 暴力检索
      • 最基础的Index,精确
    • IndexIVFFlat
      • 为了加快搜索速度,可以将数据集分割成几部分。我们在d维空间中定义Voronoi单元格,并且每个数据库矢量都落入其中一个单元格中。在搜索时,只要查询x所在单元中包含的数据库向量y与少数几个相邻查询向量进行比较。(划分搜索空间)
    • IndexIVFPQ
      • 有损存储
      • 我们看到的索引IndexFlatL2和IndexIVFFlat都存储完整的向量。 为了扩展到非常大的数据集,Faiss提供了基于产品量化器的有损压缩来压缩存储的向量的变体。压缩的方法基于乘积量化(Product Quantizer)。
      • 在这种情况下,由于矢量没有精确存储,搜索方法返回的距离也是近似值

4、优化方式

  1. 量化压缩(压缩特征向量维度)
    1. PQ乘积量化

6、参考

  • 向量检索介绍【硬核系统设计】 分布式向量检索引擎_哔哩哔哩_bilibili
  • 百度智能云团队分享(IVF-PQ):向量检索在大模型应用场景的技术和实践
  • IVFPQ详细讲解:ANN之乘积量化PQ-CSDN博客
  • HNSW https://zhuanlan.zhihu.com/p/673027535
    • nmslib 对标faiss, 在hnsw索引类型,表现优于faiss:探索NMSLIB:高效近似最近邻搜索库的宝藏-CSDN博客
  • 通用向量检索介绍 十分钟带你入门向量检索技术_nsw算法-CSDN博客
  • faiss 原理解析
    • Github 15K! 亿级向量相似度检索库Faiss 原理+应用-CSDN博客
    • https://zhuanlan.zhihu.com/p/149420699
    • https://zhuanlan.zhihu.com/p/357414033
  • faiss源码解析
    • https://zhuanlan.zhihu.com/p/79589005
  • 经典向量检索算法
    • https://zhuanlan.zhihu.com/p/712991028

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

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

相关文章

从 Hadoop 迁移到数据 Lakehouse 的架构师指南

从 Hadoop 到数据湖仓一体架构的演变代表了数据基础架构的重大飞跃。虽然 Hadoop 曾经以其强大的批处理能力统治着大数据领域,但如今的组织正在寻求更敏捷、更具成本效益和现代化的解决方案。尤其是当他们越来越多地开始实施 AI 计划时。根本没有办法让 Hadoop 为 A…

【福建医科大学附属第一医院-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞 …

微信机器人自动回复了解下

现在使用微信来做私域营销和维护客户的非常多,在工作上会频繁地遭遇客户提出的相同问题,当我们的好友数量众多时,手动逐个回复可能会耗费大量的时间。 幸运的是,多微管理系统的自动回复功能为我们带来了福音。帮助咱们解决这一难…

原创作品——GIS和监控软件设计

这套数据可视化大屏软件UI设计旨在提供一个直观、高​‌‌效且易于理解的界面,用于展示和分析大量的能源数据和信息。以下是关于该系统UI设计的详细介绍: 整体布局与设计风格: 界面以蓝色调为主,代表冷静、专业和科技的氛围。 布…

VisualStudio2022配置2D图形库SFML

文章目录 1. 下载安装SFML库2. 创建C项目并配置SFML配置include目录和库目录链接SFML库配置动态链接库 3. 测试 1. 下载安装SFML库 SFML(Simple and Fast Multimedia Library)C库,适合2D游戏和图形界面,提供了以下模块&#xff1…

通过conda install -c nvidia cuda=“11.3.0“ 安装低版本的cuda,但是却安装了高版本的12.4.0

问题 直接通过 conda install -c nvidia cuda"11.3.0"安装得到的却是高版本的 不清楚原理 解决方法 不过我们可以分个安装 runtime toolkit 和 nvcc 安装指定版本的 cudatoolkit 和 nvcc conda install -c nvidia cuda-cudart"11.3.58" conda instal…

电机学习-SVPWM合成原理

一、核心理论 SVPWM 算法的理论基础是平均值等效原理 ,即在一个开关周 T s T_s Ts​内通过对基本电压矢量加以组合,使其平均值与给定电压矢量相等。 引用于《现代永磁同步电机控制原理及MATLAB仿真》 二、合成原理 在扇区 I 为例: 矢量 U o…

【实用知识】Spring Boot 优雅捕捉异常的几种姿势

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区&#x…

【损害和风险评估&坑洼】路面坑洼检测系统源码&数据集全套:改进yolo11-DCNV3

改进yolo11-DLKA等200全套创新点大全:路面坑洼检测系统源码&数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.10.24 注意:由于项目一直在更新迭代,上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或者视频可…

【OpenAI】第五节(图像生成)利用 OpenAI 的 DALL·E 实现自动化图像生成:从文本到图像的完整教程

引言 OpenAI 推出的 DALLE 工具因其能够生成令人惊叹的艺术作品而备受瞩目。DALLE 不仅能够生成静态图像,还能根据用户的需求进行风格化处理,创造出独特的艺术作品。通过 OpenAI 的 API,你可以轻松将 DALLE 的强大功能集成到你的 Python 程序…

单反相机内存卡误删照片怎么办?别急,这里有恢复方法

在摄影的世界里,单反相机无疑是众多摄影爱好者与专业摄影师的首选工具。它不仅能够捕捉细腻丰富的画面细节,还提供了高度的操作灵活性和可扩展性。然而,在使用单反相机的过程中,我们难免会遇到一些技术上的困扰,其中之…

【网络面试篇】三次握⼿、四次挥手综述

目录 一、三次握手 1. 过程描述 2. 为什么不是四次握手?为什么不能两次握手? 二、四次挥手 1. 过程描述 2. 为什么是四次挥手? 一、三次握手 1. 过程描述 ① 客户端 向 服务器 发送 SYN 报文、初始化序列号 ISN(seqx&…

自定义鼠标事件在拖拽中的使用

目标: 显示鼠标在容器元素中划过时经过的元素,但是容器内肯能会出现大量元素,所以直接给容器元素添加click事件,通过elementFromPoint的API模拟子元素被点击事件效果 看看效果吧 涉及的重要对象 MousEvent 参考 MDN 相关代码 operateCont…

[项目详解][boost搜索引擎#2] 建立index | 安装分词工具cppjieba | 实现倒排索引

目录 编写建立索引的模块 Index 1. 设计节点 2.基本结构 3.(难点) 构建索引 1. 构建正排索引(BuildForwardIndex) 2.❗构建倒排索引 3.1 cppjieba分词工具的安装和使用 3.2 引入cppjieba到项目中 倒排索引代码 本篇文章,我们将继续项…

C++《vector的模拟实现》

在之前《vector》章节当中我们学习了STL当中的vector基本的使用方法,了解了vector当中各个函数该如何使用,在学习当中我们发现了vector许多函数的使用是和我们之前学习过的string类的,但同时也发现vector当中一些函数以及接口是和string不同的…

在Postgresql中对空间数据进行表分区的实践

在数据库管理中,合理地对数据进行分区可以提高查询性能和数据管理效率。 本文将详细介绍在Postgresql中对空间数据进行表分区的实践过程。 测试计算机容量有限,测试最大数据量为1,000,000条。 关键字: Postgresql PostGIS 表分区 空间数据 测试计算…

Easy Excel合并单元格情况简单导入导出

需求 实现报表数据的导入导出&#xff0c;表格中部分数据是系统生成&#xff0c;部分数据是甲方填写&#xff0c;录入系统。 批号唯一 Maven <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.…

【modbus协议】libmodbus库移植基于linux平台

文章目录 下载库函数源码编译路径添加libmodbus 源码分析核心数据结构常用接口函数 开发 TCP Server 端开发TCP Client 端 下载库函数源码 编译路径添加 libmodbus 源码分析 核心数据结构 modbus_t结构体&#xff1a; 这是 libmodbus 的核心数据结构&#xff0c;代表一个 Mod…

机房巡检机器人有哪些功能和作用

随着数据量的爆炸式增长和业务的不断拓展&#xff0c;数据中心面临诸多挑战。一方面&#xff0c;设备数量庞大且复杂&#xff0c;数据中心内服务器、存储设备、网络设备等遍布&#xff0c;这些设备需时刻保持良好运行状态&#xff0c;因为任何一个环节出现问题都可能带来严重后…

从0到1学习node.js(express模块)

文章目录 Express框架1、初体验express2、什么是路由3、路由的使用3、获取请求参数4、电商项目商品详情场景配置路由占位符规则5、小练习&#xff0c;根据id参数返回对应歌手信息6、express和原生http模块设置响应体的一些方法7、其他响应设置8、express中间件8.1、什么是中间件…