選擇向量距離函式,以便評估向量嵌入相似度

本頁說明如何從 Spanner 提供的向量距離函式中選擇,用來測量向量嵌入之間的相似度。

從 Spanner 資料產生嵌入後,您可以使用向量距離函式執行相似度搜尋。下表說明 Spanner 中的向量距離函式。

函式說明公式與相似度提高的關係
點積 計算角度 \(\theta\) 的餘弦,再乘以對應向量大小的乘積。 \(a_1b_1+a_2b_2+...+a_nb_n\) \(=|a||b|cos(\theta)\) 增加
餘弦距離 餘弦距離函式會從 1 減去餘弦相似度 (cosine_distance() = 1 - cosine similarity)。餘弦相似度會測量兩個向量之間的角度餘弦值 \(\theta\) 。 1 - \(\frac{a^T b}{|a| \cdot |b|}\) 減少
歐幾里得距離 測量兩個向量之間的直線距離。 \(\sqrt{(a_1-b_1)^2+(a_2-b_2)^2+...+(a_N-b_N)^2}\) 減少

選擇相似度測量指標

視所有向量嵌入是否已正規化而定,您可以決定要使用哪種相似度測量方式來尋找相似度。正規化向量嵌入的量值 (長度) 剛好為 1.0。

此外,如果您知道模型訓練時使用的距離函式,請使用該函式測量向量嵌入之間的相似度。

正規化資料

如果資料集中的所有向量嵌入都經過正規化,這三種函式提供的語意搜尋結果就會相同。基本上,雖然每個函式會傳回不同的值,但這些值會以相同方式排序。當嵌入內容經過正規化處理後,DOT_PRODUCT() 通常是運算效率最高的做法,但大多數情況下,兩者差異微不足道。不過,如果應用程式對效能非常敏感,DOT_PRODUCT() 可能有助於調整效能。

未標準化的資料

如果資料集中的向量嵌入內容未經過正規化,則使用 DOT_PRODUCT() 做為距離函式在數學上並不正確,因為點積函式不會測量距離。視嵌入項目的產生方式和偏好的搜尋類型而定,COSINE_DISTANCE()EUCLIDEAN_DISTANCE() 函式產生的搜尋結果,主觀上會比另一個函式更好。您可能需要透過 COSINE_DISTANCE()EUCLIDEAN_DISTANCE() 進行實驗,才能判斷哪一個最適合您的用途。

不確定資料是否經過正規化

如果您不確定資料是否已正規化,但想使用 DOT_PRODUCT(),建議改用 COSINE_DISTANCE()COSINE_DISTANCE() 類似於 DOT_PRODUCT(),但內建正規化功能。相似度是使用 COSINE_DISTANCE() 測量,範圍從 02。結果越接近 0,表示向量越相似。

後續步驟