【最近邻算法】局部敏感哈希(Locality-Sensitive Hashing,LSH)

LSH是一种在海量数据近似查找最近邻方法,其基本思想是,在原始空间中相邻的集合,经过相同的映射后,在新的空间中仍然相邻(映射到一个桶里)的概率很大,而不相邻的数据点映射到一个桶里的概率很小。在推理的时候,我们把target映射到桶内,target的最近邻可以直接在这个桶内找。我们可以使用哈希函数实现映射,而通常的哈希函数不具备LSH中对映射的定义,这里首先介绍一种特殊的哈希函数:MinHash。

一、MinHash

MinHash满足一个定义:在原始空间中相邻的两个集合,在经过MinHash映射后,在新的空间仍然相邻。描述两个集合的距离有多种:汉明距离、编辑距离、余弦距离、Jaccard距离等。我们这里使用Jaccard距离作为两个集合的距离衡量指标。

Jaccard相似度的定义为:

\[Jaccard(A, B)=\frac{|A \cap B|}{|A \cup B|} \]

其中,\(|A \cap B|\) 表示\(A\)\(B\)两个集合中相同的元素数量,\(|A \cup B|\)表示两个集合的总元素数量。

假设两个集合,\(S_1=\{a,d,e\}\)\(S_2=\{c,e\}\),假设全集为\(U=\{a,b,c,d,e\}\),则两个集合可以分别使用multi-hot编码为1001100101。MinHash算法的思路是:

  1. 找出集合\(S_1\)的multi-hot编码的第一个不为0的值的index;
  2. 使用映射h1、h2、...、hn将multi-hot随机打乱\(n\)次,重复步骤1,最后得到一个长度为\(n\)的向量。
  3. 按照步骤1、2,求出所有集合的向量。

接下来证明,为什么在经过MinHash映射后,在新的空间仍然相邻。针对\(S_1\)\(S_2\)的multi-hot编码,其对应位的状态共三种:

  • a类:都为1
  • b类:两者只有一个为1
  • c类:都为0

我们对这两个集合做一个\(n=1\)的MinHash。由MinHash的定义,此时不存在状态c,这两个hash值相同的概率是\(\frac{num(a)}{num(a)+num(b)}\),而\(num(a)=|A \cap B|\)\(num(a)+num(b)=|A \cup B|\),即这两个hash值相同的概率为\(Jaccard(A, B)\),即映射为长度为n的向量后,这两个向量的相似度为\(Jaccard(A, B)\)的估计。可以把MinHash看作一个降维方法,将原始的稀疏向量映射为一个\(n\)维低维向量,并保证映射前后集合之间的距离关系不变。

二、局部敏感哈希LSH

在得到降维后的向量后,我们对当前向量进行分桶。前期准备阶段与推理阶段的具体操作如下:

  1. 将长度为n的向量均分为\(k\)个区间,每份中含有\(t\)个MinHash值,其中\(t \times k = n\)。每个位置MinHash值相等的概率为\(p=Jaccard(A, B)\),则每个区间所有值相等的概率为\(p^t\),在\(k\)个区间中,至少有一个区间相等的概率为\(1-(1-p^t)^k\)
  2. 我们使用一个碰撞概率小的hash函数,对一个向量的每个区间分别做hash映射,将这个向量映射到不同的几个桶中。
  3. 在线推理时,我们只需要求对应稀疏向量的MinHash后的\(n\)维向量,然后分\(k\)个区间做hash分桶,最后取出\(k\)个桶中的内容作为候选。

步骤1中,\(1-(1-p^t)^k\)的图像如下图,可知,当相似度越高时,分到一个桶里的概率越高。

需要注意的是,MinHash并不是唯一可以用在LSH的哈希算法,其最大的作用是用于降维,并保证两条长度为\(n\)的向量中,任意对应位置的一段向量的相似度都能够估计原始空间中两条向量的相似度。

posted @ 2021-09-08 16:02  tmpUser  阅读(937)  评论(0编辑  收藏  举报