在向量数据库中,度量方式(Metric, Distance/Similarity Metric)指的是用于衡量两个向量之间“相似度”或“距离”的数学方法。
选择合适的度量方式直接影响到向量检索、排序、匹配的效果,在不同的场景中需要选择不同的度量方式。
1. 欧式距离
欧式距离是最常见的距离度量,描述的是两个点在空间中的“直线距离”。
向量化使得每个数据在多维空间中都有自己的坐标点位置,那么坐标点之间越近的,相似度应该会越高。即欧式距离越小,表示两个向量越相似。
适合用在特征分布均衡、特征量纲一致的场景。
1.1.推导过程
从二维、三维开始,推导欧式距离的计算公式。
二维空间
先看一下二维空间怎么计算欧式距离
如图,计算二维坐标下 A (x1,y1)、B (x2,y2) 两点之间的距离结果为:
$$ d(\mathbf{A}, \mathbf{B}) = \sqrt{(x_2 - x_1)2 + (y_2 - y_1)2} $$
咋一看,这不就是 勾股定理 嘛!
三维空间
再看看三维空间的图
同样计算公式差不多:
$$ d(\mathbf{A}, \mathbf{B}) = \sqrt{(x_2 - x_1)2 + (y_2 - y_1)2 + (z_2 - z_1)2} $$
欧式距离公式
以此类推,可以得出 n 维空间下,欧式距离计算公式为:
$$ d(\mathbf{A}, \mathbf{B}) = \sqrt{\sum_{i=1}{n} (x_i - y_i)2} $$
1.2. 曼哈顿距离
欧式距离是直线距离,类似的还有曼哈顿距离。
如下图,实际地图上两点之间的要走路的距离,不会是一条直线,要基于街区实际的道路来。如下图,以曼哈顿街区距离为例,因此命名曼哈顿距离。
二维公式
$$ \text{曼哈顿距离} = |x2 - x1| + |y2 - y1| $$
N维公式
$$ \text{曼哈顿距离} = \sum_{i=1}^{n} |x_i - y_i| $$
1.3. 欧式距离命名
既然二维空间的公式就是勾股定理,为啥后世命名“欧式距离”。
欧式距离,得名于希腊数学家欧几里得,他在《几何原本》中系统总结了平面(二维)和空间几何(三维)的基本规律,奠定了欧氏几何的基础。为了纪念他,后人将这种空间中的直线距离称为“欧式距离”。
1.4. 缺点
维数灾难
欧式距离在低维空间(如二维或三维)中是直观的。然而,当维度 n 很高时,欧式距离会变得难以直观理解,甚至可能失去意义。
在高维空间中,数据点的分布变得非常稀疏。即使数据点的数量很大,在高维空间中它们仍然显得非常“分散”。这种稀疏性导致:
- 数据点之间的欧式距离变得很大,导致计算各点欧式距离的值时差距不大。
- 直线距离(欧式距离)不再是衡量相似度的有效指标,因为数据点的分布过于分散。
欧式距离在高维空间中会因为数据稀疏性、距离趋同等问题失去意义,这被称为“维数灾难”。
没有方向
多维空间中存储的是向量,向量除了有长度,还有方向。在计算距离时容易忽略方向。
如下图的例子,有3个向量:
- A 向量坐标 ( 1 , 1 )
- B 向量坐标 ( 3 , 3 )
- C 向量坐标 ( -1 , -1 )
假如 向量 B、C 是向量库中数据,要查找和向量A 相似度最高的数据,选哪个呢?
通过欧式距离来看,A 离2个向量的距离是相同的。但 向量A 和 向量B 方向相同,和向量C 方向相反,相似度最高的应该是向量B。
因此如果要考虑方向,欧式距离就不太适合了。
2. 内积
2.1. 定义
向量中,在考虑长度的同时,也考虑方向,就可以用向量的内积公式:
向量内积(也叫点积、数量积)是数学中两个向量之间的一种运算,结果是一个数(标量)。
设有两个向量 a、b,则它们的内积定义为:
$$ \vec{a} \cdot \vec{b} = |\vec{a}| \cdot |\vec{b}| \cdot \cos\theta $$
- a和b的模对应两个向量的长度
两个向量夹角的余弦值对应方向
- \( \cos\theta \) > 0 :\( \theta \)小于90°,方向“接近”
- \( \cos\theta \) = 0 :\( \theta \)等于90°,方向“正交”
- \( \cos\theta \) < 0 :\( \theta \)小大于90°,方向“相反”
2.2. 物理力学应用
内积在物理力学上应用很常见:
当一个物体在力\( \vec{F} \)的作用下,沿着位移\( \vec{s} \)移动时,力对物体做的功为:
$$ W = \vec{F} \cdot \vec{s} = |\vec{F}| \cdot |\vec{s}| \cdot \cos\theta $$
其中:
- \( W \):做功
- \( \vec{F} \):力的向量
- \( \vec{s} \):位移向量
- \( \theta \):力和位移的夹角
当 \( \vec{F} \)和 \( \vec{s} \) 同方向时,\( \cos\theta \)= 1 ,相同的力做功最大。
2.3. 向量相似度应用
在实际应用中,内积常用来衡量两个向量的相似度。例如:
- 文本向量化后相似度计算:将文本转为向量后,两个文本的内积越大,说明它们内容越相似。
- 推荐系统中的Embedding匹配:用户和商品分别用向量表示,内积越大,表示用户和商品越“匹配”。
\( \cos\theta \)值的范围是 [ -1 , 1 ] ,但向量的长度没有限制,因此内积的值区间为:\( (-\infty, +\infty) \)
向量数据库中存储的是向量的多维坐标,在计算内积的时候,不可能量每个向量之间夹角\( \theta \)的角度。
因此通常会用到 内积的另一个计算公式:
$$ \vec{a} \cdot \vec{b} = a_1b_1 + a_2b_2 + ... + a_nb_n = \sum_{i=1}^n a_i b_i $$
没错,如果是二维坐标系下 \( \vec{a} \) 的坐标 \( (x_1,y_1) \),\( \vec{b} \) 的坐标 \( (x_2,y_2) \),那么一下两个公式是等价的,都表示两个向量之间的内积:
$$ \vec{a} \cdot \vec{b} = |\vec{a}| \cdot |\vec{b}| \cdot \cos\theta = x_1x_2 + y_1y_2 $$
3. 内积公式推导
3.1. 余弦定理推导内积公式
假设在平面上有两个点 \( A(x_1, y_1) \) 和 \( B(x_2, y_2) \),以及原点 \( O(0, 0) \)。我们要通过余弦定理推导出两向量 \( \mathbf{OA} \) 和 \( \mathbf{OB} \) 的点积公式,即:
$$ \mathbf{OA} \cdot \mathbf{OB} = x_1x_2 + y_1y_2 $$
数学推导公式时,先确定 已知 ,那么这里的已知项就是 三角形余弦定理
已知:三角形余弦定理
在一个任意三角形中,设三角形的三个顶点为 A、B、C,对应的三边分别为:
- a:顶点 A 对应的边(即边 BC)
- b:顶点 B 对应的边(即边 AC)
- c:顶点 C)对应的边(即边 AB)
如果 是边 b 和 c 所夹的角(即角 \( \angle BAC \) ),那么余弦定理可以表示为:
$$ a2 = b^2 + c^2 - 2bc\cos\theta $$
余弦定理是直角三角形勾股定理的推广。在直角三角形中,夹角 \( \theta = 90^\circ \),因此 \( \cos\theta = 0 \)。此时,余弦定理退化为勾股定理:
$$ a^2 = b^2 + c^2 $$
余弦定理在以下情况下非常有用:
- 求三角形的一边:已知两边及它们夹角,求第三边的长度。
- 求三角形的角度:已知三边的长度,求任意一个角的大小。
1、向量的模长和夹角
在几何中:
- 向量 \( \mathbf{OA} \) 的长度(模)为: \( |\mathbf{OA}| = \sqrt{x_12 + y_12} \)
- 向量 \( \mathbf{OB} \)的长度(模)为: \( |\mathbf{OB}| = \sqrt{x_22 + y_22} \)
- 向量 \( \mathbf{OA} \) 和 \( \mathbf{OB} \) 的夹角为 \( \theta \)。
根据余弦定理,我们知道:
$$ |\mathbf{AB}|2 = |\mathbf{OA}|2 + |\mathbf{OB}|^2 - 2|\mathbf{OA}||\mathbf{OB}|\cos\theta $$
其中 \( |\mathbf{AB}| \) 是点 A 和点 B 的距离。
2、点 A 和点 B 的距离
点 ( A(x_1, y_1) ) 和点 ( B(x_2, y_2) ) 的距离 ( \( |\mathbf{AB}| \) ) 可以通过两点间距离公式计算:
$$ |\mathbf{AB}| = \sqrt{(x_2 - x_1)2 + (y_2 - y_1)2} $$
因此:
$$ |\mathbf{AB}|2 = (x_2 - x_1)2 + (y_2 - y_1)^2 $$
3、将距离公式代入余弦定理
根据余弦定理:
$$ |\mathbf{AB}|2 = |\mathbf{OA}|2 + |\mathbf{OB}|^2 - 2|\mathbf{OA}||\mathbf{OB}|\cos\theta $$
将点 ( A ) 和点 ( B ) 的距离公式代入:
$$ (x_2 - x_1)2 + (y_2 - y_1)2 = (x_12 + y_12) + (x_22 + y_22) - 2\sqrt{x_12 + y_12}\sqrt{x_22 + y_22}\cos\theta $$
4、展开两边并比较
展开左边:
$$ (x_2 - x_1)2 + (y_2 - y_1)2 = x_22 - 2x_1x_2 + x_12 + y_22 - 2y_1y_2 + y_12 $$
- 整理得到
$$ x_12 + y_12 + x_22 + y_22 - 2(x_1x_2 + y_1y_2) $$
- 右边为:
$$ x_12 + y_12 + x_22 + y_22 - 2\sqrt{x_12 + y_12}\sqrt{x_22 + y_22}\cos\theta $$
比较两边的式子,发现:
$$ -2(x_1x_2 + y_1y_2) = -2\sqrt{x_12 + y_12}\sqrt{x_22 + y_22}\cos\theta $$
消去 (-2),得到:
$$ x_1x_2 + y_1y_2 = \sqrt{x_12 + y_12}\sqrt{x_22 + y_22}\cos\theta $$
5、点积公式
根据点积的定义:
$$ \mathbf{OA} \cdot \mathbf{OB} = |\mathbf{OA}||\mathbf{OB}|\cos\theta $$
因此,点积可以表示为:
$$ \mathbf{OA} \cdot \mathbf{OB} = x_1x_2 + y_1y_2 $$
6、结论
我们从三角形的余弦定理出发,推导出了二维向量点积的公式:
$$ \mathbf{OA} \cdot \mathbf{OB} = x_1x_2 + y_1y_2 $$
3.2. 附加:余弦定理推导
如果对余弦定理的公式也存疑,可以看看下图证明二中通过勾股定理推导余弦定理。
4. 余弦相似度
了解完内积后,余弦相似度就很容易理解了。
余弦就是 \( \cos\theta \) 。
计算余弦相似度,就是计算两个向量之间 \( \cos\theta \) 的值。
二维空间下,内积公式:
$$ \vec{a} \cdot \vec{b} = |\vec{a}| \cdot |\vec{b}| \cdot \cos\theta = \sqrt{x_1^2 + y_1^2} \cdot \sqrt{x_2^2 + y_2^2} \cdot \cos\theta = x_1x_2 + y_1y_2 $$
因此余弦相似度公式:
$$ \cos\theta = \frac{x_1x_2 + y_1y_2}{\sqrt{x_1^2 + y_1^2} \cdot \sqrt{x_2^2 + y_2^2}} $$
对应 在多维空间下完整余弦相似度公式为:
$$ \text{Cosine Similarity} = \frac{\sum_{i=1}^n a_i b_i}{\sqrt{\sum_{i=1}^n a_i^2} \cdot \sqrt{\sum_{i=1}^n b_i^2}} $$
5. 语义向量化更关注方向
在大语言模型的应用场景中,通常通过嵌入模型将文本语义转换成向量。在RAG检索时,也是在向量数据库中检索相似度更高的向量。
那么文本语义经过嵌入模型向量化后,更关注向量的长度还是方向呢?这决定了我们使用哪种度量方式。
首先得出结论,更关注方向,度量方式首选余弦相似度。
5.1. 嵌入模型向量化属性
文本语义在经过嵌入模型向量化之后,生成的向量主要包含方向和长度两个属性。
向量的方向
方向代表了文本的语义信息。
如果两个文本的语义相近(比如都是在说“天气很好”),它们被嵌入后的向量方向会很接近。
向量的长度
长度(也叫范数、模、norm)可以理解为该向量的“强度”或“置信度”,但在大多数文本嵌入场景下,长度本身通常不携带具体的语义信息。
嵌入模型有时会输出长度不同的向量,这可能和输入文本的长度、模型训练细节等有关。但大部分情况下,我们并不关心它的长度。
5.2. 语义相似度只看方向
语义相似度的本质是:两个向量的方向越接近,说明它们的语义越相似。
长度差异通常是无关的,甚至会被人为归一化掉。
假设有两篇文章:
- A:“我喜欢苹果”
- B:“我很喜欢苹果,非常喜欢苹果”
用BERT等模型提取它们的向量(Embedding)后,得到两个高维向量(假设用二维举例,实际是几百维甚至更高):
- 向量A:[1, 1]
- 向量B:[3, 3] (因为B的句子更长、重复多次,Embedding向量模长更大)
用欧式距离
$$ \text{欧式距离} = \sqrt{(3-1)2 + (3-1)2} = \sqrt{4 + 4} = \sqrt{8} \approx 2.83 $$
看起来“距离很大”,但实际上两句话语义几乎一样,只是B更啰嗦而已。
用余弦相似度
$$ \text{cosine}(A, B) = \frac{1 \times 3 + 1 \times 3}{\sqrt{12+12} \times \sqrt{32+32}} = \frac{6}{\sqrt{2} \times \sqrt{18}} = \frac{6}{\sqrt{36}} = \frac{6}{6} = 1 $$
余弦相似度为1,说明两句话“方向完全一致”,即语义完全一样。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。