最近邻搜索之乘积量化 理解(二)
本篇文章讲下索引结构和搜索。
一、检索和距离的关系—ADC
假如做法是以图搜图,那么输入图像为x,要从数据库中找出与x最匹配的图像集{y},首先提取特征,特征向量就代表图像,如果特征向量之间的距离越小,图像之间相似度越大,检索就是要找出,公式中d的选取可以是欧式距离,求x与y各个分量的差的平方和。PQ(乘积量化)中ADC的做法并不是求各个分量差的平方和,而是求x与y量化后的向量之间各个分量差的平方和。用公式表示如下:
示意图如下:
把求x与y的距离用x与q(y)的距离代替,q(y)是y量化后的结果。这样做之所以可行,论文中有详细推到,我的理解是两个原因:1)MSE越小,说明量化器的精度越高,2)三角形两边之和大于第三边,两边只差小于第三边。
由于只是对y做量化,对x未量化,这是不对称的,这就是ADC(Asymmetric distance computation)中Asymmetric的含义。如果对y也量化,对x也量化,就是对称的。
二、索引结构
索引的建立过程如下:
上图中主要涉及三个过程,coarse quantizer,product quantizer和append to inverted list。
1.coarse quantizer。
对数据库中的所有特征采用K-means聚类,得到粗糙量化的类中心,比如聚类成1024类,并记录每个类的样本数和各个样本所属的类别。这个类中心的个数就是inverted list的个数。把所有类中心保存到一张表中,叫coarse_cluster表,表中每项是d维。
2.product quantizer
计算y的余量,,用y减去y的粗糙量化的结果得到r(y)。r(y)维数与y一样,然后对所有r(y)的特征分成m组,采用乘积量化,每组内仍然使用k-means聚类,这时结果是一个m维数的向量,这就是上篇文章中提到的内容。把所有的乘积量化结果保存到一个表中,叫pq_centroids表,表中每项是m维。
3.append to inverted list
前面的操作中记录下y在coarse_cluster表的索引i,在pq_centroids表中的索引j,那么插入inverted list时,把(id,j)插入到第i个倒排索引中,id是y的标识符,比如文件名。list的长度就是属于第i类的样本y的数目。处理不等长list有些技巧。
三、基于IVFADC的搜索
检索过程如下:
主要包括四个操作:
1.粗糙量化
对查询图像x的特征进行粗糙量化,即采用KNN方法将x分到某个类或某几个类,分到几个类的话叫做multiple assignment。过程同对数据集中的y分类差不多。
2.计算余量
计算x的余量r(x)。
3.计算d(x,y)
对r(x)分组,计算每组中r(x)的特征子集到pq_centroids的距离。根据ADC的技巧,计算x与y的距离可以用计算x与q(y)的距离,而q(y)就是pq_centroids表中的某项,因此已经得到了x到y的近似距离。
3.最大堆排序
堆中每个元素代表数据库中y与x的距离,堆顶元素的距离最大,只要是比堆顶元素小的元素,代替堆顶元素,调整堆,直到判断完所有的y。
用数学语言来描述这个过程如下:
补:
multiple assignment
如上图所示,x与y都分到了1这个voronoi包,如果不采用multiple assignment方法,则只会在voronoi包1中搜索与x接近的y,明显voronoi包2,voronoi包3中与x更近的y不会被检索到,采用multiple assignment的方法,在x的w个最近粗糙类中心中搜索y,那么准确率就提高了。但这要求遍历w个list,费内存和时间,是以牺牲空间和时间换准确率。
关于如何选取coarse_centroids的个数,multiple assignment的w值和寻找的近邻y的个数参考下图:
论文网址:http://people.rennes.inria.fr/Herve.Jegou/projects/ann.html
(转载请注明作者和出处:http://blog.youkuaiyun.com/CHIERYU 未经允许请勿用于商业用途)