Product Quantization for Nearest Neighbor Search 论文笔记

坚强是说给别人听的谎言 提交于 2020-12-23 20:33:53
  • 摘要

  本文介绍了一种基于乘积量化的近似最近邻搜索方法。 这个想法是将空间分解为低维子空间的笛卡尔积,并分别量化每个子空间。 矢量由其子空间量化索引和短码表示。 可以从它们的码字有效地估计两个矢量之间的欧氏距离。 非对称版本增加了精度,因为它计算向量和码字之间的近似距离。 实验结果表明,我们的方法有效地搜索最近邻居,特别是与倒置文件系统相结合。 SIFT和GIST图像描述符的结果显示出优异的搜索精度,优于三种最先进的方法。 我们的方法的可扩展性在20亿个向量的数据集上得到验证。

  • 简介

  在本文中,我们使用量化构造短码字。 目标是使用向量到质心距离来估计距离,即,不对量化查询向量,仅将代码分配给数据库向量。 这减少了量化噪声并随后提高了搜索质量。 为了获得精确的距离,必须限制量化误差。 因此,质心的总数k应该足够大,例如,对于64位代码,k = 2^64。 这引发了关于如何学习码本和分配的几个问题:首先,学习量化器所需的样本数量很大,即几倍于k。 其次,算法本身的复杂性令人望而却步。 最后,地球上可用的计算机内存量不足以存储表示质心的浮点值。

  分层k均值(HKM)提高了学习阶段和相应分配程序的效率[13]。 然而,上述限制仍然适用,特别是关于存储器使用和学习集的大小。 另一种可能性是标量量化器,但就存储器和重建误差之间的权衡而言,它们提供了差的量化误差特性。 格子量化器为均匀矢量分布提供了更好的量化特性,但现实世界矢量很少满足这种条件。 实际上,这些量化器在索引任务中的表现明显比k均值差[20]。 在本文中,我们关注乘积量化器。 据我们所知,这种半结构化量化器从未在任何最近邻搜索方法中被考虑过。

  我们的方法的优点是双重的。 首先,可能的距离数量明显高于竞争汉明嵌入方法[18],[15],[17],因为这些技术中使用的汉明空间仅允许几个不同的距离。 其次,作为该方法的副产品,我们得到了预期平方距离的估计,这是“ - 半径搜索或使用Lowe的距离比率标准[21]所需的。在[18]中使用汉明空间的动机, [15],[17]是有效地计算距离。但是,请注意,计算汉明距离的最快方法之一是使用表查找。我们的方法使用相似数量的表查找,从而产生可比较的效率。

  查询向量与所有码字的详尽比较对于非常大的数据集来说是禁止的。 因此,我们引入了修改的反向文件结构,以快速访问最相关的向量。 粗量化器用于实现该反转文件结构,其中对应于簇(索引)的向量存储在相关列表中。 列表中的向量由我们的乘积量化器计算的短码表示,其在此用于编码关于簇中心的残差向量。

  我们的方法的兴趣在两种向量上得到验证,即局部SIFT [21]和全局GIST [16]描述符。 与现有技术的比较表明,我们的方法优于现有技术,特别是频谱散列[17],Hamming嵌入[18]和FLANN [7]。

  • 背景:量化,乘积量化

  关于矢量量化的文献很多,参见[22]的调查。 在本节中,我们将限制在本文其余部分中使用的符号和概念。

  • 向量量化

  量化是一种破坏性过程,已在信息理论中得到广泛研究[22]。 其目的是减少表示空间的基数,特别是当输入数据是实值时。 形式上,量化器是将D维向量映射到向量q,我从现在开始的索引集假定为有限,再现值ci称为质心。 该组再现值C是大小为k的码本。

  映射到给定索引i的向量的集合Vi是称为(Voronoi)单元。

  量化器的k个单元形成IRD的分区。 根据定义,位于相同单元Vi中的所有矢量由相同的质心ci重建。 量化器的质量通常通过输入矢量x与其再现值之间的均方误差来测量。

  为了使量化器最佳,它必须满足称为劳埃德最优性条件的两个性质。 首先,就欧氏距离而言,向量x必须量化为其最近的码本质心:argmin d(x,ci)

  结果,单元由超平面界定。 第二个劳埃德条件是重建值必须是位于Voronoi单元格中的向量的期望:ci=∫p(x)xdx

  Lloyd量化器对应于k均值聚类算法,通过迭代地将训练集的向量分配给质心并从指定的点重新估计这些质心来找到接近最优的码本。 在下文中,我们假设两个Lloyd条件成立,因为我们使用k-means学习量化器。 然而,注意,k均值仅在量化误差方面找到局部最优。

  • 乘积量化

  让我们考虑一个128维向量,例如,SIFT描述符[21]。 产生64位码字的量化器,包含k个2^64质心。 因此,不可能使用劳埃德算法甚至HKM,因为所需的样本数量和学习量化器的复杂度是k的几倍。 甚至不可能存储表示k个质心的DXk浮点值。

  乘积量化是解决这些问题的有效解决方案。 这是源编码中的常用技术,它允许我们选择要联合量化的组件的数量(例如,可以使用强大的Leech点阵量化24个组件的组)。 输入向量x被分成m个不同的子向量,维度D*=D /m,其中D是m的倍数。 使用m个不同的量化器分别量化子向量。 因此,给定的向量x映射如下:

  其中qj是与第j个子向量相关联的低复杂度量化器。 利用子量化器qj,我们将索引集Ij,码本Cj和相应的再现值cj, i相关联。

  乘积量化器的再现值由乘积索引集元素标识。 因此,码本被定义为笛卡尔积:

  

  并且该集合的质心是m个子量化器的质心的串联。 从现在开始,我们假设所有子量化器具有相同的有限数量k的再现值。 在这种情况下,质心的总数由下式给出

  k=(k*)^m

  注意,在m = D的极值情况下,矢量x的分量都被分别量化。 然后,乘积量化器证明是标量量化器,其中与每个分量相关联的量化函数可以是不同的.

  乘积量化器的强度是从几组小质心产生大量质心:与子量化器相关的质心。 当使用Lloyd算法学习子量化器时,使用有限数量的向量,但是在某种程度上,码本仍然适合于要表示的数据分布。 学习量化器的复杂性是使用维度D的k个质心执行k均值聚类的复杂度的m倍。

  明确存储码本C效率不高。 相反,我们存储所有子量化器的mXk*个质心,即mD* k*=k* D个浮点值。 量化元素需要k* D浮点运算。 表1总结了与k-means,HKM和产品k-means相关的资源需求。 乘积量化器显然是唯一可以在内存中为大k值索引的量化器。

  

  为了在选择k*的常数值时提供良好的量化特性,每个子矢量平均应具有可比较的能量。 确保该属性的一种方法是在量化之前将矢量乘以随机正交矩阵。 但是,对于大多数矢量类型,这不是必需的,也不推荐使用,因为连续的组件通常通过构造相关联,并且与相同的子量化器一起更好地量化。 由于子空间是正交的,因此与乘积量化器相关的平方失真是

  

  可以观察到,对于固定数量的比特,最好使用具有许多质心的少量子量化器而不是具有少量比特的许多子量化器。 在极端情况下,当m = 1时,乘积量化器变为常规的k均值码本。

  高k*值会增加量化器的计算成本,如表1所示。它们还会增加存储质心的内存使用量(k* X D浮点值),如果质心查找表在缓存中不再适合,则会进一步降低效率在m=1的情况下,我们不能使用超过16位来保持这种成本易处理。 使用k*=256和m=8通常是合理的选择。

  • 搜索量化

   最近邻搜索取决于查询向量与数据库向量之间的距离,或者等效于平方距离。 本节介绍的方法基于量化指标对矢量进行比较。我们首先解释乘积量化器属性如何用于计算距离。 然后我们提供了距离估计误差的统计界限,并提出了欧氏距离平方的精细估计。

  • 使用量化码计算距离

  让我们考虑查询向量x和数据库向量y。 我们提出了两种计算这些矢量之间的近似欧氏距离的方法,一种是对称的,一种是非对称的。 有关说明,请参见图2。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!