標籤:lsh 局部敏感雜湊雜湊
局部敏感雜湊
轉載請註明http://blog.csdn.net/stdcoutzyx/article/details/44456679
在檢索技術中,索引一直需要研究的核心技術。當下,索引技術主要分為三類:基於樹的索引技術(tree-based index)、基於雜湊的索引技術(hashing-based index)與基於詞的倒排索引(visual words based inverted index)[1]。本文主要對雜湊索引技術進行介紹。
雜湊技術概述
在檢索中,需要解決的問題是給定一個查詢樣本query,返回與此query相似的樣本,線性搜尋耗時耗力,不能承擔此等重任,要想快速找到結果,必須有一種方法可以將搜尋空間控制到一個可以接受的範圍,雜湊在檢索中就是承擔這樣的任務,因而,這些雜湊方法一般都是局部敏感(Locality-sensitive)的,即樣本越相似,經過雜湊後的值越有可能一樣。所以,本文中介紹的技術都是局部敏感雜湊(Locality Sensitive Hashing,LSH),與hashmap、hashtable等資料結構中的雜湊函數有所不同。
雜湊技術分類
圖 1 LSH分層法使用
對於雜湊技術,可以按照不同的維度對齊進行劃分。
按照其在檢索技術中的應用方法來劃分,可以分為分層法和雜湊碼法:
分層法即為在資料查詢過程中使用雜湊技術在中間添加一層,將資料劃分到桶中;在查詢時,先對query計算桶標號,找到與query處於同一個桶的所有樣本,然後按照樣本之間的相似性計算方法(比如歐氏距離、餘弦距離等)使用未經處理資料計算相似性,按照相似性的順序返回結果,在該方法中,通常是一組或一個雜湊函數形成一個表,表內有若干個桶,可以使用多個表來提高查詢的準確率,但通常這是以時間為代價的。分層法的1所示。在圖1中,H1、H2等代表雜湊表,g1、g2等代表雜湊映射函數。
分層法的代表演算法為E2LSH[2]。
雜湊碼法則是使用雜湊碼來代替未經處理資料進行儲存,在分層法中,未經處理資料仍然需要以在第二層被用來計算相似性,而雜湊碼法不需要,它使用LSH函數直接將未經處理資料轉換為雜湊碼,在計算相似性的時候使用hamming距離來衡量。轉換為雜湊碼之後的相似性計算非常之快,比如,可以使用64bit整數來儲存雜湊碼,計算相似性只要使用同或操作就可以得到,唰唰唰,非常之快,忍不住用擬聲詞來表達我對這種速度的難言之喜,還望各位讀者海涵。
雜湊碼法的代表演算法有很多,比如KLSH[3]、Semantic Hashing[4]、KSH[5]等。
以我看來,兩者的區別在於如下幾點:
在對雜湊函數的要求上,雜湊碼方法對雜湊函數的要求更高,因為在分層法中,即便雜湊沒有計算的精確,後面還有未經處理資料直接計算相似性來保底,得到的結果總不會太差,而雜湊碼沒有後備保底的,勝則勝敗則敗。
在查詢的時間複雜度上,分層法的時間複雜度主要在找到桶後的樣本未經處理資料之間的相似性計算,而雜湊碼則主要在query的雜湊碼與所有樣本的雜湊碼之間的hamming距離的相似計算。雜湊碼法沒有太多其他的需要,但分層法中的各個桶之間相對較均衡方能使複雜度降到最低。按照我的經驗,在100W的5000維資料中,KSH比E2LSH要快一個數量級。
在雜湊函數的使用上,兩者使用的雜湊函數往往可以互連,E2LSH使用的p-stable LSH函數可以用到雜湊碼方法上,而KSH等雜湊方法也可以用到分層法上去。
上述的區別分析是我自己分析的,如果有其他意見歡迎討論。
按照雜湊函數來劃分,可以分為無監督和有監督兩種:
- 無監督,雜湊函數是基於某種機率理論的,可以達到局部敏感效果。如E2LSH等。
- 有監督,雜湊函數是從資料中學習出來的,如KSH、Semantic Hashing等。
一般來說,有監督演算法比無監督演算法更加精確,因而也更常用於雜湊碼法中。
本文中,主要對無監督的雜湊演算法進行介紹。
Origin LSH
最原始的LSH演算法是1999年提出來的[6]。在本文中稱之為Origin LSH。
Embedding
Origin LSH在雜湊之前,首先要先將資料從L1準則下的歐幾裡得空間嵌入到Hamming空間。在做此embedding時,有一個假設就是原始點在L1準則下的效果與在L2準則下的效果相差不大,即歐氏距離和曼哈頓距離的差別不大,因為L2準則下的歐幾裡得空間沒有直接的方法嵌入到hamming空間。
Embedding演算法如下:
- 找到所有點的所有座標值中的最大值C;
- 對於一個點P來說,P=(x1,x2,…,xd),d是資料的維度;
- 將每一維xi轉換為一個長度為C的0/1序列,其中序列的前xi個值為1,剩餘的為0.
- 然後將d個長度為C的序列串連起來,形成一個長度為Cd的序列.
這就是embedding方法。注意,在實際運算過程中,通過一些策略可以無需將embedding值預先計算出來。
Algorithm of Origin LSH
在Origin LSH中,每個雜湊函數的定義如下:
即輸入是一個01序列,輸出是該序列中的某一位上的值。於是,hash函數簇內就有Cd個函數。
在將資料對應到桶中時,選擇k個上述雜湊函數,組成一個雜湊映射,如下:
再細化,LSH的演算法步驟如下:
- 從[0,Cd]內取L個數,形成集合G,即組成了一個桶雜湊函數g。
- 對於一個向量P,得到一個L維雜湊值,即P|G,其中L維中的每一維都對應一個雜湊函數h。
- 由於直接以上步中得到的L維雜湊值做桶標號不方便,因而再進行第二步雜湊,第二步雜湊就是普通的雜湊,將一個向量映射成一個實數。
其中,a是從[0,M-1]中隨機抽選的數字。
這樣,就把一個向量映射到一個桶中了。
LSH based on p-stable distribution
該方法由[2]提出,E2LSH[7]是它的一種實現。
p-stable分布
定義:對於一個實數集R上的分布D,如果存在P>=0,對任何n個實數v1,…,vn和n個滿足D分布的變數X1,…,Xn,隨機變數ΣiviXi和(∑i|vi|p)(1/p)X有相同的分布,其中X是服從D分布的一個隨機變數,則稱D為一個p穩定分布。
對任何p∈(0,2]存在穩定分布。P=1時是柯西分布;p=2時是高斯分布。
當p=2時,兩個向量v1和v2的映射距離a·v1-a·v2和||v1-v2||pX的分布是一樣的,此時對應的距離計算方式為歐式距離。
利用p-stable分布可以有效近似高維特徵向量,並在保證度量距離的同時,對高維特徵向量進行降維,其關鍵思想是,產生一個d維的隨機向量a,隨機向量a中的每一維隨機的、獨立的從p-stable分布中產生。對於一個d維的特徵向量v,如定義,隨機變數a·v具有和(∑i|vi|p)(1/p)X一樣的分布,因此可以用a·v表示向量v來估算||v||p。
E2LSH
基於p-stable分布,並以‘雜湊技術分類’中的分層法為使用方法,就產生了E2LSH演算法。
E2LSH中的雜湊函數定義如下:
其中,v為d維未經處理資料,a為隨機變數,由常態分佈產生; w為寬度值,因為a?v+b得到的是一個實數,如果不加以處理,那麼起不到桶的效果,w是E2LSH中最重要的參數,調得過大,資料就被劃分到一個桶中去了,過小就起不到局部敏感的效果。b使用均勻分布隨機產生,均勻分布的範圍在[0,w]。
與Origin LSH類似,選取k個上述的雜湊函數,組成一個雜湊映射,效果2所示:
圖 2 E2LSH映射
但是這樣,得到的結果是(N1,N2,…,Nk),其中N1,N2,…,Nk在整數域而不是只有0,1兩個值,這樣的k元組就代表一個桶。但將k元組直接當做桶標號存入雜湊表,佔用記憶體且不便於尋找,為了方便儲存,設計者又將其分層,使用數組+鏈表的方式,3所示:
圖 3 E2LSH為儲存桶標號而產生的數組+鏈表二層結構
對每個形式為k元組的桶標號,使用如下h1函數和h2Function Compute得到兩個值,其中h1的結果是數組中的位置,數組的大小也相當於雜湊表的大小,h2的結果值作為k元組的代表,連結到對應數組的h1位置上的鏈表中。在下面的公式中,r’為[0,prime-1]中依據均勻分布隨機產生。
經過上述組織後,查詢過程如下:
- 對於查詢點query,
- 使用k個雜湊Function Compute桶標號的k元組;
- 對k元組計算h1和h2值,
- 擷取雜湊表的h1位置的鏈表,
- 在鏈表中尋找h2值,
- 擷取h2值位置上儲存的樣本
- Query與上述樣本計算精確的相似性,並排序
- 按照順序返回結果。
E2LSH方法存在兩方面的不足[8]:首先是典型的基於機率模型產生索引編碼的結果並不穩定。雖然編碼位元增加,但是查詢準確率的提高確十分緩慢;其次是需要大量的儲存空間,不適合於大規模資料的索引。E2LSH方法的目標是保證查詢結果的準確率和查全率,並不關注索引結構需要的儲存空間的大小。E2LSH使用多個索引空間以及多次雜湊表查詢,產生的索引檔案的大小是未經處理資料大小的數十倍甚至數百倍。
Hashcode of p-stable distribution
E2LSH可以說是分層法基於p-stable distribution的應用。另一種當然是轉換成hashcode,則定義雜湊函數如下:
其中,a和v都是d維向量,a由常態分佈產生。同上,選擇k個上述的雜湊函數,得到一個k位的hamming碼,按照”雜湊技術分類”中描述的技術即可使用該演算法。
Reference
[1]. Ai L, Yu J, He Y, et al. High-dimensional indexing technologies for large scale content-based image retrieval: a review[J]. Journal of Zhejiang University SCIENCE C, 2013, 14(7): 505-520.
[2]. 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.
[3]. Kulis B, Grauman K. Kernelized locality-sensitive hashing[J]. Pattern Analysis and Machine Intelligence, IEEE Transactions on, 2012, 34(6): 1092-1104.
[4]. Salakhutdinov R, Hinton G. Semantic hashing[J]. International Journal of Approximate Reasoning, 2009, 50(7): 969-978.
[5]. Liu W, Wang J, Ji R, et al. Supervised hashing with kernels[C]//Computer Vision and Pattern Recognition (CVPR), 2012 IEEE Conference on. IEEE, 2012: 2074-2081.
[6]. Gionis A, Indyk P, Motwani R. Similarity search in high dimensions via hashing[C]//VLDB. 1999, 99: 518-529.
[7]. http://web.mit.edu/andoni/www/LSH/
[8]. http://blog.csdn.net/jasonding1354/article/details/38237353
局部敏感雜湊-Locality Sensitive Hashing