从向量距离函数中选择一个来衡量向量嵌入的相似度

本页介绍了如何从 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 表示向量非常相似。

后续步骤