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

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

从 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 表示矢量非常相似。

后续步骤