【轉載】局部敏感哈希算法(Locality Sensitive Hashing)

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

 

轉載這個博客呢,是因爲學習 ICLR 2020 年的文章:Reformer: The Efficient Transformer

【轉載地址】 https://www.cnblogs.com/maybe2030/p/4953039.html

關於 LSH 的其它好的博客和文檔:

http://infolab.stanford.edu/~ullman/mining/2006/lectureslides/cs345-lsh.pdf

http://www.mit.edu/~andoni/LSH/

https://blog.csdn.net/guoziqing506/article/details/53019049

Datar M, Immorlica N, Indyk P, et al. Locality-sensitive hashing scheme based on p-stable distributions[C]//Proceedings of the twentieth annual symposium on Computational geometry. ACM, 2004: 253-262.


LSH和p-stable LSH
E2LSH源碼分析–p穩定分佈LSH算法初探 
 
 

閱讀目錄

  局部敏感哈希(Locality Sensitive Hashing,LSH)算法是我在前一段時間找工作時接觸到的一種衡量文本相似度的算法。局部敏感哈希是近似最近鄰搜索算法中最流行的一種,它有堅實的理論依據並且在高維數據空間中表現優異。它的主要作用就是從海量的數據中挖掘出相似的數據,可以具體應用到文本相似度檢測、網頁搜索等領域。

 

1. 基本思想

  局部敏感哈希的基本思想類似於一種空間域轉換思想,LSH算法基於一個假設,如果兩個文本在原有的數據空間是相似的,那麼分別經過哈希函數轉換以後的它們也具有很高的相似度;相反,如果它們本身是不相似的,那麼經過轉換後它們應仍不具有相似性。

  哈希函數,大家一定都很熟悉,那麼什麼樣的哈希函數可以具有上述的功能呢,可以保持數據轉化前後的相似性?當然,答案就是局部敏感哈希。

 

2. 局部敏感哈希LSH

  局部敏感哈希的最大特點就在於保持數據的相似性,我們通過一個反例來具體介紹一下。

  假設一個哈希函數爲Hash(x) = x%8,那麼我們現在有三個數據分別爲255、257和1023,我們知道255和257本身在數值上具有很小的差距,也就是說它們在三者中比較相似。我們將上述的三個數據通過Hash函數轉換:

  Hash(255) = 255%8 = 7;

  Hash(257) = 257%8 = 1;

  Hash(1023) = 1023%8 = 7;

  我們通過上述的轉換結果可以看出,本身很相似的255和257在轉換以後變得差距很大,而在數值上差很多的255和1023卻對應相同的轉換結果。從這個例子我們可以看出,上述的Hash函數從數值相似度角度來看,它不是一個局部敏感哈希,因爲經過它轉換後的數據的相似性喪失了。

  我們說局部敏感哈希要求能夠保持數據的相似性,那麼很多人懷疑這樣的哈希函數是否真的存在。我們這樣去思考這樣一個極端的條件,假設一個局部敏感哈希函數具有10個不同的輸出值,而現在我們具有11個完全沒有相似度的數據,那麼它們經過這個哈希函數必然至少存在兩個不相似的數據變爲了相似數據。從這個假設中,我們應該意識到局部敏感哈希是相對的,而且我們所說的保持數據的相似度不是說保持100%的相似度,而是保持最大可能的相似度

  對於局部敏感哈希“保持最大可能的相似度”的這一點,我們也可以從數據降維的角度去考慮。數據對應的維度越高,信息量也就越大,相反,如果數據進行了降維,那麼毫無疑問數據所反映的信息必然會有損失。哈希函數從本質上來看就是一直在扮演數據降維的角色。

 

 3. 文檔相似度計算

  我們通過利用LSH來實現文檔的相似度計算這個實例來介紹一下LSH的具體用法。

  3.1 Shingling

  假設現在有4個網頁,我們將它們分別進行Shingling(將待查詢的字符串集進行映射,映射到一個集合裏,如字符串“abcdeeee", 映射到集合”(a,b,c,d,e)", 注意集合中元素是無重複的,這一步驟就叫做Shingling, 意即構建文檔中的短字符串集合,即shingle集合。),得到如下的特徵矩陣:

其中“1”代表對應位置的Shingles在文檔中出現過,“0”則代表沒有出現過。

  在衡量文檔的相似度中,我們有很多的方法去完成,比如利用歐式距離、編輯距離、餘弦距離、Jaccard距離等來進行相似度的度量。在這裏我們運用Jaccard相似度。接下來我們就要去找一種哈希函數,使得在hash後儘量還能保持這些文檔之間的Jaccard相似度,即:

  我們的目標就是找到這樣一種哈希函數,如果原來文檔的Jaccard相似度高,那麼它們的hash值相同的概率高,如果原來文檔的Jaccard相似度低,那麼它們的hash值不相同的概率高,我們稱之爲Min-hashing(最小哈希)。

  3.2 Min-hashing

  Min-hashing定義爲:特徵矩陣按行進行一個隨機的排列後,第一個列值爲1的行的行號。舉例說明如下,假設之前的特徵矩陣按行進行的一個隨機排列如下:

元素

S1

S2

S3

S4

0

0

1

0

成功

0

0

1

1

1

0

0

0

減肥

1

0

1

1

0

1

0

1

  最小哈希值:h(S1)=3,h(S2)=5,h(S3)=1,h(S4)=2.

  爲什麼定義最小hash?事實上,兩列的最小hash值就是這兩列的Jaccard相似度的一個估計,換句話說,兩列最小hash值同等的概率與其相似度相等,即P(h(Si)=h(Sj)) = sim(Si,Sj)。爲什麼會相等?我們考慮Si和Sj這兩列,它們所在的行的所有可能結果可以分成如下三類:

  (1)A類:兩列的值都爲1;

  (2)B類:其中一列的值爲0,另一列的值爲1;

  (3)C類:兩列的值都爲0.

  特徵矩陣相當稀疏,導致大部分的行都屬於C類,但只有A、B類行的決定sim(Si,Sj),假定A類行有a個,B類行有b個,那麼sim(si,sj)=a/(a+b)。現在我們只需要證明對矩陣行進行隨機排列,兩個的最小hash值相等的概率P(h(Si)=h(Sj))=a/(a+b),如果我們把C類行都刪掉,那麼第一行不是A類行就是B類行,如果第一行是A類行那麼h(Si)=h(Sj),因此P(h(Si)=h(Sj))=P(刪掉C類行後,第一行爲A類)=A類行的數目/所有行的數目=a/(a+b),這就是最小hash的神奇之處。

  Min-hashing的具體做法可以根據如下進行表述:

  返回到我們的實例,我們首先生成一堆隨機置換,把特徵矩陣的每一行進行置換,然後hash function就定義爲把一個列C hash成一個這樣的值:就是在置換後的列C上,第一個值爲1的行的行號。如下圖所示:

  圖中展示了三個置換,就是彩色的那三個,我現在解釋其中的一個,另外兩個同理。比如現在看藍色的那個置換,置換後的Signature Matrix爲:

  然後看第一列的第一個是1的行是第幾行,是第2行,同理再看二三四列,分別是1,2,1,因此這四列(四個document)在這個置換下,被哈希成了2,1,2,1,就是右圖中的藍色部分,也就相當於每個document現在是1維。再通過另外兩個置換然後再hash,又得到右邊的另外兩行,於是最終結果是每個document從7維降到了3維。我們來看看降維後的相似度情況,就是右下角那個表,給出了降維後的document兩兩之間的相似性。可以看出,還是挺準確的,回想一下剛剛說的:希望原來documents的Jaccard相似度高,那麼它們的hash值相同的概率高,如果原來documents的Jaccard相似度低,那麼它們的hash值不相同的概率高,如何進行概率上的保證?Min-Hashing有個驚人的性質:

  就是說,對於兩個document,在Min-Hashing方法中,它們hash值相等的概率等於它們降維前的Jaccard相似度。

  注:在上述例子中,我們還可以採取歐氏距離等相似度量來替代Jaccard相似度,這時候LSH相應的策略也需要進行改變,從而使得最後的hash值等於降爲前的相似度。

作者:Poll的筆記 
博客出處:http://www.cnblogs.com/maybe2030/ 
本文版權歸作者和博客園所有,歡迎轉載,轉載請標明出處。 
<如果你覺得本文還不錯,對你的學習帶來了些許幫助,請幫忙點擊右下角的推薦>

 

 



 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章