🚀 免費嘗試 Zilliz Cloud,完全托管的 Milvus,體驗速度提升 10 倍!立即嘗試

milvus-logo
LFAI
  • Home
  • Blog
  • Matryoshka Embeddings:多尺度的細節

Matryoshka Embeddings:多尺度的細節

  • Engineering
October 30, 2024
Stefan Webb, David Wang

Matryoshka Embeddings 是什麼?

在建立有效率的向量搜尋系統時,一個主要的挑戰是管理儲存成本,同時維持可接受的延遲和召回率。現代嵌入模型輸出的向量有數百或數千個維度,為原始向量和索引帶來顯著的儲存和計算開銷。

傳統上,我們會在建立索引之前,先應用量化或降維方法來降低儲存需求。例如,我們可以使用積量化 (Product Quantization, PQ) 降低精確度,或使用主成分分析 (Principal Component Analysis, PCA) 降低維數,以節省儲存空間。這些方法會分析整個向量集,找出更精簡的向量集,以維持向量之間的語意關係。

這些標準方法雖然有效,但只減少一次精確度或維度,而且是在單一尺度上。但如果我們可以同時維持多層的細節,就像金字塔般越來越精確的表達,那會如何呢?

進入Matryoshka 內嵌。以俄羅斯嵌套娃娃命名 (見插圖),這些聰明的結構將多層表徵嵌入單一向量中。與傳統的後處理方法不同,Matryoshka 內嵌會在初始訓練過程中學習這種多尺度結構。結果非常顯著:完整的嵌入不僅能捕捉輸入的語意,而且每個巢狀的子集前綴 (前半部、前四分之一等) 都能提供連貫的表達 (即使不那麼詳細)

Figure: Visualization of Matryoshka embeddings with multiple layers of detail 圖:具備多層細節的 Matryoshka 內嵌可視化

圖具備多層細節的 Matryoshka 嵌入式可視化

這種方法與傳統的嵌入式形成強烈對比,傳統的嵌入式使用向量維度的任意子集,通常會破壞語意。有了 Matryoshka 嵌入式,您可以選擇最能平衡特定任務精確度與計算成本的粒度。

需要快速近似搜尋?使用最小的「娃娃」。需要最高的精確度?使用完整的嵌入。這種彈性讓它們對於要適應不同效能需求或資源限制的系統特別有價值。

推論

Matryoshka 內嵌的一個重要應用是在不犧牲召回率的情況下加速相似性搜尋。透過利用查詢和資料庫內嵌的較小子集,例如其維度的前 1/32,我們可以在這個縮小的空間上建立索引,而這個索引仍然保留大部分的相似性資訊。這個較小嵌入空間的初始結果可以直接使用。不過,還有一種技術可以提升召回率,並計算出維度縮減所造成的任何輕微減少,讓這種方法對於相似性搜尋任務既有效率又有效。

Figure: How the funnel search works with Matryoshka embeddings 圖:使用 Matryoshka 嵌入式的漏斗搜尋運作方式

圖使用 Matryoshka 嵌入式的漏斗搜尋運作方式

為了在保持精確度的同時有效加快相似性搜尋的速度,我們可以使用「漏斗搜尋」的方法。首先,我們只使用嵌入維度的前 1/32 執行初始相似性搜尋,產生廣泛的候選項。然後,我們根據這些候選項與查詢的相似度,使用前 1/16 個維度來重新排序,修剪清單中的一部分。這個過程會持續反覆地進行,使用越來越大的嵌入維度子集-1/8、1/4 等等來重新排序和剪枝。重要的是,我們只在這個較低維度的空間中執行一次初始相似性搜尋,而嵌入模型的一次傳遞就能計算出查詢的嵌入。這個漏斗過程會在每一步縮小候選人的範圍,比直接在全維空間搜尋更快、更有效率。從 1/32 維空間中抽取許多匹配項目,並透過漏斗搜尋進行精煉,可以大幅加快相似性搜尋的速度,同時保留強大的召回率。

訓練

讓我們來瞭解一些技術細節。這個方法的應用非常簡單。考慮微調BERT 模型以進行句子嵌入的情況。為了將已經針對掩蔽標誌損失進行預先訓練的 BERT 模型轉換為句子嵌入模型,我們將句嵌入形成為最終層的平均值,也就是每個標誌上下文化嵌入的平均值。

訓練目標的一種選擇是Cosine Sentence (CoSENT) lossL(u,v;s)L(, v; s) Lu v s。它輸入一對句子嵌入,u,vu,v v,以及它們所需的相似性分數,sss(公式請參閱上面的連結)。現在,為了學習 Matryoshka 嵌入式,我們對訓練目標做一個小小的修改:

LM(u,v)=w0L(u1:d,v1:d)+w1L(u1:d/2,v1:d/2)+w2L(u1:d/4,v1:d/4)+⋯L_M(u, v) = w_0L(u_{1:d}, v_{1:d}) + w_1L(u_{1:d/2}, v_{1:d/2}) + w_2L(u_{1:d/4}, v_{1:d/4}) + \cdotsLv=wL1,v)+w1L(1,v1)+wL1,v

其中,總和是透過計算前一個項目的一半輸入損失來繼續,直到達到資訊瓶頸為止。作者建議設定

w0=w1=⋯=1w_0=w_1=\cdots=1 w=

簡單來說,Matryoshka 損失是原始損失在輸入的遞歸子集中的加權總和。

從上面等式中得到的一個關鍵啟示是,Matryoshka 損失通過在嵌入模型之間共享權重,實現了多尺度表徵的高效學習(同一模型用於編碼,例如u1du_{1:u u1:d/2u_{1:d/2} u d/2 )和跨尺度共享維度 u1: d/2u_{ 1:d/2}uu u 的子集)。

Matryoshka 嵌入與 Milvus

Milvus 無縫支援任何 Matryoshka 嵌入模型,這些模型可以透過標準函式庫,例如pymilvus.model句子轉換器或其他類似的工具載入。從系統的角度來看,一般的嵌入模型與特別訓練來產生 Matryoshka 嵌入的模型在功能上沒有任何差異。

受歡迎的 Matryoshka 嵌入模型包括

有關在 Milvus 中使用 Matryoshka 嵌入模型的完整指南,請參閱筆記型電腦 Funnel Search with Matryoshka Embeddings

摘要

Matryoshka embedding 可讓開發人員在不犧牲語意完整性的情況下建立縮短的 embeddings,使其成為更有效率的搜尋與儲存的理想選擇。您可以修改現有的模型,也可以使用預先訓練的選項,例如OpenAIHugging Face 提供的選項。

然而,目前的限制在於開放原始碼的 Matryoshka 內嵌模型非常稀少,在 Hugging Face hub 上幾乎找不到。此外,這些模型通常沒有明確標示為「Matryoshka」,因此較難找到。希望隨著興趣的增加,更廣泛的可用性和更明確的標籤可能很快就會出現。

準備好簡化您的搜尋能力了嗎?立即開始使用 Milvus + Matryoshka 嵌入式!

資源

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started

Like the article? Spread the word

繼續閱讀