最近邻搜索值乘积量化(Product Quantization)

转自:http://blog.csdn.net/CHIERYU/article/details/50321473    和   http://blog.csdn.net/CHIERYU/article/details/50347735

简介

Product Quantizer是由Herv´e J´egou等人2011年在IEEEE上发表的论文《Product Quantization for Nearest Neighbor Search》中提出来的。它的提出是为了在内存和效率之间求得一个平衡,既保证图像索引结构需要的内存足够,又使得检索质量和速度比较好。对于任何基于固定维数特征的事物,它可以应用到其索引结构的建立及检索上。它属于ANN(approximate nearest neighbor)算法。与它相关的算法有E2LSH(Euclidean Locality-Sensitive Hashing), KD-trees,K-means。

主要思想

Product Quantizer翻译过来是乘积量化,从字面理解大概包括了两个过程特征的分组量化过程和类别的笛卡尔积过程。假设有一个数据集,那么K-means的做法就是给定类别数目K,目标函数是所有样本到类中心的距离和最小,迭代计算优化目标函数,得到K个类中心和每个样本所属的类别。目标函数不变,乘积量化的做法是: 
(1)数据集为K个类别,每个样本以一个vector的形式表示,维数为d,将vector的各个分量分成m组。 
(2)将所有vector的某组分量作为数据集,采用k-means算法得到这里写图片描述个类中心,运行m次k-means算法,则每组都有这里写图片描述个类中心,记这这里写图片描述个类中心为一个集合。 
(3)将上述得到的m个集合做笛卡尔积,就得到整个数据集的类中心了。

下图辅助理解。 
这里写图片描述
其实只要联系欧式空间中点的笛卡尔积就很好理解了。

举个栗子

这里写图片描述

注:例子中示意图引用自Jae-Pil Heo的论文《Distance Encoded Product Quantization》


本篇文章讲下索引结构和搜索。

一、检索和距离的关系—ADC

假如做法是以图搜图,那么输入图像为x,要从数据库中找出与x最匹配的图像集{y},首先提取特征,特征向量就代表图像,如果特征向量之间的距离越小,图像之间相似度越大,检索就是要找出这里写图片描述,公式中d的选取可以是欧式距离,求x与y各个分量的差的平方和。PQ(乘积量化)中ADC的做法并不是求各个分量差的平方和,而是求x与y量化后的向量之间各个分量差的平方和。用公式表示如下: 
这里写图片描述 
示意图如下: 
最近邻搜索值乘积量化(Product Quantization)_第1张图片 
把求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。

用数学语言来描述这个过程如下: 
最近邻搜索值乘积量化(Product Quantization)_第2张图片 
补: 
multiple assignment 
最近邻搜索值乘积量化(Product Quantization)_第3张图片 
如上图所示,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的个数参考下图: 
最近邻搜索值乘积量化(Product Quantization)_第4张图片




你可能感兴趣的:(机器学习(Machine,learning),Deep,Learning,图像处理)