
原文地址:https://alphahinex.github.io/2024/06/16/similarity-metrics-for-vector-search/
description: "清晰易懂的講解了幾種常見的向量相似度搜索算法"
date: 2024.06.16 10:34
categories:
- AI
tags: [AI, Vector]
keywords: vector, metrics, similarity, L2, Euclidean, Cosine Similarity, Inner Product, Hamming Distance, Jaccard Index, Jaccard Distance, HNSW, IVF, Milvus
你不能比較蘋果和橙子。或者你可以嗎?像 Milvus 這樣的向量數(shù)據(jù)庫允許你比較任何你可以向量化的數(shù)據(jù)。你甚至可以在你的 Jupyter Notebook 中做到這一點(diǎn)。但是 向量相似性搜索 是如何工作的呢?

向量搜索有兩個(gè)關(guān)鍵的概念組成部分:索引和距離度量。一些流行的向量索引包括 HNSW、IVF 和 ScaNN。主要的三種距離度量是:L2 或歐幾里得距離、余弦相似度和內(nèi)積。其他度量還有可用于二進(jìn)制向量的漢明距離和杰卡德系數(shù)。
在這篇文章中,我們將涵蓋:
- 向量相似度度量
- L2 或歐幾里得距離
- L2 距離是如何工作的?
- 何時(shí)應(yīng)該使用歐幾里得距離?
- 余弦相似度
- 余弦相似度是如何工作的?
- 何時(shí)應(yīng)該使用余弦相似度?
- 內(nèi)積
- 內(nèi)積是如何工作的?
- 何時(shí)應(yīng)該使用內(nèi)積?
- 其他有趣的向量相似度或距離度量
- 漢明距離
- 杰卡德指數(shù)
- 向量相似度搜索度量總結(jié)
向量相似度度量
向量可以表示為數(shù)字列表或方向和大小。為了更容易理解,你可以將向量想象為指向特定方向的線段。
- L2或歐幾里得度量 是兩個(gè)向量之間的“斜邊”度量。它衡量了向量線條結(jié)束點(diǎn)之間的距離大小。
- 余弦相似度 是指它們相交時(shí)線之間的夾角。
- 內(nèi)積 是將一個(gè)向量投影到另一個(gè)向量上的操作。直觀地說,它同時(shí)衡量了向量之間的距離和角度。
L2 或歐幾里得距離
L2 或歐幾里得距離是最直觀的距離度量。我們可以將其想象為兩個(gè)物體之間的空間量。例如,你的屏幕離你的臉有多遠(yuǎn)。
L2 或歐幾里得距離是如何工作的?

那么,我們已經(jīng)想象了 L2 距離在空間中是如何工作的;在數(shù)學(xué)中它是如何工作的呢?讓我們首先將兩個(gè)向量想象為一列數(shù)字。將這些數(shù)字列表上下對齊,然后向下相減。接著,將所有結(jié)果平方并相加。最后,取平方根。
Milvus 跳過了平方根步驟,因?yàn)槠椒礁幚砬昂蟮呐琶樞蚴窍嗤?。這樣,我們可以省去一個(gè)操作步驟并得到相同的結(jié)果,降低延遲和成本,提高吞吐量。下面是一個(gè)歐幾里得或 L2 距離如何工作的例子。
d(Queen, King) =
=
=
= ≈ 0.28
何時(shí)應(yīng)該使用 L2 或歐幾里得距離?
使用歐幾里得距離的一個(gè)主要原因是當(dāng)您的向量具有不同的大?。╩agnitudes)時(shí)。您主要關(guān)心的是您的詞匯在空間中或語義上的距離有多遠(yuǎn)。
余弦相似度
我們使用“余弦相似度”或“余弦距離”來表示兩個(gè)向量之間的方向差異。例如,你需要轉(zhuǎn)多少度才能面向前門?
有趣且實(shí)用的事實(shí):盡管“相似度”和“距離”兩個(gè)詞單獨(dú)來看有不同的含義,但在它們前面加上“余弦”后會(huì)使它們的意思幾乎相同!這是語義相似性的又一個(gè)例子。
余弦相似度是如何工作的?

所以,我們知道了余弦相似度度量的是兩個(gè)向量之間的夾角。讓我們再次將我們的向量想象成一列數(shù)字。不過這次的過程稍微復(fù)雜一些。
我們再次將向量上下對齊。首先,將數(shù)字向下相乘,然后將所有結(jié)果相加?,F(xiàn)在保存這個(gè)數(shù)字;稱它為“x”。接下來,我們必須將向量中的每個(gè)數(shù)字平方,并將平方的結(jié)果相加。想象一下,對于兩個(gè)向量,將每個(gè)向量中的數(shù)字按水平方向平方,之后相加求和。
接著,對這兩個(gè)和求平方根,然后將它們相乘,稱這個(gè)結(jié)果為“y”。我們將余弦距離的值定義為“x”除以“y”。
何時(shí)應(yīng)該使用余弦相似度?
余弦相似度主要用于 NLP 應(yīng)用。余弦相似度主要衡量的是語義方向的差異。如果您使用了歸一化向量,余弦相似度等同于內(nèi)積。
內(nèi)積
內(nèi)積是一個(gè)向量投影到另一個(gè)向量上的操作。內(nèi)積的值是向量的長度拉伸出來的。兩個(gè)向量之間的夾角越大,內(nèi)積越小。它還會(huì)隨著較小向量的長度而縮放。因此,當(dāng)我們關(guān)心方向和距離時(shí),我們使用內(nèi)積。例如,你必須穿過墻壁跑到冰箱的直線距離。
內(nèi)積是如何工作的?

內(nèi)積應(yīng)該看起來很熟悉。它只是余弦計(jì)算的前 ? 部分。在你的腦海中將這些向量排成一行,向下相乘。然后將它們相加。這個(gè)過程測量了你和最近的點(diǎn)心之間的直線距離。
何時(shí)應(yīng)該使用內(nèi)積?
內(nèi)積就像歐幾里得距離和余弦相似度的混合體。當(dāng)涉及到歸一化數(shù)據(jù)集時(shí),它等同于余弦相似度,因此內(nèi)積適用于歸一化或非歸一化數(shù)據(jù)集。它是一個(gè)比余弦相似度更快的選項(xiàng),也是一個(gè)更靈活的選項(xiàng)。
需要記住的一件事是,內(nèi)積不遵循三角不等式。更大的長度(大的幅度)被優(yōu)先考慮。這意味著我們在使用倒排文件索引或類似HNSW的圖索引時(shí)應(yīng)該小心使用內(nèi)積。
譯注:在倒排文件索引或HNSW(一種圖索引方法)這類數(shù)據(jù)結(jié)構(gòu)中,我們通常希望快速找到與給定查詢最相似的項(xiàng)。如果使用內(nèi)積作為相似性度量,那么更大的長度(或幅度)將優(yōu)先考慮,這意味著具有較大長度的向量將被視為更相似,即使它們的實(shí)際方向可能相差很大。這可能導(dǎo)致不準(zhǔn)確的搜索結(jié)果。
其他有趣的向量相似度或距離度量
上面提到的是對于向量嵌入最有用的三個(gè)向量度量方法。然而,它們并不是衡量兩個(gè)向量之間距離的所有方法。以下是衡量兩個(gè)向量之間距離或相似度的另外兩種方法。
漢明距離

漢明距離可以應(yīng)用于向量或字符串。對于我們的用例,讓我們繼續(xù)使用向量。漢明距離衡量了兩個(gè)向量的 條目 之間的“差異”。例如,“1011”和“0111”的漢明距離為 2。
在向量嵌入方面,漢明距離只適用于二進(jìn)制向量。浮點(diǎn)向量嵌入是由神經(jīng)網(wǎng)絡(luò)的倒數(shù)第二層輸出的,由 0 到 1 之間的浮點(diǎn)數(shù)。例如 [0.24, 0.111, 0.21, 0.51235] 和 [0.33, 0.664, 0.125152, 0.1]。
正如你所看到的,兩個(gè)向量嵌入之間的漢明距離幾乎總是等于向量本身的長度。每個(gè)值的可能性太多了。這就是為什么漢明距離只能應(yīng)用于二進(jìn)制或稀疏向量。像 TF-IDF、BM25 或 SPLADE 這樣的過程產(chǎn)生的向量就是這種類型的向量。
漢明距離適用于衡量兩個(gè)文本之間的措辭差異、單詞拼寫差異或任何兩個(gè)二進(jìn)制向量之間的差異。但不適用于衡量向量嵌入之間的差異。
有趣的事實(shí):漢明距離等于對兩個(gè)向量執(zhí)行 XOR 操作的結(jié)果的和。
杰卡德距離

杰卡德距離是衡量兩個(gè)向量相似性或距離的另一種方法。有趣的是,杰卡德有杰卡德 指數(shù) 和杰卡德 距離 兩種方式。杰卡德距離等于 1 - 杰卡德系數(shù),Milvus 中實(shí)現(xiàn)的是 Jaccard 距離度量。
計(jì)算杰卡德距離或指數(shù)是一項(xiàng)有趣的任務(wù),因?yàn)檎б豢此⒉惶行?。與漢明距離一樣,杰卡德只適用于二進(jìn)制數(shù)據(jù)。我發(fā)現(xiàn)傳統(tǒng)的“并集”和“交集”形式令人困惑。我用邏輯上的方式理解它。它本質(zhì)上就是 A “或” B 減去 A “且” B 再除以 A “或” B。
如上圖所示,我們計(jì)算 A 或 B 為 1 的條目數(shù)作為“并集”,A 和 B 都為 1 的條目數(shù)作為“交集”。因此,A(01100111)和 B(01010110)的杰卡德指數(shù)為 ?。在這種情況下,杰卡德距離,1 減去杰卡德指數(shù),也是 ?。
向量相似度搜索度量總結(jié)
在這篇文章中,我們了解了三種最有用的向量相似度搜索度量:L2(也稱為歐幾里得)距離、余弦距離和內(nèi)積。每種度量都有不同的使用場景。歐幾里得距離用于我們關(guān)心大小的差異。余弦用于我們關(guān)心方向的差異。內(nèi)積用于我們關(guān)心大小和方向的差異。
查看這些視頻,了解更多關(guān)于向量相似度度量的信息,或 閱讀文檔 了解如何在 Milvus 中配置這些度量。