局部敏感哈希是工程实际中主流的快速 Embedding 向量最近邻搜索方法,它属于近似最近邻查找(Approximate Nearest Neighbor, ANN)的一种。

1 局部敏感哈希的基本原理

局部敏感哈希的基本思想是:让相邻的点落入同一个“桶”中,在进行最近邻搜索时,只需要在一个桶,或者相邻的几个桶内进行搜索。

LSH 算法基本原理是:用一个Hash 方法将数据从原空间映射到一个新的空间中,使得在原空间相似(距离近)的数据,在新的空间中也相似的概率很大,而在原空间不相似(距离远)的数据,在新的空间中相似的概率很小。

例如我们基于欧式距离进行最近邻搜索时,原空间为高维的欧式空间,映射的新的空间为一个低维欧式空间,我们容易推得:在原高维空间中相似的点,在低维的空间肯定也相似,但原本不相似的点在低维空间中是有一定的小概率成为相似的点的。

1.1 哈希函数(Hash Functions)应满足的条件

h(x)h(x)h(x) 表示样本 xxx 的哈希变换,xxxyyy 为两个任意的样本,d(x,y)d(x,y)d(x,y)xxxyyy 之间的距离,d1d_1d1d2d_2d2 为两个常量值,且 d1<d2d_1<d_2d1<d2p1p_1p1p2p_2p2 为两个介于 0 与 1 之间的常量值,若 h(x)h(x)h(x) 满足以下两个条件,则称哈希函数 h(x)h(x)h(x)(d1,d2,p1,p2)(d_1,d_2,p_1,p_2)(d1,d2,p1,p2)-senstive

  1. 如果 d(x,y)≤d1d(x,y)\leq d_1d(x,y)d1,则 h(x)=h(y)h(x)=h(y)h(x)=h(y) 的概率至少为 p1p_1p1
  2. 如果 d(x,y)≥d2d(x,y)\geq d_2d(x,y)d2,则 h(x)=h(y)h(x)=h(y)h(x)=h(y) 的概率至多为 p2p_2p2

通过一个或多个 (d1,d2,p1,p2)(d_1,d_2,p_1,p_2)(d1,d2,p1,p2)-senstive 的哈希函数对原始数据集合进行哈希运算,得到一个或者多个哈希表的过程就称为是 局部敏感哈希

1.2 LSH 的多桶策略

因为哈希映射过程损失了部分的距离信息,如果只使用一个哈希函数进行分桶,则会存在相似点误判的情况,解决的方式是采用多(mmm)个哈希函数同时进行分桶,同时掉进 mmm 个哈希函数同一个桶中的两个点,是相似点的概率则大大增加。

通过分桶找到候选集合后,就可以在有限的候选集合中通过遍历的方法找到最近的 KKK 个近邻。

在用多个哈希函数进行分桶时,应该通过“与”(And/交集)操作还是“或”(Or/并集)操作生成最终的候选集合呢?

  • 如果通过“与”操作生成候选集,则候选集合中近邻点的准确率将提高,候选集合的样本数量也会减少,从而使最后遍历的时间缩短,但有可能会漏掉一些近邻点;
  • 如果通过“或”操作生成候选集,那么候选集合的规模会变大,遍历的计算开销则会增加,但好处是候选集中近邻点的召回率会提高;

在实际应用中,mmm 的取值、使用“与”还是“或”需要在准确率和召回率之间权衡。

1.3 LSH 的特点

LSH 是一种从海量的高维数据集中查找近似 KKK 近邻的方法,需要注意的是,LSH 并不能保证一定能查找到最相邻的数据,

2 局部敏感哈希的基本流程

2.1 离线建立索引

  1. 根据对准确率和召回率的需求,确定哈希函数的个数 mmm,以及每个哈希函数分桶的个数 www
  2. 选取 mmm 个满足 (d1,d2,p1,p2)(d_1,d_2,p_1,p_2)(d1,d2,p1,p2)-senstive 的哈希函数
  3. 将所有数据经过 LSH 哈希函数映射到相应的桶中,构成多个哈希表

2.2 在线查找

  1. 将查询数据经过 mmm 个哈希函数得到各个相应的桶号
  2. 根据“与”或者“或”操作对桶进行合并,获得最终的候选集
  3. 计算查询数据与候选集合中每个数据点之间的相似度或者距离,返回最近的 KKK 个近邻

从上面的流程可以看出,在线查找的时间包括两个部分:

  1. 步骤1中通过 LSH 哈希函数计算桶号的时间
  2. 步骤3中遍历所有候选点,计算与查询数据点距离的时间

3 不同距离度量下的 LSH

3.1 欧式距离

假设 vvv 是高维空间中的 kkk 维向量,rrr 是一个随机向量,则内积操作可以将 vvv 映射到一维空间:

h(v)=v⋅rh(v)=v\cdot rh(v)=vr

因为一维空间也能部分保留高维空间的近似距离信息,因此就可以利用下面的哈希公式进行分桶:

hr,b(v)=⌊v⋅r+bw⌋h^{r,b}(v)=\lfloor \frac{v\cdot r + b}{w} \rfloorhr,b(v)=wvr+b

其中,⌊⌋\lfloor \rfloor是向下取整操作,www 是分桶宽度,bbb000www 之间的一个均匀分布的随机变量,目的是避免分桶边界固化。

3.2 余弦距离

余弦距离衡量的是两个向量夹角的大小,夹角越小,则两个向量越相似。

基于余弦距离的 LSH 哈希函数为:

H(v)=sign(v⋅r)H(v)=sign(v\cdot r)H(v)=sign(vr)

其中,rrr 是一个随机向量,v⋅rv\cdot rvr 可以看作是将 vvvrrr 上进行投影。

局部敏感哈希(Locality-Sensitive Hashing, LSH)相关推荐

  1. 局部敏感哈希-Locality Sensitive Hashing

    局部敏感哈希 转载请注明http://blog.csdn.net/stdcoutzyx/article/details/44456679  在检索技术中,索引一直需要研究的核心技术.当下,索引技术主要 ...

  2. 局部敏感哈希Locality Sensitive Hashing归总

    最近发邮件讨论Semantic Hashing的同学和同事很多,推荐李老师的文献列表供大家参阅:http://cs.nju.edu.cn/lwj/L2H.html 说到Hash,大家都很熟悉,是一种典 ...

  3. 局部敏感哈希(Locality sensitive hash) [3]—— 代码篇

    我们在之前的文章中Locality Sensitive Hashing(局部敏感哈希)中已经详细的说了这个算法的基本核心思想,现在我们就来一点一点的把这个算法的每一步都来实现了. 首先我们至少得构建出 ...

  4. 局部敏感哈希算法(Locality Sensitive Hashing)

    from:https://www.cnblogs.com/maybe2030/p/4953039.html 阅读目录 1. 基本思想 2. 局部敏感哈希LSH 3. 文档相似度计算 局部敏感哈希(Lo ...

  5. R语言实现︱局部敏感哈希算法(LSH)解决文本机械相似性的问题(一,基本原理)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 私认为,文本的相似性可以分为两类:一类是机械相 ...

  6. Locality Sensitive Hashing(局部敏感哈希)

    文章目录 Background运用背景 Big pitcture 整体架构 定义 Surprising Property References # 写在前面的话 酱酱,又到了程序媛拯救世界的时间,程序 ...

  7. 【时序】Reformer:局部敏感哈希(LSH)实现高效 Transformer 论文笔记

    论文名称:Reformer: The Efficient Transformer 论文下载:https://arxiv.org/abs/2001.04451 论文年份:ICLR2020 论文被引:70 ...

  8. 基于特征选择的局部敏感哈希位选择算法

    点击上方蓝字关注我们 基于特征选择的局部敏感哈希位选择算法 周文桦, 刘华文, 李恩慧 浙江师范大学数学与计算机科学学院,浙江 金华 321001 摘要:作为主流的信息检索方法,局部敏感哈希往往需要生 ...

  9. 推荐系统局部敏感哈希解决Embedding最近邻搜索问题

    文章目录 快速Embedding最近邻搜索问题 聚类.索引搜索最近邻 聚类搜索最近邻 索引搜索最近邻 局部敏感哈希及多桶策略 局部敏感哈希的基本原理 局部敏感哈希的多桶策略 局部敏感哈希代码实现 快速 ...

  10. 最近邻和K近邻及其优化算法LSH(局部敏感哈希,Locality Sensitive Hashing) Kd-Tree

    引言 在处理大量高维数据时,如何快速地找到最相似的数据是一个比较难的问题.如果是低维的小量数据,线性查找(Linear Search)就可以解决,但面对海量的高维数据集如果采用线性查找将会非常耗时.因 ...

最新文章

  1. 换种监控姿势:基于深度学习+流处理的时序告警系统
  2. Nginx 日志中记录cookie
  3. 'adb' 不是内部或外部命令,也不是可运行的程序或批处理文件
  4. 一个简单的if else优化
  5. spring源码阅读(1/4) - Bean生成
  6. 前端学习(3271):js中this的使用
  7. 算法(24)-股票买卖
  8. android判断usb已连接,android 判断是否有网络连接(usb连接电脑问题)
  9. 训练日志 2019.1.13
  10. SpringCloud与Feign
  11. 系统设计(一)——Overview
  12. 发达国家“互联网+”面面观
  13. Win8串口驱动完美支持
  14. 反射+泛型+注解(demo)
  15. 韦东山学习笔记——UART(串口)的使用
  16. 金蝶苍穹,报表查询插件
  17. srm32f4按键蜂鸣器_STM32F407通过按键控制LED和蜂鸣器
  18. python数字精度自动变化_如何在python中将一个数字转换成12位精度?
  19. 不安分的 Go 强势入侵前端,后端难道要抢前端饭碗了?
  20. matlab toolbox 介绍,Matlab Robotic Toolbox使用简介(1)

热门文章

  1. 无线路由器dhcp服务器连接失败,TP-Link路由器桥接提示“获取IP地址失败,请检查DHCP是否开启”怎么办...
  2. 第四批入围企业公示——年度TOP100智能网联供应商评选
  3. 剑指 Offer II 075. 数组相对排序(中等 排序 数组)
  4. 【MySQL】MySQL的锁与事务隔离级别详解
  5. mysql_存储过程游标、循环
  6. 【Linux】【Shell】如何循环进入文件夹批量处理数据?批量修改文件的脚本
  7. 关系型数据库设计——银行业务管理系统
  8. 蚌埠学院教务系统自动导入课程表到小米/Redmi手机小爱同学课程表使用说明
  9. 关于打卡值班制度---一个excel开发工具小函数
  10. JSP基础之网站用户管理