如果我放宽一些约束,我可以得到近似最近邻的算法快捷方式吗?

Posted

技术标签:

【中文标题】如果我放宽一些约束,我可以得到近似最近邻的算法快捷方式吗?【英文标题】:If I relax some constraints, can I get an algorithmic shortcut on Approximate Nearest Neighbors? 【发布时间】:2021-01-07 04:14:25 【问题描述】:

我正在寻找一种每次查询时间最快的算法来解决类似于最近邻搜索的问题,但有两个不同之处:

我只需要大致确认(容忍 I 型和 II 型错误)在某个距离 k 内是否存在邻居或返回最近邻居的大致距离。 我可以一次查询多个

我想要比那里的近似最近邻库 (https://github.com/erikbern/ann-benchmarks) 更好的吞吐量,后者似乎更适合单个查询。特别是,第一个标准的算法放宽似乎应该为算法捷径留出空间,但我在文献中找不到任何解决方案,也无法弄清楚如何设计一个。

这是我目前最好的解决方案,它在每个 CPU 上以大约 10k 查询/秒的速度运行。如果可能的话,我正在寻找接近数量级加速的东西。

sample_vectors = np.random.randint(low=0, high=2, size=(10000, vector_size))
new_vectors = np.random.randint(low=0, high=2, size=(100000, vector_size))

import annoy
ann = annoy.AnnoyIndex(vector_size, metric='hamming')
for i, v in enumerate(sample_vectors):
    ann.add_item(i, v)
ann.build(20)

for v in new_vectors:
    print(ann.get_nns_by_vector(v, n=1, include_distances=True))

【问题讨论】:

什么是可接受的计算时间?能否提供一些数据示例作为代码? 汉明距离不应该在字级别计算,它应该在位级别计算。这很容易在那里加速一个数量级。 是的,一个可能的数量级加速可能是一种仅适用于位串的专用算法。我没有找到这样的选项。 【参考方案1】:

我对你所链接的基准有点怀疑,因为根据我的经验,我发现手头问题的定义远远超过了任何一个算法在一组 其他(可能看起来相似)问题。

更简单地说,算法在给定基准上表现出色并不意味着它在您关心的问题上表现出色。即使对问题的表述进行微小或看似微不足道的更改,也可能显着改变任何固定算法集的性能。

也就是说,鉴于您关心的问题的具体情况,我会推荐以下内容:

使用论文 [1] 中描述的级联方法 使用 SIMD 操作(英特尔芯片或 GPU 上的 SSE)来加速,最近邻问题是更接近金属和并行性的操作真正发挥作用的问题 调整算法的参数以最大化您的目标;特别是,[1] 的算法有一些易于调整的参数,这些参数将极大地以性能换取准确性,请确保您对这些参数执行grid search 以将它们设置为最佳位置 解决您的问题

注意:我推荐了论文 [1],因为我尝试了您链接的基准中列出的许多算法,发现它们(用于图像重建任务)都不如 [@987654325 中列出的方法@] 同时比 [1] 复杂得多,这两个属性都是不受欢迎的。 YMMV 取决于您的问题定义。

【讨论】:

【参考方案2】:

我很欣赏这些解决方案,他们给了我一些想法,但我会回答我自己的问题,因为我找到了一个基本上解决了我的问题的解决方案,也许它会在未来对其他人有所帮助。

我使用了基准测试中链接的库之一,hnswlib,因为它不仅比 annoy 稍微提高了性能,而且还具有批量查询选项。 Hnswlib 的算法还允许高度灵活的性能/准确性权衡以支持性能,这非常适合我想做的高度容错近似检查。此外,即使并行化改进远非每核线性,它仍然是一些东西。在我的特定情况下,上述因素相结合可以将速度提高约 5 倍。

正如 ldog 所说,您的里程数可能会因您的问题陈述而异。

【讨论】:

是的,我发现 hnswlib 是基准算法中性能最高的。但是,我上面描述的 [1] 中算法的自定义实现使我的性能比 hnswlib 提高了大约 10-100 倍,召回率更高。取决于您想为此投入多少工作。

以上是关于如果我放宽一些约束,我可以得到近似最近邻的算法快捷方式吗?的主要内容,如果未能解决你的问题,请参考以下文章

k近邻算法(knn)与k-means算法的对比

3K-近邻算法

算法图解读后感(理解概念)贪婪算法动态规划K最近邻算法 其他有用的算法

解密贪心算法——最高效的近似算法

四叉树最近邻算法

快速近似最近邻搜索库 FLANN - Fast Library for Approximate Nearest Neighbors