2011TPAMI-(乘积量化KNN算法)Product Qua

2021-08-04  本文已影响0人  Caucher

标题:近似搜索的乘积量化算法。
乘积量化也是在向量空间数据的KNN搜索中比较特色的一类算法,本篇是开山之作。

编者的总结

  1. 量化实际上就是找k-means做聚类,乘积量化就是分段找k-means,整体上减少聚类中心,也就是码字的占用的空间大小,使得置于内存成为可能。
  2. 本文方法中的“乘积”二字,通常指的是平均分段,然而数据集向量中的值的特征不一定均分,相邻两段之间的值如果有关联也会被打破。本文实验中,分段越少,MSE越低,质量越好,也从侧面说明了这一点。在实验中,作者更改了SIFI,GIFT数据的分段模式,构造了向量的顺序,获得了较大的性能提升(尤其在GIFT)上。

编者的思考

  1. 这个估计距离,无论是SDC还是ADC,都只是近似估计,既不是上界也不是下界,因此无法搜索精确KNN,无法做Range query,也没法做branch-and-bound式的树形剪枝。而最后基于估计距离的KNN,效果也是随缘的。
  2. 本文假设的是数据随粗量化器的分布是基本均匀的,这实际上依赖于使用了K-means算法,如果均匀性出了问题,性能和效果都可能大打折扣。
  3. 和AI领域的算法有类似的通病,参数比较难调,实际用起来有些不便。实验中也能看到,效果受参数影响太大。
  4. inverted file的构建速度和实际占用内存实验没有看到。

1 INTRODUCTION

本文使用欧氏距离,解决高维向量近似KNN问题。

本文方法的优势有两点:

  1. 近似距离的值域扩大了不少,提高了精确性;(相对于汉明码距离)
  2. 可以有预测距离。

2 BACKGROUND: QUANTIZATION, PRODUCT QUANTIZER

这一节主要讲量化和乘积量化的背景知识,是后面算法的基础。

2.1 Vector Quantization

2.2 Product Quantizers

上面是说对于一个向量的量化器的构造和评价。

3 SEARCHING WITH QUANTIZATION

3.1 Computing Distances Using Quantized Codes

这里在量化码上进行距离计算有两种方式,就是如下图中两根黑色实线。其中红色实线是真实距离,黑色实线是估计距离。注意这里的估计距离就只是估计,没有任何上下界的性质。不过大抵可以想象得到,第二种比第一种逼近的要强一点,毕竟要真实一些。


image.png

设query为x,数据集中的向量数据点为y。

3.2 Analysis of the Distance Error

首先说,本节的分析适用于满足第2节提到的两个最优化条件的所有量化手段,不局限于特定的量化器。
对于一个量化器q,定义了MSDE(q),就是利用这个量化器,估量距离和真实距离差值平方的期望是多少。
根据下图简单的三角不等式证明,这个期望MSDE(q)是不会超过量化器q的MSE(q)的。


image.png

同样,对于SDC距离,这个上界是2MSE(q),就要差一些。
不过注意,说到底,这也只是一个期望的上界,是统计学意义上的。


image.png

4 NONEXHAUSTIVE SEARCH

思考一下,即使我们用了刚才的估计距离,但是如果要找KNN,还是要彻底扫一遍数据集,复杂度至少和数据集大小成正比,这在大数据集上是不可能的。为了解决这个问题,作者提出了IVFADC。其基本策略就是粗细粒度结合。

4.1 Coarse Quantizer, Locally Defined Product Quantizer

我们刚才所说的基于K均值分段做量化器,在这里被称之为粗量化器,根据文中来看,在这一部中,可以分成的Voronoi Cell的个数k'(注意在这里更名为k')在1000-1000000左右,这个个数是偏少的。因此粗量化器可以仅用来首先将数据先分布到各个Voronoi Cell中,然后在query中定位query所在的Cell,仅搜索当前Cell,和周边的w个cell。
现在问题就是定位好Cell了,如何在cell中搜索得到KNN呢?
作者在这里定义了残存向量:

image.png
残存向量,实际上就是相对于粗量化器centroid的偏移向量。进一步,细量化器可以对残存量再次做一次量化,分m段。

4.2 Indexing Structure

索引结构是一个翻转链表。
注意在IVFADC中,k'是粗量化器每段的Centroid数,k*是细量化器(残存向量量化器)每段的Centroid数。由于是翻转链表结构,数据项除了id以外,只需要细量化器的量化码即可。

4.3 Search Algorithm

搜索主要指近似KNN算法。这个搜索算法就不再扫描所有向量数据,只扫描一部分相关数据。这部分相关数据就是将query定位到粗量化器的量化值所指定的Voronoi Cell,然后得到list。对于list中所有entry,都算一次近似距离,这个近似距离的公式如下:
d(x,y) = d(r(x), q_p(r(y)))
其中x是query向量,y是数据库里的向量数据。
当然,r(x)将在搜索之前,提前和所有的细量化器的codebook中所有量化值算距离,这样每次计算距离,就是查表。
基于这个近似距离,去排一个KNN作为近似结果。

5 EVALUATION OF NN SEARCH

一个常用的度量是Recall@R,表示召回R个结果,其中存在1NN的概率是多少。注意这个和精度不太一样,当R=1的时候才表示精度。

5.2 Memory versus Search Accuracy: Trade-Offs

下图固定了细量化器每段的Centroid数k*,因此横轴只需要依次增加段数m,就线性增加了code length。(IVFADC只需要存残存向量量化码)

  1. 搜索量(w)多一些,效果越好。
  2. 但是请注意中间两条线,仅增加k'不增加w,会导致实际搜索量降低,效果反而降低一大截。作者也提到,算法效果和参数强相关。
  3. 乍一看IVFADC似乎还不如ADC,其实原因是ADC要扫描整个量化后的数据集(至少要扫描所有量化码),然后找出近似距离的KNN。而IVFADC首先找到query所在的(粗)量化码,然后找出周边的几个(粗)量化码,然后进一步搜索。效率上要高得多,所以精度差一点可以理解。
    • 具体来说,搜索的比例近似于w/k',那么在搜索比例不变的条件下,k'是越大精确率越高,因为分割就越细。


      image.png

5.3 Impact of the Component Grouping

5.4 Comparison with the State of the Art

5.5 Complexity and Speed

上一篇 下一篇

猜你喜欢

热点阅读