【问题标题】:What is the most efficient way to store a set of points (embeddings) such that queries for closest points are computed quickly存储一组点(嵌入)以便快速计算最近点的查询的最有效方法是什么
【发布时间】:2019-03-07 23:54:06
【问题描述】:

给定一组嵌入,即一组[名称,向量表示] 我应该如何存储它以便快速计算最近点的查询。例如,给定二维空间中的 100 个嵌入,如果我在最接近 (10,12) 的 5 个点上查询数据结构,它会返回 { [a,(9,11.5)] , [b,(12,14) ],...}

简单的方法是计算所有距离,排序并返回前 k 个点。或者,人们可能会考虑以 mXn 空间的块/单位存储在二维数组中,以覆盖嵌入空间的范围。我不认为这可以扩展到更高的维度,但我愿意被纠正。

【问题讨论】:

    标签: information-retrieval embedding word-embedding data-retrieval


    【解决方案1】:

    您可以使用标准的近似最近邻库,例如faissflannjava-lsh 等(基于LSHProduct Quantization)。

    最快的解决方案(我发现它很有用)是使用Johnson–Lindenstrauss 转换将一个(比如 100 维)向量转换为一个长变量(64 位)。然后,您可以使用汉明相似度(即 64 减去 a XOR b 中设置的位数)来计算位向量 ab。你可以使用POPCOUNT 机器指令来达到这个效果(非常快)。

    实际上,如果您在 C 中使用 POPCOUNT,即使您对整个二进制转换向量集(64 位长变量)进行完整迭代,它仍然会非常快。

    【讨论】:

      猜你喜欢
      • 2011-01-26
      • 1970-01-01
      • 2011-05-20
      • 2017-07-10
      • 1970-01-01
      • 2019-02-26
      • 1970-01-01
      • 2013-01-23
      相关资源
      最近更新 更多