感謝大神們的無私奉獻精神........因此筆者要堅持開源,專注開源,開源就像在HPU的考試中不像其他人作弊一樣,長遠來看,會有巨大收獲。
一.背景介紹
1.1 相似性搜索簡介
高維相似性搜索在音頻、圖形和傳感器數據等特征豐富的數據的基於內容的檢索中日益重要,一般來說應用在KNN和ANN。
一個針對相似性搜索的理想索引策略應滿足如下特性。
准確性:返回的結果要和BF返回的結果近似,用查全率表示。
時空:查詢時間要是o(1)或者o(logn),空間上不能比源數據還要多,對於大數據,要在主存的容忍范圍內,這個我不會定量分析。
高維度:高維度下要表現良好。
用於KNN的樹結構有R、SR、KD、覆蓋樹和導航網等,這些方法返回的結果准確,但是在高維空間下表現不好,時間上比BF還要慢,正是如此,提出了LSH,LSH的主要思想是將在原始空間中相距近的點以較大的概率映射到同一個桶中,較遠點的點精良映射到不同的桶中。具體視線中,為了提高准確率,需要多個哈希表,哈希表數量和數據量是成正比的,大數據下空間效率無法忍受。
1.2 算法背景
傳統的LSH需要很多哈希表才能保證良好的搜索效率,多探針哈希可以智能地探測可能包含結果的多個桶,該方法受基於熵的LSH的啟發(主要是為了降低傳統LSH對空間的要求),據評測,時空效率都有提高。
二.LSH簡介
位置敏感哈希(Locality Sensitive Hashing,LSH)是近似最近鄰搜索算法中最流行的一種,它有堅實的理論依據並且在高維數據空間中表現優異。由於網絡上相關知識的介紹比較單一,現就LSH的相關算法和技術做一介紹總結,希望能給感興趣的朋友提供便利,也希望有興趣的同道中人多交流、多指正。
2.1 LSH原理
最近鄰問題(nearest neighbor problem)可以定義如下:給定n個對象的集合並建立一個數據結構,當給定任意的要查詢對象時,該數據結構返回針對查詢對象的最相似的數據集對象。LSH的基本思想是利用多個哈希函數把高維空間中的向量映射到低維空間,利用低維空間的編碼來表示高維向量。通過對向量對象進行多次哈希映射,高維向量按照其分布以及自身的特性落入不同哈希表的不同桶中。在理想情況下可以認為在高維空間中位置比較接近的向量對象有很大的概率最終落入同一個桶中,而距離比較遠的對象則以很大的概率落入不同的桶中。因此在查詢的時候,通過對查詢向量進行同樣的多次哈希操作,綜合多個哈希表中的查詢操作得到最終的結果。
使用哈希函數對整個數據集進行過濾,得到可能滿足查詢條件的點再計算距離,這樣就避免了查詢點與數據集中所有點進行距離計算,提高了查詢效率。
2.2 LSH函數族
公式不好寫。
2.2 LSH索引構建與查找
1.索引構建
在創建LSH索引時,選取的哈希函數是k個LSH函數的串聯函數,這樣就相對拉大了距離近的點沖突的概率p1與距離遠的點沖突的概率p2之間的差值,但這同時也使這兩個值一起減小了,於是需要同時使用L張哈希表來加大p1同時減小p2。通過這樣的構造過程,在查詢時,與查詢點q距離近的點就有很大的概率被取出作為候選近似最近鄰點並進行最后的距離計算,而與查詢點q距離遠的點被當作候選近似最近鄰點的概率則很小,從而能夠在很短的時間內完成查詢。
2.查找
在L張表中查找相關桶,結果取並集。
三.基於p-stable的LSH的介紹
對應海明距離的LSH稱為位采樣算法(bit sampling),該算法是比較得到的哈希值的海明距離,但是一般距離都是用歐式距離進行度量的,將歐式距離映射到海明空間再比較其的海明距離比較麻煩。於是,研究者提出了基於p-穩定分布的位置敏感哈希算法,可以直接處理歐式距離。
3.1 p-stable分布
定義:對於一個實數集R上的分布D,如果存在P>=0,對任何n個實數v1,…,vn和n個滿足D分布的變量X1,…,Xn,隨機變量ΣiviXi和(Σi|vi|p)1/pX有相同的分布,其中X是服從D分布的一個隨機變量,則稱D為 一個p穩定分布。
對任何p∈(0,2]存在穩定分布:
p=1是柯西分布,概率密度函數為c(x)=1/[π(1+x2)];
p=2時是高斯分布,概率密度函數為g(x)=1/(2π)1/2*e-x^2/2。
利用p-stable分布可以有效的近似高維特征向量,並在保證度量距離的同時,對高維特征向量進行降維,其關鍵思想是,產生一個d維的隨機向量a,隨機向量a中的每一維隨機的、獨立的從p-stable分布中產生。對於一個d維的特征向量v,如定義,隨機變量a·v具有和(Σi|vi|p)1/pX一樣的分布,因此可以用a·v表示向量v來估算||v||p 。
筆者認為引入p-stable的原因是為了保距性質(因為LSH的與構建與或構建就相當於降維)。
3.2 基於p-stable哈希函數族
p-Stable分布的LSH利用p-Stable的思想,使用它對每一個特征向量v賦予一個哈希值。該哈希函數是局部敏感的,因此如果v1和v2距離很近,它們的哈希值將相同,並被哈希到同一個桶中的概率會很大。
根據p-Stable分布,兩個向量v1和v2的映射距離a·v1-a·v2和||v1-v2||pX 的分布是一樣的。
a·v將特征向量v映射到實數集R,如果將實軸以寬度w等分,並對每一段進行標號,則a·v落到那個區間,就將此區間標號作為哈希值賦給它,這種方法構造的哈希函數對於兩個向量之間的距離具有局部保護作用。
ha,b(v) = floor(a*v+b/w)。
b在[0,w]內,其中a*v是點乘(a是行向量),不過具體實現的時候,結合與構建的話,可以吧a*v當做矩陣乘法,a的行數與構建的LSH數目k,就是一鍋端了。
3.3 碰撞概率檢測
隨機選取一個哈希函數ha,b(v),則特征向量v1和v2落在同一桶中的概率該如何計算呢?
首先定義c=||v1-v2||p,fp(t)為p-Stable分布的概率密度函數的絕對值,那么特征向量v1和v2映射到一個隨機向量a上的距離是|a·v1-a·v2|<w,即|(v1-v2)·a|<w,根據p-Stable分布的特性,||v1-v2||pX=|cX|<w,其中隨機變量X滿足p-Stable分布。
可得其碰撞概率p(c):

根據該式,可以得出兩個特征向量的沖突碰撞概率隨着距離c的增加而減小。
3.4 相似性搜索
經過哈希函數哈希之后,g(v)=(h1(v),…,hk(v)),但將(h1(v),…,hk(v))直接存入哈希表,即占用內存,又不便於查找,為解決此問題,現定義另外兩個哈希函數:

由於每一個哈希桶(Hash Buckets)gi被映射成Zk,函數h1是普通哈希策略的哈希函數,函數h2用來確定鏈表中的哈希桶。
(1)要在一個鏈表中存儲一個哈希桶gi(v)=(x1,…,xk)時,實際上存的僅僅是h2(x1,…,xk)構造的指紋,而不是存儲向量(x1,…,xk),因此一個哈希桶gi(v)=(x1,…,xk)在鏈表中的相關信息僅有標識(identifier)指紋h2(x1,…,xk)和桶中的原始數據點。
(2)利用哈希函數h2,而不是存儲gi(v)=(x1,…,xk)的值有兩個原因:首先,用h2(x1,…,xk)構造的指紋可以大大減少哈希桶的存儲空間;其次,利用指紋值可以更快的檢索哈希表中哈希桶。通過選取一個足夠大的值以很大的概率來保證任意在一個鏈表的兩個不同的哈希桶有不同的h2指紋值。
注意 就比如你有10000個數據,他們有很多容易被哈希到一起 ,假設期望是10個被哈希到一起 ,那么你表長就取個1000,這個10是個假設,看實際情況定,比如你測試 發現不同的哈希值有n個 那表長控制在1.3n就可以了,正常哈希表要減小沖突 空間利用率都在60-70%之間,其實對於10000個數據點 如果你哈希表長為10000肯定可以裝下。實際上這個參數可以事后確定。
3.5 不足與缺陷
LSH方法存在兩方面的不足:首先是典型的基於概率模型生成索引編碼的結果並不穩定。雖然編碼位數增加,但是查詢准確率的提高確十分緩慢;其次是需要大量的存儲空間,不適合於大規模數據的索引。E2LSH方法的目標是保證查詢結果的准確率和查全率,並不關注索引結構需要的存儲空間的大小。E2LSH使用多個索引空間以及多次哈希表查詢,生成的索引文件的大小是原始數據大小的數十倍甚至數百倍。
四.基於熵的LSH簡介
4.1 介紹
Entopy-based LSH構造索引和基本的LSH策略相似,但是使用了一種不同的查詢過程,該方法通過隨機生成若干個與查詢數據臨近的擾動查詢數據(perturbing query objects),將這些數據和待查詢數據一同進行哈希,將所有的結果匯總得到候選集。
Entopy-based LSH提出的對哈希桶進行采樣的方法是,每一次將與查詢數據q距離為Rp的隨機數據p'進行哈希,得到p'所對應的哈希桶;多次進行這樣的采樣動作以較高概率保證所有可能的桶都被探測(probe)到。
4.2 不足
先,該方法的采樣過程效率不足,擾動數據的生成和其哈希值計算速度慢,並且不可避免地得到重復的哈希桶。這樣,高概率被映射的桶會多次計算得到,這種計算是浪費的。
另一個缺點是,采樣過程需要對近鄰距離Rp有一定了解,這對於數據相互以來的情形是困難的。如果Rp過小,擾動查詢數據可能無法產生足夠的候選集合;如果Rp過大,就需要更多的擾動查詢數據來保證更好的查詢質量。
五.Multi-Probe LSH算法概述
Multi-Probe LSH方法的關鍵點是,使用一個經過仔細推導出的探測序列(carefully derived probing sequence),得到和查詢數據近似的多個哈希桶。
根據LSH的性質,我們可知如果與查詢數據q相近的數據沒有和q被映射到同一個桶中,它很有可能被映射到周圍的桶中(即兩個桶的哈希值只有些許差別),所以該方法的目標是定位這些臨近的桶,以便增加查找近鄰數據的機會。
- 首先,我們定義一個哈希微擾向量(hash perturbation vector)Δ=(δ1,...,δM),給定一個查詢數據q,基本LSH方法得到的哈希桶是g(q)=(h1(q),...,hM(q)),我們定義微擾Δ,我們可以探測到哈希桶g(q)+Δ。
-
- 回想LSH函數
如果我們選擇合理的W,那么相似的數據應該映射到相同或者臨近的哈希值上(較大的W使得這個值相差最多一個單位),因此,我們關注微擾向量Δ在δi={-1,0,1}
- 回想LSH函數
- 微擾向量直接作用於查詢數據的哈希值上,避免了Entopy-based LSH方法中擾動數據計算和哈希值計算的天花板問題(overhead)。該方法設計的微擾向量序列(a sequence of pertubation vectors)中,每個向量都映射成一個唯一的哈希值集合,這樣就不會重復探測一個哈希桶了。
參考文獻http://blog.csdn.net/jasonding1354/article/details/44080537
擾動序列的產生http://jasonding1354.github.io/2015/03/05/Similarity%20Search/%E3%80%90Similarity-Search%E3%80%91Multi-Probe-LSH%E7%AE%97%E6%B3%95%E6%B7%B1%E5%85%A5/
