选择向量距离函数以测量向量嵌入的相似性

本页面介绍了如何在 Spanner 中提供的矢量距离函数中进行选择,以衡量矢量嵌入之间的相似度。

根据 Spanner 数据生成嵌入后,您可以使用矢量距离函数执行相似度搜索。下表介绍了 Spanner 中的矢量距离函数。

函数说明公式与增加相似度的关系
点积 计算角度 \(\theta\) 的余弦乘以相应矢量幅度的乘积。 \(a_1b_1+a_2b_2+...+a_nb_n\) \(=|a||b|cos(\theta)\) 提高
余弦距离 余弦距离函数会从一 (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()”衡量的相似度介于 -11 之间。如果结果接近 0,表示这些向量非常相似。

后续步骤