雜湊學習演算法之一:ANN背景介紹
一、由ANN進入Hash
NN,即最近鄰(nearest neighbor),定義在一個數據集X中,查詢點q的最近鄰是NN(q)=argmin dist(q,x) 其中x∈X。直接的表示,即為KNN查詢,也就是需要找到K個最近鄰。一個點x和查詢點q的距離取決於具體的查詢問題。例如:d維空間的資料集,和歐式距離的場景。
在低維空間時,這些情況都可以得到有效解決(比如k-d tree演算法)。然而,在大規模高維資料時,有些演算法的計算消耗甚至比線性消耗還要大。所以,ANN(Approximate nearest neighbors)近似最近鄰查詢被提出,主要是從兩個方面實現近鄰查詢。
- error-constrained nn
誤差約束最近鄰查詢,包括(1+ε)-approximate 最近鄰查詢、R-near neighbor近鄰查詢 - time-constrained nn
時間約束最近鄰查詢,是限制查詢時間。它的目標是實現返回的k個最近鄰點儘可能的與實際近鄰點相似,同時查詢代價儘可能小。
那這和我們研究的雜湊演算法有什麼關係呢?雜湊是在ANN中廣泛應用的一種解決方案。雜湊方法是將參考點和查詢點對映到目標物件,ANN從而轉換為對目標物件或者一部分原始參考點的處理。
二、Hash執行ANN查詢
第一部分中最後提到經雜湊函式轉換後,得到的目標物件,即為Hash碼。
2.1 hash函式
雜湊函式定義為y=h(x),其中h(.)是雜湊函式,y是雜湊碼。y可能是一個整數,也可能是一個二進位制值:1或0、1或-1。
在實際應用中,一般是使用多個雜湊函式計算複合雜湊碼,y=h(x),其中h=[h1,h2,h3…hM]^T ,y=[y1,y2,y3…yM]^T。
2.2 應用ANN
一般hash在ANN應用中,有兩種基本的方法:雜湊表查詢(hash table lookup)和雜湊碼排序(hash code rank)。
- hash table lookup
雜湊表查詢是減少距離計算的數量。它採用雜湊桶的資料結構,每一個參考點被放置到一個桶h(x)中,每一個桶可由一個雜湊碼找到。常規的雜湊演算法是儘可能的降低碰撞率,而雜湊表的目標
為提高召回率,一般有兩種方式:1.單表雜湊 單張雜湊表,需訪問多個雜湊桶。2.多表雜湊 構造多張雜湊表。(詳細解釋參見下一節) - hash code ranking
雜湊碼排序是一種窮盡檢索。它的執行辦法是:依據查詢點和引用點的雜湊碼比較他們之間的距離,獲得最近的候選列表。接著重排序,使用原始特徵對候選項進行距離計算,獲得最近鄰點。
基於LSH的雜湊表查詢在實際中較少採用,而基於量化的雜湊表查詢被廣泛應用獲得較粗的候選列表。雜湊碼排序由於遍歷所有的候選列表,在查詢效率上不及雜湊表查詢。兩者各有優缺點。
一種常用的方法是:首先使用倒排索引獲得較小的候選列表(可視為雜湊表),使用更長的雜湊碼計算查詢點到候選列表的距離,從而提供前幾個候選項,最後在原始空間上重排序候選項。