向量相似搜索绕不开的局部敏感哈希

news2025/2/22 23:44:07

在搜索推荐中,通常使用相似Embedding进行推荐,此时就会有一个问题:如何快速找到与一个Embedding相近的其他Embedding。

如果两个Embedding在同一个向量空间中,我们就可以通过很多种方式(内积、余弦、欧氏距离等)计算其相似度;例如在推荐系统中,用户和物品的Embedding都在同一个空间中,物品总数为𝑛,那么计算一个用户和所以物品向量相似度的时间复杂度是𝑂(𝑛),而𝑛通常都能达到百万甚至上亿,这样的计算方式是无法接受的。

1 朴素方法

1.1 聚类
如果将相似点聚类在一起,在检索相似向量的时候则可以快速缩小范围,只计算目标Embedding所在的聚类范围内的相似度,这里可以使用叫常见的[K-means]聚类方法;

但是这种方法在聚类的边缘会出现些问题,如果只检索类别内的向量,则可能遗漏在其他类别中的相近点;另外,对于K-means方法,K值得选择也是一个问题,如果K选的太大,则迭代过程会很缓慢;K值选的太小,则搜索范围无法有效降低;

K值得选择经验:K=Embedding的维度开4次方根,调参按照2的整数次幂进行调整

1.2 索引
例如使用经典的[Kd-tree]向量空间索引算法中,同样存在边缘点的问题,Kd-tree会找到最邻近的区域,但是其他区域同样存在可能的最近点;另外Kd-tree的索引结构较为复杂,导致离线和在线的维护也相对复杂;

2 局部敏感哈希基本原理

局部敏感哈希(Locality Sensitive Hashing, LSH)高效地解决了Embedding匹配的问题。

局部敏感哈希基本思想,是【将相邻的点落入同一个“桶”,这样在进行最邻近搜索时,仅需要在一个桶内或邻近几个桶内进行搜索,只需要保证每个桶内的元素个数保持在一个较小的范围内】;

如下图所示例子,首先需要确定一个结论:在[欧式空间]中,【将高位空间的点映射到低维空间,原本接近的点在低维空间中肯定依然接近,但原本远离的点则有一定概率变成接近的点】。
在这里插入图片描述
利用上面的【低维空间保留高维空间相近距离关系的性质】,我们可以设计构造多个“桶”。假设𝑣是高位空间中的𝑘维Embedding向量,𝑥是随机生成的𝑘维向量,可以得到一个数值,即 h ( v ) = v ⋅ x h(v)=v \cdot x h(v)=vx也就是两个等长向量点击的结果】。

根据这个数值,我们设计哈希函数ℎ(𝑣)进行分桶:
h x , b ( v ) = [ x ⋅ v + b w ] h^{x,b}(v)=[\frac{x \cdot v + b}{w}] hx,b(v)=[wxv+b]

上面公式中𝑤是分桶宽度(将映射后点积的结果,按照w的宽度进行分块),𝑏是0到𝑤之间的一个均匀分布随机变量,其作用是避免分桶边界固化。为了避免映射操作损失信息,可以使用𝑚个哈希函数进行分桶,如果同时掉入多个桶,则其相似的概率将会增加。在确定了桶后,就在其有限的集合内进行[K近邻]搜索即可【本质看起来和PQ量化的思想一致】,PQ量化可以参考笔者文章Faiss PQ 乘积量化。

3 多桶策略

当存在多个哈希函数的时候,聚合中的点可能以不同的分布方式落在多个桶当中。最简单的就是一个点在匹配的桶中都出现(AND)以及在任意一个桶中出现(OR)两种策略。多桶策略还可以更复杂,比如三个分桶,可以选择同时落入两个桶中的点作为候选点。下面有一些建议的策略:

  • 点数越多,越应该增加每个分桶函数中桶的个数;点数越少,越应该减少桶的个数;
  • Embedding的维度越高,越应该增加分桶哈希函数的数量,并使用且的方式作为多桶策略;
  • 若Embedding维度低,则可以少用哈希函数,并用或的方式作为分桶策略;

4 存储部署思路

例如在商品推荐系统中,商品称为(item)有对应的item_id,可以使用以下方案:

  • 存储 item_id: BucketId
  • 存储 BucketId: item_id
    在召回的时候,先使用目标item_id找到对应的BucketId,然后再通过BucketId桶中的商品,实际上就是建立[倒排索引]的思路。

5 总结

LSH相比一些朴素的方法,高效地解决了相似向量查找的问题,通过多桶机制减小其哈希分桶的损失;但是也存在一些问题,大数据量情况下哈希函数的个数不好确定,另外在进行哈希计算的时候,可能会存在哈希冲突,导致召回率降低。

此外向量相似查找,还有一些基于树、基于量化、基于图的方法,根据不同的场景也可一试。

  [1].局部敏感哈希-向量相似搜索

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

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

相关文章

python3 爬虫相关学习8:python 的常见报错内容 汇总收集

目录 1 拼写错误 AttributeError: NameError: 等等 2 类型错误 TypeError: 如字符串连接错误 TypeError: can only concatenate str (not “int“) to str 3 意外缩进 IndentationError: unexpected indent 4 找不到对应模块 ModuleNotFoundError: 5 语法错误 Syntax…

【Docker】deepin/centos安装docker

deepin虚拟机和centos服务器安装docker 1.更新软件包 # deepin sudo apt-get update && sudo apt-get upgrade # centos sudo yum update && yum upgrade安装docker之前,先更新一下软件包 mothramothra-PC:~$ sudo apt-get update && sud…

《Lua程序设计》--学习6

日期和时间 第1种表示方式是一个数字,这个数字通常是一个整型数。尽管并非是ISO C所必需的,但在大多数系统中这个数字是自一个被称为纪元(epoch)的固定日期后至今的秒数。 Lua语言针对日期和时间提供的第2种表示方式是一个表。日…

苹果新专利曝光,用户可通过Apple Watch及MR头显摄像头设置3D虚拟化身

美国专利商标局公布了苹果公司的一项专利申请,涉及提供计算机生成体验的计算机系统,包括但不限于通过显示器提供 VR 和 MR 体验的电子设备。 在一个例子中,苹果展示了 Apple Watch 的未来版本,该版本将允许用户使用 Apple Watch…

ceph安装搭建总结

ceph安装搭建总结 大纲 版本选择集群架构免密登录安装ceph-deploy部署ceph集群安装mgr安装ceph-dashboard 版本选择 ceph 版本信息如下 本次测试使用版本为Octopus 主版本号为15, 并且使用ceph-deploy 2.0.1安装ceph集群 Ceph Octopus 官方文档 相关环境与软件…

找不到msvcp140.dll无法继续执行代码,解决方法

msvcp140.dll电脑文件中的dll文件,即动态链接库文件,若计算机中丢失了某个dll文件,就会导致某些软件和游戏等程序无法正常启动运行,并且导致电脑系统弹窗报错,其安装方法:1、打开浏览器输入“【dll修复程序…

迅为iTOP-RK3588开发板Android12源码定制开发kernel开发

内核版本是 5.10.66 版本,内核默认的配置文件是 3588-android12/kernel-5.10/arch/arm64/configs/rockchip_defconfig 如果我们要使用图形化界面配置内核,操作方法如下所示: 方法一: 1 首先将默认的配置文件 rockchip_defconf…

stable diffusion其他微调方法

textual inversion 发布时间:2022 目标:与DreamBooth一样,都是想要微调模型生成特定目标或风格的图像 方法:通过在vocabulary中添加一个额外的embedding来学习输入的新特征。预训练模型的所有参数都锁住,只有新的emb…

yolo-v4

目录 一:前言 二:一些数据增强的方法 三:自提议 四:dropout 普通的dropout yolov4的dropblock 五:Label smothing 标签平滑 六: GIOU,DIOU,CIOU 七: 对网络结构的…

移动端APP组件化架构实践

作者:何乐乐 前言 对于中大型移动端APP开发来讲,组件化是一种常用的项目架构方式。个人最近几年在工作项目中也一直使用组件化的方式来开发,在这过程中也积累了一些经验和思考。主要是来自在日常开发中使用组件化开发遇到的问题以及和其他开…

Lecture 16 Dependency Grammar

目录 Dependency GrammarDependency GrammarDependency RelationsApplication: Question AnsweringApplication: Information ExtractionDependency vs. ConstituencyProperties of a Dependency TreeProjectivityTreebank Conversion Transition-based ParsingDependency Pars…

【openEuler 20.03 TLS编译openGauss2.1.0源码】

openEuler 20.03 TLS编译openGauss2.1.0源码 一、安装环境二、安装前准备二、安装步骤 一、安装环境 项目Value操作系统openEuler 20.03 64bit with ARMopenGauss2.1.0openGauss-third_party2.1.0 二、安装前准备 项目Value购买华为ECS鲲鹏 8vCPU32G 100M/s带宽 openEuler 2…

组网配置案例

汇聚层与接入层或者汇聚层与核心层组网 案例: port-group技术:可实现对于所有组内接口进行相同配置 [ACC-1]port-group group-member GigabitEthernet 0/0/1 to GigabitEthernet 0/0/9 [ACC-1-port-group]port link-type access [ACC-1-port-group]port…

【大数据学习番外篇之爬虫1】 爬虫的介绍与基本使用

目录 1. 爬虫的介绍 2. 爬虫基本使用 2.1 爬取搜狗首页的页面数据 2.2 网页采集器 1. 爬虫的介绍 前戏: 1.你是否在夜深人静的时候,想看一些会让你更睡不着的图片却苦于没有资源... 2.你是否在节假日出行高峰的时候,想快速抢购火…

【CentOS安装软件系列】Centos7安装Mysql8

前言 公司的系统都是内网部署的,mysql也需要自己在内网部署,虽然使用docker安装很方便,但是有一定的风险。所以简单记录一下怎么安装mysql,以备不时之需。 一、下载安装包 下载地址:https://downloads.mysql.com/arch…

javaScript蓝桥杯-----天气趋势 A

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 日常生活中,气象数据对于人们的生活具有非常重要的意义,数据的表现形式多种多样,使用图表进行展示使数据在呈现上更加直观。 本题请实现一个 Y 城 2022 年的天气趋势图。 二、准备…

【Python】一文带你认识 Web 框架之 FastAPI

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

TI DSP芯片C2000系列读取FLASH数据

本文记录如何读取TI芯片的flash数据 进入TI官网下载UNIFLASH工具 点击查看详情 点击下载选项,根据系统下载对应版本 下载完成之后,点击安装。安装完成之后双击图标点开。如果你的板子已经供电,且编程器已经连接好,UNIFLASH会自动…

使用C++处理一行输入未知个数的字符的问题

今天分享一下使用C处理一行输入未知个数的字符的问题。 一,问题描述 在一行输入未知个数字符,以回车结束输入。 二,分析问题 第一种方式使用String类型,直接读入一串字符,这种方法简单高效。第二种方式一个一个字符…

HCIA-DHCP,FTP,Telnet

目录 DHCP: DHCP的优点: DHCP的工作原理 DHCP的配置 DHCP全局地址池案例: FTP FTP介绍 FTP基本配置 Telnet Telnet的应用场景 Telnet设备配置 Telnet配置案例 DHCP: 解决传统手工配置IP的问题,可以实现IP的…