局部敏感哈希-Locality Sensitive Hashing-LSH
问题定义
对于一个给定的query,从数据库中召回所有dist<thres的docs。
问题求解
Naive的方法需要O(n)的时间复杂度,LSH只需要O(1)即可实现。
具体来说分为三步:
1)抽取Embedding(LSH中称为Shingling)
2)降维(LSH常用MinHash)
3)LSH
前两步比较简单,也是惯用方式,最后一步LSH算法其实思想也比较好想。
即对于降维后的emb,将其划分为k个bands,每个band有r个row。
核心思路:
【Naive】emb -> hash分桶,同一个桶里的就是相似的文档,精度较差,容易漏召
【LSH】由于emb局部敏感,因此对emb做分段处理,对每个段进行hash分桶,只要有一个分段和别的emb共享同一个桶,那么就认为相似,这样可以大大提高精度和召回,具体概率见概率分析
对于每个band进行hash,任意两个doc如果有>=1个band被分到一个桶中,我们认为他们是相似的。
对于query,我们需要做的就是分band然后hash,最后将同一个桶中所有的doc取出即是最终的答案。
概率分析
设Sim(q, doc) = p,即q和doc的相似度为p。
我们将emb分成k个band且每个band有r个row。
那么对于一个band,其hash值完全一致的概率为,则至少有一个不一致的概率为。
对于k个band其hash值均不一致的概率为,则至少有一个hash值一致的概率为
若p = 0.8,至少有一个hash值一致的概率为0.99965%;
若p = 0.3,至少有一个hash值一致的概率为4.74%。
Reference
https://www.bilibili.com/video/BV1SC4y187x1?p=3&vd_source=6e6b2d418dac7b0fac4ea954a9be1106
http://web.stanford.edu/class/cs246/slides/03-lsh.pdf
https://zhuanlan.zhihu.com/p/108181478
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2019-12-12 python-pathlib