隨著深度學習的不斷豐富發展,基於embedding的向量召回引擎的使用場景越來越豐富,本文簡要介紹一下,向量召回演算法的基本分類以及現在流行的實現方式。
通常來說,面向向量的相似性檢索的方法分為精確檢索和近似檢索兩類。
精確檢索的本質就是線性查詢。線性查詢通過在整個向量空間內,遍歷所有已存向量計算其與檢索向量的距離,通常是計算歐幾里德距離或者點積。歐氏距離最近的向量或者點積最大的向量就是相似度最高的向量。線性查詢演算法簡單,不需要建立額外的資料結構和儲存空間。
由於線性查詢的時間複雜度是 o(nd),其中 n 是向量集的規模,d 是向量的維度,隨著向量集的規模的增大或者向量維度的增加,線性查詢就會顯得力不從心。
所謂近似檢索,就是通過聚類、降維或者編碼等方式,將原來需要在整個高維向量空間內的搜尋,轉換為在小範圍空間或者相對低維的向量空間內搜尋的演算法。這類演算法的特點是,檢索的時間複雜度小於 o(nd),但是真正用來搜尋之前,需要用乙個向量分布類似的乙個訓練集來訓練,獲得乙個產生合理資料劃分或者編碼的模型。然後再利用這個模型,使用額外的儲存空間,建立對整個高維向量的索引。目前,近似檢索的演算法通常分為以下幾種:
基於樹的搜尋方法通常根據向量的分布特徵採用一系列的超平面將高維向量空間劃分為多個子空間,並採用樹型結構維護空間劃分的層次關係。樹中的每乙個非葉子節點對應於乙個子空間和一組超平面。超平面將該節點的子空間進一步劃分為更小的子空間,每乙個子空間與該節點的乙個孩子節點相對應。由此,樹中的根節點對應的是完整的向量空間,除根節點之外的每乙個節點均對應於其父節點空間被劃分後得到的乙個子空間。而每個葉子節點對應於乙個不可再分的子空間。依據上述規則,對於向量集合中的各個向量都可以找到樹中的乙個葉子節點與之對應。在向量搜尋的過程中,可通過樹型結構快速的搜尋到若干個距離目標向量較近的葉子節點。通過依次計算目標向量與上述葉子節點所對應各向量的距離即可近似得到與目標向量最相似的向量。 採用基於樹的搜尋方法可以快速的定位到與目標向量最為相似的若干個葉子節點,從而有效地避免了很多無效比對,提高了搜尋效率。然而,隨著向量維度的提高,計算用於劃分空間的超平面的開銷將顯著增大,從而影響樹型結構的構建效率。此外,如果目標向量與某一超平面距離較近,該方法的搜尋結果可能會丟失大量的與目標相似的向量,從而影響查詢的準確度。
基於雜湊的搜尋方法採用一組區域性敏感雜湊函式對向量集合進行劃分。通過採用區域性敏感雜湊函式可以對每乙個向量計算出乙個與之相對應的雜湊值。對於距離較接近的向量,其雜湊值也較為接近。該方法將各區域性敏感雜湊函式的值域劃分為若干個區間,從而每個向量相應於特定的區域性敏感雜湊函式,均有乙個區間與之對應。該方法通過雜湊值的區間對向量進行劃分,若兩向量對於任一雜湊函式其雜湊值所在的區間均相同,則這兩個向量屬於同一分類。在搜尋時,通過相同的區域性敏感雜湊函式和區間劃分方法可以計算得到目標向量所屬分類。然後可依次計算該分類以及該分類的鄰近分類中所有向量與目標向量的距離獲取距離最小的向量。 基於雜湊的方法,通過計算目標向量所在分類以及鄰近的分類可以有效的排除掉大量與目標向量相似度較低的向量,減少了向量相似度的計算次數。但是,該方法通常只能對向量空間進行均勻劃分,而實際應用中向量在空間中的分布通常是不均勻的,從而導致各個分類中向量的數量相差巨大,並進一步影響搜尋的效率和準確度。
基於圖的搜尋方法通常不對向量空間進行劃分。該方法預先計算向量集合中各向量間的相似度,並以圖的形式維護向量之間的相似關係。具體而言,在圖中每個向量是乙個節點,距離較近的節點之間通過邊相互連線。在搜尋時,從乙個或者多個起始節點出發進行探索。每次探索乙個節點時,計算該節點的所有鄰居節點與目標向量的相似度,並基於當前探索的結果,選擇與目標向量最為相似且未被探索的節點作為下一次需要探索的節點並開始下一次探索。以上過程在無法找到新的探索節點時結束,並將探索過程中所有被訪問的節點中與目標向量最為相似的節點作為搜尋結果。 基於圖的方法通常有較高的搜尋效率和準確度,但是構建搜尋圖的過程中需要進行大量的向量距離計算,從而導致極大的計算開銷。
基於向量量化的方法通常採用聚類的方式對向量集合中的向量進行劃分。該方法通過 k-means 等聚類方法將向量集合劃分為多個聚類,並記錄各個聚類的中心點的座標。在向量搜尋時,首先依次比對目標向量與各個聚類中心的距離,選擇出與目標向量最為接近的若干個聚類中心。接下來獲取這些聚類中心所對應聚類中的所有向量,依次計算各向量與目標向量的距離,選擇出距離最為接近的若干個向量。 該方法採用聚類的方法將資料集合劃分,從而在搜尋過程中排除掉與目標向量相似度較低的向量。然而,該方法在高維向量的搜尋中容易遺漏部分潛在的與目標向量距離較近的向量,從而難以達到較高的準確度。
基於向量的檢索召回有兩種實現方法:構建向量top k的檢索召回服務、演算法庫加載入記憶體。
這裡只簡單介紹開源、免費的兩種向量top k檢索服務:
milvus:
vsearch:
faiss:
hnsw:
annoy:
n2:flexible clustering:
個人的一些使用經驗,如果需要構建top k的向量檢索服務,個人推薦milvus; 如果是直接快速使用,個人推薦faiss。
向量運算簡介
向量運算簡介 作 者 老赫 如果不好好學,那麼下回我介紹乙個3d engine的時候你就麻煩大了。質量保證 只討論可以任意平移自由向量 以下原理適於你個人開發的3d系統,d3d系統,opengl系統 一.兩點距離 2d系統 point1 x1,y1 point2 x2,y2 距離d sqr x1 x...
詞向量簡介
1.什麼是詞向量?每乙個詞典 裡面存著一堆單詞,例如 用nn.embedding模組進行詞嵌入 輸出的就是對應的詞向量。2.什麼是 nn.embedding torch.nn.embedding理解 看這個解釋 3.如何訓練乙個詞向量?skip gram 模型 雖然這個任務並沒有什麼卵用,但它可以幫...
R簡介和向量
1.r簡介 r是s語言的一種實現。s語言是由 at t貝爾實驗室開發的一種用來 進行資料探索 統計分析 作圖的解釋型語言。最初s語言的實現版 本主要是s plus。s plus是乙個商業 軟體,它基於s語言,並由 mathsoft公司的統計科學部進一步完善。後來auckland大學的 robertg...