2012CVPR是本论文的会议版本。
本文是乘积量化技术(PQ) 最典型的索引方式。
乘积量化技术在查询时,需要找到query对应Voroni cell或者和周边cell的点,如果数据量比较大,Cell也比较大的话,那么返回的点就会很多,需要花在Refine上的时间也会更多。因此一个迫切的要求是设计更为细粒度的分区,即vorooni cell面积更小。
一个最直接的方式是把codewords的个数提升一些,但是这同时意味着索引构建时间(学习时间)也更长。
一些索引方法也可以引入进来,比如kd-tree,tree codebooks等,但是经常会降低查询准确性。
本文提出的方法:多维倒排索引,在很多方面和倒排索引很相似,其优势是在不增加查询和构建时间的基础上,相比于倒排索引,能产生更细粒度的子分割(在中等大小的codebooks上)。内存消耗的增长也非常微小。
多维倒排索引尤其适用于大数据集上。
形式化上的来讲,空间上的每一个点,都找每一段(每个轴/维度)上找和它最近的那个聚类中心(codeword),各个维拼起来,就找到了所在的格子。
注意,这里需要各段的距离可以线性叠加,或至少有公式可以计算,比如欧氏距离的平方就可以直接相加表示拼接起来的距离。
【编者注:考虑用Voroni cell做空间划分,然后用倒排索引做索引结构的情况:此时codeboos的大小也是一样的,但是在查询时,需要额外增加次计算算出和各个聚类中心的距离,计算到每个聚类中心的距离只需要查表就可以了。内存负载和多维倒排索引是一样的。列表长度相对也会更为均衡。】
通过上述搜索方法得到的candidate vectors,被赋予量化后的向量和量化后的残存向量,进一步进行rerank。
本文将rerank过程进一步加速。
【编者注:有空更新】
Recall定义为1-NN准确找到的概率。
T是检索的对象数。个人觉得和非PQ系列的方法对比意义有限。
作者说,标准倒排索引的速度快,很可能来自向量化实现。
引入PCA降维之后,查询速度肯定会变快,文中没有实验。问题在于精确率会不会下降。
作者做了两种pca,一种native是直接对原始数据PCA,128维降成32维;另一种是分PQ-aware是分两段分别PCA再拼起来。
可以看到PQ-aware-PCA对准确率影响很小。