向量檢索算法


通常來說,面向向量的相似性檢索的方法分為精確檢索和近似檢索兩類。

精確檢索

精確檢索的本質就是線性查找。線性查找通過在整個向量空間內,遍歷所有已存向量計算其與檢索向量的距離,通常是計算歐幾里德距離或者點積。歐氏距離最近的向量或者點積最大的向量就是相似度最高的向量。線性查找算法簡單,不需要建立額外的數據結構和存儲空間。
例如,通過使用例如 Intel 架構下的 MKL 或者使用 NVIDIA GPU 的 cublas 等並行計算庫加速,對於中小規模的向量集的相似性檢索是合適的。但是,由於線性查找的時間復雜度是 O(Nd),其中 N 是向量集的規模,d 是向量的維度,隨着向量集的規模的增大或者向量維度的增加,線性查找就會顯得力不從心。

近似檢索

無論是在學界還是工業界,向量索引是一個研究得比較多的問題,向量索引學術上對應的專有名詞叫Approximate Nearest Neighbor Search (ANNS),即近似最近鄰搜索。為什么是近似,而不是我們想要的精確?這就是精度與時間、算力資源的折中,采用了犧牲精度換取時間和空間的方式,從海量的樣本中實時獲取跟查詢最相似的樣本。
所謂近似檢索,就是通過聚類、降維或者編碼等方式,將原來需要在整個高維向量空間內的搜索,轉換為在小范圍空間或者相對低維的向量空間內搜索的算法。這類算法的特點是,檢索的時間復雜度小於 O(Nd),但是真正用來搜索之前,需要用一個向量分布類似的一個訓練集來訓練,獲得一個產生合理數據划分或者編碼的模型。然后再利用這個模型,使用額外的存儲空間,建立對整個高維向量的索引。
目前,近似檢索的算法通常分為以下幾種:

  • 基於樹的搜索算法
    基於樹的搜索方法通常根據向量的分布特征采用一系列的超平面將高維向量空間划分為多個子空間,並采用樹型結構維護空間划分的層次關系。樹中的每一個非葉子節點對應於一個子空間和一組超平面。超平面將該節點的子空間進一步划分為更小的子空間,每一個子空間與該節點的一個孩子節點相對應。由此,樹中的根節點對應的是完整的向量空間,除根節點之外的每一個節點均對應於其父節點空間被划分后得到的一個子空間。而每個葉子節點對應於一個不可再分的子空間。依據上述規則,對於向量集合中的各個向量都可以找到樹中的一個葉子節點與之對應。在向量搜索的過程中,可通過樹型結構快速的搜索到若干個距離目標向量較近的葉子節點。通過依次計算目標向量與上述葉子節點所對應各向量的距離即可近似得到與目標向量最相似的向量。
    基於樹的方法采用樹這種數據結構的方法來表達對全空間的划分,其中又以KD樹最為經典.KD樹選擇從哪一維度進行開始划分的標准,采用的是求每一個維度的方差,然后選擇方差最大的那個維度開始划分。這里有一個比較有意思的問題是:為何要選擇方差作為維度划分選取的標准 ?我們都知道,方差的大小可以反映數據的波動性。方差大表示數據波動性越大,選擇方差最大作為划分空間標准的好處在於,可以使得所需的划分面數目最小,反映到樹數據結構上,可以使得我們構建的KD樹的樹深度盡可能的小。另外,常用的還有spotify開源的Annoy算法。
    采用基於樹的搜索方法可以快速的定位到與目標向量最為相似的若干個葉子節點,從而有效地避免了很多無效比對,提高了搜索效率。然而,隨着向量維度的提高,計算用於划分空間的超平面的開銷將顯著增大,從而影響樹型結構的構建效率。此外,如果目標向量與某一超平面距離較近,該方法的搜索結果可能會丟失大量的與目標相似的向量,從而影響查詢的准確度。

  • 基於哈希的空間划分法
    基於哈希的搜索方法采用一組局部敏感哈希函數對向量集合進行划分。通過采用局部敏感哈希函數可以對每一個向量計算出一個與之相對應的哈希值。對於距離較接近的向量,其哈希值也較為接近。該方法將各局部敏感哈希函數的值域划分為若干個區間,從而每個向量相應於特定的局部敏感哈希函數,均有一個區間與之對應。該方法通過哈希值的區間對向量進行划分,若兩向量對於任一哈希函數其哈希值所在的區間均相同,則這兩個向量屬於同一分類。在搜索時,通過相同的局部敏感哈希函數和區間划分方法可以計算得到目標向量所屬分類。然后可依次計算該分類以及該分類的鄰近分類中所有向量與目標向量的距離獲取距離最小的向量。 基於哈希的方法,通過計算目標向量所在分類以及鄰近的分類可以有效的排除掉大量與目標向量相似度較低的向量,減少了向量相似度的計算次數。但是,該方法通常只能對向量空間進行均勻划分,而實際應用中向量在空間中的分布通常是不均勻的,從而導致各個分類中向量的數量相差巨大,並進一步影響搜索的效率和准確度。
    LSH(Locality-Sensitive Hashing)是hash方法的代表算法。它是用hash的方法把數據從原空間哈希到一個新的空間中,使得在原始空間的相似的數據,在新的空間中也相似的概率很大,而在原始空間的不相似的數據,在新的空間中相似的概率很小。
    對於小數據集和中規模的數據集(幾個million-幾十個million),基於LSH的方法的效果和性能都很不錯。這方面有2個開源工具FALCONN和NMSLIB。

  • 向量量化的編碼算法
    基於向量量化的方法通常采用聚類的方式對向量集合中的向量進行划分。該方法通過 k-means 等聚類方法將向量集合划分為多個聚類,並記錄各個聚類的中心點的坐標。在向量搜索時,首先依次比對目標向量與各個聚類中心的距離,選擇出與目標向量最為接近的若干個聚類中心。接下來獲取這些聚類中心所對應聚類中的所有向量,依次計算各向量與目標向量的距離,選擇出距離最為接近的若干個向量。 該方法采用聚類的方法將數據集合划分,從而在搜索過程中排除掉與目標向量相似度較低的向量。然而,該方法在高維向量的搜索中容易遺漏部分潛在的與目標向量距離較近的向量,從而難以達到較高的准確度。

  • 基於圖的搜索方法
    與以上方法不同,基於圖的搜索方法通常不對向量空間進行划分。該方法預先計算向量集合中各向量間的相似度,並以圖的形式維護向量之間的相似關系。具體而言,在圖中每個向量是一個節點,距離較近的節點之間通過邊相互連接。在搜索時,從一個或者多個起始節點出發進行探索。每次探索一個節點時,計算該節點的所有鄰居節點與目標向量的相似度,並基於當前探索的結果,選擇與目標向量最為相似且未被探索的節點作為下一次需要探索的節點並開始下一次探索。以上過程在無法找到新的探索節點時結束,並將探索過程中所有被訪問的節點中與目標向量最為相似的節點作為搜索結果。 基於圖的方法通常有較高的搜索效率和准確度,但是構建搜索圖的過程中需要進行大量的向量距離計算,從而導致極大的計算開銷。除此之外,在需要向向量集合中增加新的向量時,通常需要對搜索圖進行重新構建,從而嚴重影響了向量的插入效率。

其他特征向量檢索工具

目前,市場上的特征向量檢索工具主要包括以下幾種:

  • FAISS
    FAISS 是 Facebook AI 基於 C++ 語言編寫的一款開源、針對多媒體文件相似性搜索的算法庫。FAISS 支持開發人員對檢索速度、內存使用和檢索精度等的優化設置。但它僅僅是一個算法庫,並且對開發人員有較高的使用要求。

  • SPTAG
    SPTAG 是由 Microsoft 於2019年5月發布的,基於最近鄰搜索的向量檢索算法庫。
    SPTAG 的優點是搜索速度快,毫秒內智能搜索數十億條向量,並且在查詢精確度和內存占用上表現佳。但缺點也很明顯,其建圖時間長,而且每此添加新向量進數據庫,必須重新建圖。
    綜上所述,當前工業界針對向量檢索的實現中,並沒有一個能擅長所有場景的萬能算法。同時現有的實現也都還只是算法庫,而並非一個系統。隨着 AI 應用的大規模落地,提供一個面向海量特征向量檢索的數據庫系統,已經成為市場對於數據庫廠商提出的新需求。

參考:
圖像檢索:基於內容的圖像檢索技術


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM