【发布时间】:2021-12-17 14:15:49
【问题描述】:
背景:我有一个机器学习模型,其中给定一个对象返回一个维度为 d 的嵌入向量,该模型的训练方式使得两个嵌入向量的语义相似性非常接近.现在,验证过程比较简单,我可以取两个向量的余弦相似度之类的东西。对于识别,有点复杂,要么我可以循环遍历所有锚文档并比较余弦相似度,要么使用类似 kNN(在线)的东西。
问题:我有一个嵌入向量列表,每个向量的维度为 d,长度为 N。每个向量都包含浮点数据。
什么是高效的数据结构+算法,可以做到以下几点:
- 可以有效地将具有唯一 ID 的新向量添加到列表中(
- 使用列表中的随机向量进行搜索,并检索前 k 个向量,这样曼哈顿距离 / L1 范数对于这些向量来说是有效的最小值(希望
示例:
[
[1., 2., 3.],
[5., 6., 8.],
[-11., 2., 31.]
]
k = 2
query = [1.5, 2.5, 3.2]
results:
[
[1., 2., 3.],
[5., 6., 8.],
]
【问题讨论】:
-
我会调查approximate nearest neighbor algorithms。根据数据(特别是是否
N >> d),某种形式的局部敏感散列或基于 kd-tree 的方法似乎是合适的。 -
谢谢,这绝对有帮助,我在这里找到了一些很好的资源:@987654322@
-
我写了一个 few articles,你可能会发现它对 ANN 算法很有用,你有各种方法,如 IVF 或 HNSW,也可以使用 mix and match several combinations。您的问题的答案取决于您的数据集的大小,最重要的是,任何特别大的 1M+ 都是 IVF+HNSW 领土
-
谢谢,@JamesBriggs。我会调查的。
-
是的,向量数量将达到1M+。
标签: python algorithm search data-structures similarity