局部敏感哈希-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