推荐算法:HNSW【推荐出与用户搜索的类似的/用户感兴趣的商品】

HNSW算法概述

HNSW(Hierarchical Navigable Small Word)算法算是目前推荐领域里面常用的ANN(Approximate Nearest Neighbor)算法了。其目的就是在极大量的候选集当中如何快速地找到一个query最近邻的k个元素

要找到一个query的k个最近邻元素,一个朴素的思想就是我去计算这个query和所有的总量N 个候选元素的距离,然后选择其中的前k 个最小元素,这个经典算法的算法复杂度是O(Nlog(k)),显然这个算法复杂度实在是太高了,无法适用于实际的使用场景。

而要解决这个问题,可以有多种实现方法,这里所要说的HNSW算法就是目前比较常用的一种搜索算法,它算是其前作NSW算法的一个升级版本,但是两者的本质都是基于一个朴素的思路,就是通过图连接的方式给所有的N 个候选元素事先地定义好一个图连接关系,从而可以将前述的算法复杂度当中的N 的部分给减小掉,从而优化整体的检索效率

其整体的一个图结果可以用下图进行表达:

解决的问题做高效率相似性查找。推荐系统中,如何找到与用户query最相近的几个item,然后推荐出去【也就是推荐出与用户搜索的类似的/用户感兴趣的商品】

解决方法有:Annoy,KD-Tree, LSH, PQ,NSW, HNSW等。

近似最近邻搜索算法(Approximate Nearest Neighbor Search,ANNS)发展:近邻图(Proximity Graph)–> NSW --> Skip List --> HNSW

近似最近邻搜索算法(Approximate Nearest Neighbor Search,ANNS)

1. 近邻图(Proximity Graph)

近邻图(Proximity Graph): 最朴素的图算法

思路: 构建一张图, 每一个顶点连接着最近的 N 个顶点。 Target (红点)是待查询的向量。在搜索时, 选择任意一个顶点出发。 首先遍历它的友节点, 找到距离与 Target 最近的某一节点, 将其设置为起始节点, 再从它的友节点出发进行遍历, 反复迭代, 不断逼近, 最后找到与 Target 距离最近的节点时搜索结束。

存在的问题:

  1. 图中的K点无法被查询到。
  2. 如果要查找距离Target (红点)最近的topK个点, 而如果点之间无连线, 将影响查找效率。
  3. D点有这么多友节点吗? 增加了构造复杂度。谁是谁的友节点如何确定?
  4. 如果初始点选择地不好(比如很远),将进行多步查找。

2. NSW算法原理

NSW,即没有分层的可导航小世界的结构(Navigable-Small-World-Graph )。

针对上面的问题,解决办法:

  1. 某些点无法被查询到 -> 规定构图时所有节点必须有友节点。
  2. 相似点不相邻的问题 -> 规定构图时所有距离相近到一定程度的节点必须互为友节点。
  3. 关于某些点有过多友节点 -> 规定限制每个节点的友节点数量。
  4. 初始点选择地很远 -> 增加高速公路机制。

2.1 NSW构图算法

图中插入新节点时,通过随机存在的一个节点出发查找到距离新节点最近的m个节点(规定最多m个友节点,m由用户设置),连接新节点到这最近的m个节点。节点的友节点在新的节点插入的过程中会不断地被更新。

m=3(每个点在插入时找3个紧邻友点)。

第1次构造:图为空,随机插入A,初始点为A。图中只有A,故无法挑选友节点。插入B,B点只有A点可选,所以连接BA。

第2次构造:插入F,F只有A和B可以选,所以连接FA,FB。

第3次构造:插入C,C点只有A,B,F可选,连接CA,CB,CF。

第4次构造:插入E,从A,B,C,F任意一点出发,计算出发点与E的距离和出发点的所有“友节点”和E的距离,选出最近的一点作为新的出发点,如果选出的点就是出发点本身,那么看我们的m等于几,如果不够数,就继续找第二近的点或者第三近的点,本着不找重复点的原则,直到找到3个近点为止。找到了E的三个近点,连接EA,EC,EF。

第5次构造:插入D,与E点的插入一模一样,都是在“现成”的图中查找到3个最近的节点作为“友节点”,并做连接。

第6次构造:插入G,与E点的插入一模一样,都是在“现成”的图中查找到3个最近的节点作为“友节点”,并做连接。

在图构建的早期,很有可能构建出“高速公路”。

第n次构造:在这个图的基础上再插入6个点,这6个点有3个和E很近,有3个和A很近,那么距离E最近的3个点中没有A,距离A最近的3个点中也没有E,但因为A和E是构图早期添加的点,A和E有了连线,我们管这种连线叫“高速公路”,在查找时可以提高查找效率(当进入点为E,待查找距离A很近时,我们可以通过AE连线从E直接到达A,而不是一小步一小步分多次跳转到A)。

结论:一个点,越早插入就越容易形成与之相关的“高速公路”连接,越晚插入就越难形成与之相关的“高速公路”连接。

这个算法设计的妙处就在于扔掉德劳内三角构图法,改用“无脑添加”(NSW朴素插入算法),降低了构图算法时间复杂度的同时还带来了数量有限的“高速公路”,加速了查找。

2.2 NSW查找算法

NSW.png

图中的边有两个不同的目的:

  1. Short-range edges,用作贪婪搜索算法所需的近似 Delaunay 图。
  2. Long-range edges,用于贪婪搜索的对数缩放。负责构造图形的可导航小世界(NSW)属性。

优化查找:

  1. 建立一个废弃列表visitedSet,在一次查找任务中遍历过的点不再遍历。
  2. 建立一个动态列表result,把距离查找点最近的n个点存储在表中,并行地对这n个点进行同时计算“友节点”和待查找点的距离,在这些“友节点”中选择n个点与动态列表中的n个点进行并集操作,在并集中选出n个最近的友点,更新动态列表。

推荐算法:HNSW算法简介-CSDN博客

检索模型-粗排HNSW_hnsw模型-CSDN博客

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

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

相关文章

uniapp微信小程序点击保存图片

一:需要用到的API 1.uni.uploadFile(OBJECT) 将本地资源上传到开发者服务器 uni.uploadFile(OBJECT) | uni-app官网 2. uni.saveImageToPhotosAlbum(OBJECT) 保存图片到系统相册。 uni.chooseImage(OBJECT) | uni-app官网 注意:微信小程序在2023年…

【参数汇总】mysql服务端/客户端常见优化参数

mysql服务端参数 1、innodb_buffer_pool_size (innodb索引buffer pool缓冲区大小) 默认大小为128M, 官方推荐其配置为系统内存的 50% 到 75% 。 一般innodb_buffer_pool_size要结合以下两个参数来设置: innodb_buffer_pool_ch…

【1.计算机组成与体系结构】浮点数的表示

目录 1.浮点数的表示2.运算过程3.特点 1.浮点数的表示 N尾数*基数(指数/也称为阶码) 例如:1.25x105 ; 1.255x103 2.运算过程 对阶>尾数计算>结果格式化 3.特点 1、一般尾数用补码,阶码用移码 2、阶码的位数决定数的表示范围,位数越…

本地部署 Qwen-Audio-Chat

本地部署 Qwen-Audio-Chat Qwen-Audio-Chat 介绍Qwen-Audio Github 地址部署 Qwen-Audio-Chat安装 ffmpeg克隆代码库创建虚拟环境使用 pip 安装 pytorch使用 pip 安装依赖使用 ModelScope运行 Web UI Qwen-Audio-Chat 介绍 Qwen-Audio-Chat是通用语音多模态大规模语言模型&…

Spring Boot 3 整合 Mybatis-Plus 动态数据源实现多数据源切换

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…

什么是循环依赖,如何解决

目录 什么是循环依赖? 循环依赖的原因: 如何解决循环依赖问题? 最佳实践和注意事项: 结论: 当在使用 Spring Boot 进行开发时,循环依赖(Circular Dependency)可能会成为一个常见…

广东省工业和信息化厅工业互联网处一行莅临科东软件考察调研

近日,广东省工业和信息化厅工业互联网处副处长郑华、广东省科学院智能制造研究所副所长曹永军等一行领导、专家莅临科东软件,就聚焦工业数字化转型,助推新型工业化高质量发展进行考察调研。 科东软件陪同郑华副处长一行参观科东软件展厅&…

学习笔记——GDB调试器

感谢B站up主 xiaobing1016 的学习视频:基于VSCode和CMake实现C/C开发 | Linux篇_哔哩哔哩_bilibili

Redis缓存异常问题,常用解决方案总结

前言 Redis缓存异常问题分别是:1.缓存雪崩。2.缓存预热。3.缓存穿透。4.缓存降级。5.缓存击穿,以 及对应Redis缓存异常问题解决方案。 1.缓存雪崩 1.1、什么是缓存雪崩 如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有…

华为OD试题一(磁盘容量排序、数大雁、计算疫情扩散时间)

1. 磁盘容量排序 题目描述:磁盘的容量单位常用的有M,G,T这三个等级,它们之间的换算关系为1T 1024G,1G 1024M,现在给定n块磁盘的容量,请对它们按从小到大的顺序进行稳定排序,例如给…

TUP实现一对一聊天

package TCP; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; /** * 发送消息线程 */ class Send ext…

道可云元宇宙每日资讯|上海市区块链关键技术攻关专项项目立项清单公布

道可云元宇宙每日简报(2023年12月11日)讯,今日元宇宙新鲜事有: 上海市2023年度区块链关键技术攻关专项项目立项清单公布 据上海市科学技术委员会近日发布通知,上海市2023年度“科技创新行动计划”区块链关键技术攻关…

Appium 自动化测试 —— Appium的环境搭建与设置流程!

1、Appium 环境搭建: 学习 appium 最大的难处之一在于环境的安装,安装流程比较繁琐,安装的工具和步骤也较多,以下是基于 Windows 系统下的 Android 手机端的安装流程。就像我们在用 Selenium 进行 web 自动化测试的时候一样&…

Python键鼠控制之PyAutoGUI方法

前言 PyAutoGUI 是一个 Python 库,用于在桌面应用程序中自动化鼠标和键盘操作。它提供了一组简单而强大的方法,使得开发者可以编写脚本来模拟用户的鼠标点击、键盘输入以及屏幕截图等操作。PyAutoGUI 可以用于自动化重复性任务、测试 GUI 应用程序、创建…

如何通过3D人脸扫描设备制作一个3D超写实虚拟人?

随着虚拟技术的快速发展,现如今的虚拟人逐渐逼真,比二次元虚拟偶像更接近真人形象的3D超写实虚拟人,拥有着更逼真的面部表情,更完美地融入于虚实画面。 随着3D人脸扫描设备不断发展,大大降低了高难度的3D超写实虚拟人…

Django 模型操作(六)

Django通过Model操作数据库, 不管你数据库的类型是MySql或者Sqlite, Django自动帮你生成相应数据库类型的SQL语句,所以不需要关注SQL语句和类型,对数据的操作Django帮我们自动完成。只要会写Model就可以了。 django使用对象关系映射 (Object Relational Mapping, 简称ORM)框…

FPGA UltraScale GTY 全网最细讲解,aurora 8b/10b编解码,HDMI视频传输,提供vivado工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 GT 高速接口解决方案3、详细设计方案设计框图视频源选择ADV7611解码芯片配置及采集动态彩条视频数据组包UltraScale GTY 全网最细解读UltraScale GTY 基本结构UltraScale GTY 参考时钟的选择和分配UltraScale GTY 发送和接收处理流程Ultr…

Datawhale聪明办法学Python(task2Getting Started)

一、课程基本结构 课程开源地址:课程简介 - 聪明办法学 Python 第二版 章节结构: Chapter 0 安装 InstallationChapter 1 启航 Getting StartedChapter 2 数据类型和操作 Data Types and OperatorsChapter 3 变量与函数 Variables and FunctionsChapte…

微积分-三角函数

三角函数 在处理微积分问题时,我们不可避免的会遇到三角函数。学会三角函数对于微积分是非常重要的。 基本知识 学习三角函数我们需要先学习一些基本知识。 首先要学习的是弧度的概念。弧度是一种角的度量单位,用于测量角的大小。它是根据角所对的弧长…

羊大师解答,羊奶的中医奇妙之处

羊奶素有“润肺之宝”之称,中医学认为它有着独特的作用和价值。羊奶不仅可以滋润肺部,还能保护肺脏免受外界侵害。在中医理论中,肺为人体之“金”,意味着肺具有极其重要的地位。正常肺气血充足,可以维持人体的正常生理…