(FLANN论文)fast approximate nearest neighbors with automatic algorithm configuration——中英对照翻译

Fast Approximate Nearest Neighbors With Automatic Algorithm Configuration


Abstract

在这里插入图片描述
在许多计算机视觉问题中,最耗时的部分是高维空间中的最近邻匹配。
没有已知的精确算法能比线性搜索更快地解决这些高维问题。
众所周知,近似算法可以提供很大的加速,但精度损失很小,但许多这样的算法已经发表,对于任何给定的问题,在选择算法及其参数方面只有很少的指导。
在本文中,我们描述了一个回答“什么是最快的近似最近邻算法”问题的系统
我们的系统将采取任何给定的数据集和所需的精度,并使用这些自动确定最佳算法和参数值。
我们还描述了一种新的算法,将优先级搜索应用于分层k-means树,这种算法可以在许多数据集上找到最好的性能。
经过一系列的测试,我们发现随机多重k-d树为其他数据集提供了最好的性能。
我们发布了实现这些方法的代码。这个库在查询时间方面比以前最好的软件提高了一个数量级,并且提供了完全自动化的参数选择。


1 INTRODUCTION

在这里插入图片描述
在许多计算机视觉算法中,计算开销最大的部分是搜索与高维向量最接近的匹配。
这类问题的例子包括在大数据集中寻找局部图像特征的最佳匹配、使用k-means或类似算法将局部特征聚类为视觉词汇、在大数据集中进行归一化互相关比较图像斑块
最近邻搜索问题在许多其他应用中也具有重要意义,例如:机器学习、文档搜索、数据压缩、生物信息、数据分析等。

在这里插入图片描述
在这里插入图片描述
我们可以这样定义最近邻搜索问题:
在向量空间X中给出一系列的点P=p1,p2…这些点必须进行预处理,这样当给定一个新的查询点q∈X时,可以有效地找到P中最接近q的点。
在本文中,我们将假设X是一个适合于大多数计算机视觉问题的欧几里德向量空间。
我们将描述我们的方法对一般度量空间的潜在扩展,尽管这将以一些成本效率为代价。

在这里插入图片描述

对于高维空间,通常没有比线性搜索更高效的最近邻搜索算法。
由于线性搜索对于许多应用程序来说代价太大,因此人们对执行近似最近邻搜索的算法产生了兴趣,在这种算法中,有时会返回非最优近邻。
这种近似算法可以比精确搜索快几个数量级,同时仍然提供接近最优的精度。
在这里插入图片描述
在这里插入图片描述
关于近似最近邻搜索的算法已经发表了数百篇论文,但是却鲜有文章系统的对比这些算法,以指导如何选择算法并设置其内部参数。
其中一个原因是,由于数据集,维度、相关关系、聚类特征和规模等属性各不相同,因此算法的相对性能差异很大。
在这篇论文中,我们通过在具有广泛维度的现实数据集的范围内比较最有前途的方法,从而对结果进行了排序。
此外,我们还开发了一种自动算法选择和配置的方法,它允许为任何给定的数据集自动确定最佳算法和参数设置。
如果将来发现其他算法能够为特定的数据集提供更好的性能,这种方法也可以很容易地进行扩展。
我们的代码是公开的,便于其他人进行比较和做出改进。
在这里插入图片描述
我们还介绍了一种改进的算法,使用层次 k-means trees.。
以前搜索k-means trees的方法使用了以深度优先顺序搜索的分支定界方法,而我们的方法使用了一个优先队列,根据每个k-means域与查询的距离按顺序扩展搜索。
此外,通过限制执行k-means聚类的迭代次数,我们可以将树构造时间减少一个数量级。
对比许多数据集,我们发现该算法的性能最高。
在这里插入图片描述
对于其他数据集,我们发现使用随机多重kd-trees的算法提供了最好的结果。
这个算法是刚刚提出来的(2004;2008),并没有被广泛的验证。
我们的结果表明,一旦确定了最优参数值,该算法与以前使用单一kd-trees的方法(这种方法在过去是最好的)相比,通常算法性能会有一个数量级的改进。
在这里插入图片描述
从使用我们软件的人的角度来看,不需要熟悉算法,只需要调用一些简单的库例程即可。
用户提供一个数据集,我们的算法使用交叉验证方法来识别最佳算法,并搜索最佳参数值,用来最小化未来查询的预测搜索成本。
用户还可以指定希望接受一个非最佳查询时间,以换取内存使用的减少、数据结构构建时间的减少或参数选择时间的减少。
在这里插入图片描述
在这里插入图片描述
我们通过将图像补丁与数据库中的10万个其他补丁进行匹配来演示我们的方法,这些补丁是在不同的光照和成像条件下拍摄的。
在我们的实验中,我们证明了该算法可以有相对于线性搜索1000倍的速度,同时仍然可以正确识别出95%的最近邻居。


2 PREVIOUS RESEARCH

在这里插入图片描述
最广泛使用的最近邻搜索算法是kd-tree,该算法适用于低维数据的精确最近邻搜索,但随着维数的增加,它的有效性会迅速下降。
Arya et al. 对原kd-tree算法进行修改,使之用于近似匹配。
他们使用ε-近似最近邻的概念给解的精度加上一个界限:如果dist(p, q)≤(1 + ε)dist(p∗,q),那么点p是q的ε-近似最近邻点。
作者还建议使用优先队列,通过访问树节点与查询点的距离来提高搜索速度。
Beis和Lowe (Beis and Lowe, 1997)描述了一种类似的基于kd-tree的算法,但采用了基于检查叶片节点的固定数量的停止准则,比ε-approximate算法截断性能更好。
在这里插入图片描述
Silpa-Anan and Hartley (Silpa-Anan and Hartley,2008)提出使用随机多重kd-trees作为加快近似最近邻搜索的方法。他们只执行有限的测试,但我们发现这可以很好地解决各种各样的问题。
在这里插入图片描述
Fukunaga和Narendra (Fukunaga and Narendra,1975)提出,通过用k-means算法将数据点聚类到k个不相交的组中,然后递归地对每个组做相同的操作,用树形结构来执行最邻匹配。
因为他们需要计算每个簇的平均值,所以他们提出的树需要矢量空间。
Brin (Brin, 1995)提出了一种类似的树,称为GNAT,即几何近邻访问树,他使用一些数据点作为聚类中心,而不是计算聚类均值点。
这种变化允许在一般的度量空间中定义树。
在这里插入图片描述
Liu等人(Liu et al., 2004)提出了一种新的度量树,允许每个节点的子节点之间有重叠,称为溢出树。
然而,到目前为止,我们的实验已经发现,随机化的kd-trees算法可以在更少的内存占用下提供更高的性能。
在这里插入图片描述
在这里插入图片描述
Nister and Stewenius (Nister and Stewenius,2006)提出了一种在大型数据库中快速搜索最近邻特征的方法。
他们的方法是基于访问层次k-means tree的单个叶子节点,这种方法和Fukunagaand Narendra (Fukunaga and Narendra, 1975)提出方法类似。
在这里插入图片描述
在(Leibe et al., 2006)中,作者提出了一种在大数据集中进行特征聚类和匹配的有效方法。
他们比较了几种聚类方法:k-means clustering, agglomerative clustering,and a combined partitional-agglomerative algorithm
类似地,(Mikolajczyk和Matas, 2007)评估了几种树结构的最近邻匹配性能,包括:kd-tree, the hierar-chical k-means tree, and the agglomerative tree.
我们已经用这些实验来指导我们选择算法。


3 FINDING FAST APPROXIMATENEAREST NEIGHBORS

在这里插入图片描述
在这里插入图片描述
我们比较了许多不同算法在不同维度数据集上的近似最近邻搜索。
近似的精度是用精度来衡量的,精度定义为找到正确的最近邻居的查询点的百分比。
在我们的实验中,两种算法中的一种获得了最好的性能,这取决于数据集和期望的精度。
算法要么是分层k-means tree,要么是随机多重kd-trees。
在这一节中,我们将从描述这些算法开始。
在实验部分,我们将与其他一些方法进行比较。


3.1 The randomized kd-tree algorithm

在这里插入图片描述
经典的kd-tree算法(Freidman et al.,1977)在低维时是有效的,但在高维时性能迅速下降。
为了获得比线性搜索更快的速度,有必要解决一个近似的最近邻问题。
这提高了搜索速度,代价是算法返回的结果不总是精确的最近邻。
在这里插入图片描述
在这里插入图片描述
Silpa-Anan和Hartley (Silpa-Anan and Hartley,2008)最近提出了一个改进版本的kd-tree算法,其中创建了多个随机kd-trees。
原始的kd-tree算法在数据显示最大方差的维度上,在树的每一层上将数据分成两半。
通过比较,随机树是在第一个随机选择分裂维(D维)来构建的。在这个维度下,数据具有最大方差。
在我们的实现中,我们使用固定值D = 5,因为这在我们所有的数据集上执行得很好,并且不能从进一步的调优中得到明显的好处。
在这里插入图片描述
当搜索树时,在所有随机化的树中保持一个单一的优先级队列,这样可以通过增加到每个bin边界的距离来对搜索排序。
近似的程度是通过检查固定数量的叶节点来确定的,在这一点上搜索将终止,返回最佳的候选节点。
在我们的实现中,用户只指定所需的搜索精度,这在训练期间用于选择叶节点的数量,以便实现该精度。


3.2 The hierarchical k-means treealgorithm

在这里插入图片描述
通过使用K -means聚类将每一层的数据点分割成K个不同的区域,然后将相同的方法递归地应用到每个区域的点上,从而构造出分层的K -means tree。
当区域内的点数小于K时,我们停止递归。
图1显示了由100K 个SIFT特征使用不同的分支因子构造的几个层次K -means tree的投影。


在这里插入图片描述


在这里插入图片描述
通过类比已经发现的改进kd-tree的探索,我们开发了一种算法,以best-bin-first 的方式探索分层k-means tree.
该算法首先对树执行一次遍历,并将路径上每个节点中所有未探索的分支添加到优先队列中。
接下来,它从优先队列中提取离查询点最近中心的分支,并从该分支重新对树执行一次遍历。
在每次遍历中,算法不断将路径上未探索的分支添加到优先队列中。
近似的程度与随机化的kd-trees相同,在检查了预定数量的叶节点(数据集点)后尽早停止搜索。
该参数在训练时设置,以实现用户指定的搜索精度。
在这里插入图片描述
在这里插入图片描述
我们实验了许多变化,例如使用到最近的Voronoi border的距离而不是到最近的聚类中心的距离,使用多个随机的k-means trees,或者使用Leibeet al. (Leibe et al., 2006)提出的凝聚聚类。
然而,研究发现这些并没有提高性能。


3.3 Automatic selection of the optimalalgorithm

在这里插入图片描述
我们的实验表明,快速近似最近邻搜索的最优算法高度依赖于几个因素,如数据集的结构(数据集的特征之间是否存在任何相关性)和期望的搜索精度。
此外,每种算法都有一组对搜索性能有重要影响的参数。
这些参数包括在kd-trees的情况下使用的随机树的数量或分支因子,以及在分层k-means tree的情况下使用的迭代次数。
在这里插入图片描述
通过将算法本身作为一个通用最近邻搜索程序的参数,问题简化为确定给出最佳解的参数。
这是一个参数空间的优化问题。
开销是根据搜索时间、树构建时间和树内存开销的组合来计算的。
根据应用程序的不同,这三个因素的重要性各不相同:在某些情况下,我们不太关心树的构建时间(如果我们只构建一次树,并将它用于大量查询),而在其他情况下,树的构建时间和搜索时间都必须很短(如果树是在线构建的,并且只搜索了少量的次数)。还有些情况下,我们希望限制内存开销。
我们通过使用构建时权重wb和内存权重wm来控制这些因素的相对重要性,以计算总成本。
在这里插入图片描述
其中s表示对样本数据集中向量个数的搜索时间,b表示树构建时间,m = mt/ md表示用于树的内存(mt)与用于存储数据的内存(md)的比率。
在这里插入图片描述
在这里插入图片描述
构建时间权重(wb)控制了相对于搜索时间的树构建时间的重要性。
设置wb= 0意味着我们想要最快的搜索时间,而不关心树的构建时间,而wb= 1意味着树的构建时间和搜索时间具有相同的重要性。
类似地,内存权重(wm)控制了内存开销相对于时间开销的重要性。
时间开销是相对于最优时间成本(s + wbb)opt计算的,如果内存使用不是一个因素,则它定义为最优搜索和构建时间。
因此,设置wm= 0将选择导致最快搜索和构建时间的算法和参数,而不考虑内存开销,而设置wm= 1将给内存使用增加百分比,使其与搜索和构建时间占同等权重。
在这里插入图片描述
我们采用两步法选择最近邻算法和最优参数:对参数空间进行全局探索,然后对最佳参数进行局部调整。
首先,我们在多个点上对参数空间进行采样,并选择那些使方程1的代价最小的值。
对于这一步,我们考虑使用{1,4,8,16,32}作为随机kd-trees的个数,{16,32,64,128,256}作为k-means树的分支因子,{1,5,10,15}作为k-means迭代的次数。
在第二步中,我们利用多元函数最小值(Downhill Simplex法)进一步局部探索参数空间,并对第一步得到的最佳参数进行微调。
虽然这不能保证全局最小值,但我们的实验表明,获得的参数值接近最优。
在这里插入图片描述
优化可以在完整数据集上运行,也可以只在数据集的一部分上运行。
使用完整的数据集可以得到最准确的结果,但在大数据集的情况下,可能需要比预期更多的时间。
有一个办法是使用数据的一部分来选择参数值。
我们发现通常选择参数只需要使用十分之一的数据集即可,效果和使用全部数据极其相近。
对于每种类型的数据集,参数选择只需要执行一次,我们的库允许保存这些值,并应用于所有未来相同类型的数据集。


4 EXPERIMENTS


4.1 Randomized kd-trees

在这里插入图片描述
图2同时显示了在许多随机化kd-trees中搜索的值。
可以看出,性能随着随机树数量的增加而提高,直到某个点(在本例中大约是20棵随机树),而增加随机树数量将进一步导致性能的稳定或降低。
使用多个随机树的内存开销随着树的数量线性增加,因此,如果分配了内存使用的重要性,代价函数可能会选择一个较低的数字。


在这里插入图片描述


4.2 Hierarchical k-means tree

在这里插入图片描述
在这里插入图片描述
层次k-means tree算法对于某些数据集具有最高的性能。
然而,这种算法的一个缺点是该算法树构建时间比随机化kd-trees算法要长。
通过在k-means集群阶段进行少量的迭代,而不是一直运行到收敛,可以显著减少树构建时间。
图3显示了在k-means聚类步骤中使用有限迭代次数构造的树的性能,相对于k-means聚类运行到收敛时的性能。
可以看到,只需7次迭代,我们就可以获得使用完全收敛构造的树的90%以上的最近邻性能,但只需要不到10%的构建时间。


在这里插入图片描述


在这里插入图片描述
当在k-means聚类中使用零迭代时,我们得到了更一般的GNAT树(Brin,1995),它假设数据是在一个泛型度量空间,而不是向量空间
然而,图3(a)显示,该树的搜索性能比层次化的k-means tree差(比k-means tree效果差5倍)。


4.3 Data dimensionality.

在这里插入图片描述
在这里插入图片描述
数据维度是影响最近邻匹配性能的重要因素之一。
图4(a)显示了搜索性能如何随着维度的增加而下降。
每个数据集包含10万个向量,其值从相同的均匀分布中随机抽样。
这些随机数据集是最近邻搜索最困难的问题之一,因为没有任何值给出任何其他值的预测信息。
从图4(a)可以看出,对于高维数据,最近邻搜索效率较低(当维数大于800时,对于68%的精度,近似搜索速度并不比线性搜索好)。
然而,由于维度之间的相关性,真实世界的数据集通常要容易得多。


在这里插入图片描述


在这里插入图片描述
对于许多真实的数据集,性能是明显不同的。
图4(b)显示了重新采样的Winder/Brown图像补丁的加速维数函数,以实现不同的维数。
图4(b)显示了加速作为一个维度函数来对Winder/Brown图像补丁进行重新采样,以实现不同的维度。
但是在这种情况下,加速度并没有随着维度的增加而减少,甚至在某些精度上它实际上是在增加。
这可以用一个事实来解释,即维度之间存在很强的相关性,因此即使是64x64个patch(4096个维度),只有少数维度之间的相似性提供了整体补丁相似性的有力证据。
在这里插入图片描述
图5显示了四个查询示例,这四个例子是来自Trevi数据集中的不同大小的patch。


在这里插入图片描述


4.4 Search precision

在这里插入图片描述
在这里插入图片描述
所需的搜索精度决定了任何近似算法可以获得的加速程度。
查看图6 (b) (sift1M数据集)我们看到如果我们愿意接受精度为60%,这意味着算法返回的40%的邻居不是最精确的,仅仅是近似的邻居,与线性搜索相比,我们可以实现三个数量级的加速(使用多重随机kd-trees)。
然而,如果我们要求精度大于90%,那么加速就会更小,小于2个数量级(使用层次k-means tree)。
在这里插入图片描述
在图6的实验中,我们使用了几个不同维度的数据集。
我们从CD封面图像中提取了超过500万个SIFT特征,通过随机采样,构建了一个10万和 100万个SIFT特征数据集(Nister and Stewenius, 2006)。
这两个通过随机采样获得的数据集在最近邻匹配方面有较高的难度,因为它们所包含的特征在它们之间通常没有“真”匹配。
在图6(b)的实验中,我们还使用了来自同一来源的全部3100万个特征数据集。
此外,我们使用了第4.3小节中描述的patches数据集和另一个10万个 SIFT特征数据集,这些特征数据集来自一组形成全景的图像。


在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
我们在第一个100000个SIFT特征数据集上,对在寻找快速近似最近邻方面是最好的两种算法(多重随机kd-trees和分层k-means tree)和现有的ANN算法(Aryaet al., 1998)和LSH算法(Andoni, 2011)进行了比较。
由于 LSH实现(E2LSH包)解决了the R-near neighbor问题(在查询点的半径R内找到邻居,而不是最近的邻居),为了找到最近的邻居,我们使用了E2LSH的用户手册中建议的方法:我们计算R-near邻居以增加R的值。
使用E2LSH包中包含的参数估计工具来选择LSH算法的参数。
对于每一种情况,我们都计算了精度,即正确找到最近邻居的查询点的百分比。
从图6(a)可以看出,分层k-means算法的性能比ANN算法和LSH算法都高出约一个数量级。
ANN算法的结果与图2中的实验结果一致,因为ANN算法只使用了一棵kd-tree,并且由于使用了多重随机树,所以没有从加速中受益。
在这里插入图片描述
在这里插入图片描述
图6(b)显示了随机化kd-trees和分层k-means在不同规模数据集上的性能。
图显示了在随着数据集大小的增加,两种算法具有很好的伸缩性,线性搜索的加速速度随着数据集大小的增加而增加。
在这里插入图片描述
在这里插入图片描述
图6©比较了当数据集包含测试集中每个特征的真匹配时和包含假匹配时最近邻匹配的性能。
在这个实验中,我们使用了上述两个10万个 SIFT特征数据集。
第一个是从5百万sift特征数据集中随机抽样,它包含测试集中每个特征的假匹配。
第二个包含从一组全景图像中提取的sift特征。
这些特征是从图像的重叠区域中提取的,我们只使用在数据集中有真正匹配的特征。
我们的实验表明,当查询特征比其他邻居更接近时,随机化的kd-trees在真匹配方面有显著更好的性能。
在这里插入图片描述
图6(d)显示了随机化kd-trees算法 和层次k-means trees算法 在一个Winder/Brown patch数据集之间的性能差异。
在这种情况下,随机化kd-trees算法的性能明显优于分层k-means算法,除了精度非常接近100%。
当数据的内在维数远低于实际维数时,kd-tree算法的工作效果更好,这可能是因为它能更好地利用维数之间的相关性。
然而,图6(b)显示,k-means tree算法可以在其他数据集上表现得更好(特别是在结果需要高精度时)。
这显示了在每个数据集上执行算法选择的重要性。


4.5 Automatic algorithm and parameter selection.

在这里插入图片描述
在表1中,我们展示了在包含10万个随机采样SIFT特征的数据集上运行3.3中描述的参数选择过程的结果。
我们使用了两种不同的搜索精度(60%和90%)和几种权衡因子wb和 wm的组合。
对于构建时的权重wb,我们使用三种不同的可能值:
0代表的是我们不关心树构建时间情况;
1代表的是树构建时间和搜索时间有相同的重要性情况;
0.01代表的情况下,我们主要关心搜索时间,但我们也希望避免大量的树构建时间。
类似地,内存权值被选为0时,我们不关心内存使用;∞代表内存使用是主要关注的问题,1作为两种情况之间的中间位置。


在这里插入图片描述


在这里插入图片描述
在这里插入图片描述
通过检查表1,我们可以看到,对于构建树时间或内存开销具有最高权重的情况,选择的算法是具有单个树的kd-tree算法,因为它是内存效率最高且构建树速度最快的算法。
当不考虑树的构建时间和内存开销时,选择的算法为k-means,如图6(b)所示。
k-means算法的分支因子和迭代次数取决于搜索精度和树构建时间的权重:更高的分支因子被证明在更高的精度时有更好的性能;当分支因子或迭代次数增加时,树构建时间也会增加。


5 CONCLUSIONS

在这里插入图片描述
在本文描述的方法中,自动算法配置程序允许用户通过调用单个库例程来实现高性能的近似最近邻匹配。
用户只需提供将要使用的数据集类型的示例和所需的精度,并且可以在操作上指定最小化内存或树构建时间的重要性,而不仅仅是搜索时间。
剩下的所有算法选择和参数优化步骤都是自动执行的。
在这里插入图片描述
在我们的实验中,我们发现两种算法都可以有最好的性能,这取决于数据集和期望的精度。
其中之一是我们开发的一种算法,它结合了以前的两种方法:搜索层次-cal k-means trees和优先级搜索顺序。
第二种方法是使用多个随机kd-trees。
我们已经证明,与线性搜索相比,这些方法可以将高维向量的匹配速度提高几个数量级
在这里插入图片描述
在这里插入图片描述
自动算法配置的使用,将易于合并将来发现的对特定数据集具有优越性能的任何新算法。
我们打算继续向我们的网站添加新的数据集,并为进一步的算法提供测试结果。
我们的公共领域的库将使其他人能够详细的比较新的方法,并为该软件的扩展作出贡献。


ACKNOWLEDGMENTS

在这里插入图片描述
该研究得到了加拿大自然科学与工程研究委员会和加拿大高级研究所的支持。我们要感谢Matthew Brown, RichardHartley, Scott Helmer, Hoyt Koepke, Sancho Mc-Cann, Panu Turcot和Andrew Zisserman关于这项工作的有价值的讨论和有用的反馈。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

袁博特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值