局部敏感哈希-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值完全一致的概率为\(p^r\),则至少有一个不一致的概率为\(1 - p^r\)
对于k个band其hash值均不一致的概率为\((1 - p^r)^k\),则至少有一个hash值一致的概率为\(1 - (1 - p^r)^k\)

若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

posted @ 2022-12-12 20:08  hyserendipity  阅读(98)  评论(0编辑  收藏  举报