Shortlist Selection with Residual-Aware Distance Estimator for K-Nearest Neighbor Search
简介
CVPR2016的一篇关于KNN搜索的paper。论文的主要贡献就是提出了关于shortlist计算的算法。在倒排索引的检索过程中,主要经过两步。第一:返回候选集。第二,采用更精确的距离度量风方式进行Rerank。可以这样说,候选集合决定了返回结果的下限,第二步的rerank过程中,才决定了检索的上限。所以,关于倒排索引的改进主要有两个策略。Iverted multi-index就是改进了返回候选集,采用了product quantization的方法,将原始的数据集进行更细的划分,通过和聚类中心的比较,然后返回一个shortlist的候选集,然后从候选集中计算距离,返回最小的K的data。但是如果采用原始的高维向量进行计算,将会占据大量内存和CPU时间。例如测试数据Gist960,960维的数据计算距离将是很耗时耗内存。Rerank又是必要的操作,所以采用hash技术或者是量化的方法改进第二步。其中hash技术包括LSH,spectral hash,ITQ等等。量化的方法包括,PQ, OPQ等等。 在本篇论文中,作者提出了一种新的量化方法对shortlist进行rerank,并通过实验结果证明效果更好。
算法过程
倒排索引进行改进
在传统的倒排索引中,原始的数据集
X=x1,x2,x3,......xn
会经过K-means聚类,生成M个聚类。对于每一个原始的数据,找出离它最近的聚类中心,形成M个Inverted list-
L1,L2,L3,.....LM
。在这里计算距离的时候采用欧式距离。
在本篇论文中,作者提出了一种新的距离计算方法。首先计算原始的数据
xi
到距离中心
q(x)
的residual distance。首先定义residual distance 为
rx
:
同理,我们定义查询query y 与量化距离中心
查询query y 与原始的数据
θ 是两个向量 y−q(x) 和 x−q(x) 之间的角度。
我们观察上述公式, (1−2hy,xrxcosθ) 取决于特定的 x 和特定的
我们观察 αK 的值。当 αK 为0时,就是传统的距离度量方式。当两个向量正交的时候, αK 为1,上面的公式就是勾股定理的形式。
但是在实际中,对于任意的向量,并不是所有的向量都会正交。所以,作者提出了一种训练的方法,得到一个和近邻K有关的 αK 。首先从原始的数据集 X 中随机选出
这里:
在训练 αK 的值的时候,需要排除掉数据和聚类中心重合的点,这样做为了避免分母 r2x 为0的情况。这里训练的 αK 是和K相关的,当出现新的K值时候,我们可以简单的使用 αK =1来提前计算。实验表明,当使用训练过的 αK 的时候,比默认的值1准确率提高了20%。
建立Lookup Table
在公式(2)中,我们需要计算
rx=d(x,q(x))
的值和
hy,x=d(y,q(x))
的值。但是如果在运行的时候计算,将会耗时耗内存。并且如果原始的数据进行量化以后,无法通过量化的值来获取原始的点。所以提出了一种新的急算方法。由于
rx
是和查询无关的,我们可以在线下计算。在这里提出了一种lookup表结构来加速计算的过程。
首先对于每一个
Li
,我们需要计算原始的数据
xi
到它的中心
ci
的距离,然后按照递增的顺序进行排列。然后遍历每一个
Li
,得到一个最大和最小的距离。
然后将区间 [Rm,RM] 平均的划分为Z份。其中每一份的距离为 ΔR=(RM−Rm)/Z 。然后我们定义第j-th区间上界值为 Rj=Rm+jΔR 。
我们定义一个lookup表。 W(i,j) 储存每一个倒排索引 Li ,距离平方小于 Rj 的数目。如下所示:
|.| 代表集合中的数目。这个lookup表有 O(MZ) 的空间复杂度,并且M和Z都是和数据集无关的。
Shortlist computation
好吧,这里又开始定义了。首先将查询
y
和中心
推导到最后,发现和公式(4)的格式很像,这就对了。当 (t−h2i)/αK 用 Rj 取代的时候,这就和 W(i,j) 有关了。我们利用建立的 W(i,j) 。可以替换公式(5):
对于每一个查询在距离t以后的所有的点可以计算为 ∑Ki=1w(y,i,t) 。因为 W(i,j) 是非单调递减的,所以随着t增加, w(y,i,t) 也是非单调递减的。由于这个简单的属性,我们可以使用二分搜索的方法。二分搜索的范围为 [minh2i+αKRm,maxh2i+αKRM] 。当 T<∑Ki=1w(y,i,t) 满足条件时,搜索终止。
Inverted Multi-index
对于inverted Multi-index的具体介绍,可以参考博客。在数据集中的数据x_在第K个子空间的部分,在第K个子空间量化后的值为
qk(xk)=argminckid(xk,xki)
。首先定义距离
rx,k=d(xk,qk(xk))
,
hk,i=d(yk,cki)
。
对数据进行进一步处理,第k个中心的
ith
聚类的数据为:
Xki={xk|qk(xk)=cki}
,根据距离
rx,k
将
Xki
。然后根每一个聚类
Xki
划分为P分
Xki,1,Xki,2,Xki,3,.......Xki,P
,根据
Rki,j
:
这里边界值 Rki,.j 平均的将数据划分为P部分。其中 Rki,0 和 Rki,P 被设置为子空间最小和最大的距离。这种做法和传统倒排索引的做法相同。
Inverted multi-index划分为 kth 个子空间。我们用同样的方法训练 αK,1 和 αK,2 。我们将 ith 聚类也分为 kth 个子空间。 Xki={xk|qk(xk)=cki} 。对于每一个子聚类,划分为P个部分 Xki,1,Xki,2,.......Xki,P 。
残差距离边界 Rki,j也是平均划分为P份, R_{i,0}^k 和 R_{i,P}^k$分别代表子空间距离的最小最大值。
在计算距离的时候,如果按照公式(2)的计算方式,那么将会是如下这种形式:
因为Inverted Multi-index的List长度为 k2 。所以存储 r2x,k 的值不太现实。Inverted Multi-Index的索引长度随着划分的数目增多,指数增加,所以需要提出了一种新的代替residual distance的一种方法。作者提出了一种用平均距离代替的方法如下所示:
替换以后公式(8)新的距离就写成了如下的形式:
当新的查询到的时候,首先计算query和聚类中心 h21,i 和 h22,i 距离。然后我们取出预先计算好的 αK,k和 r¯2k,i,j 的值。然后计算 d¯2k,i,j=h2k,i+αK,kr¯2k,i,j 的值。所以总共会有2M次加法操作。我们把 r¯2k,i,j 的值进行排序。一旦排序以后,我们同样可以采用multi-sequence algorithm用一个优先级队列来获取T长度shortlist。计算过程如下图所示:
我们可以从返回的shortlist中进一步处理。
总结
总结论文的过程就是定义一些更精确的距离度量方式来重新rerank。但是这样的做法会导致计算时间的方法,所以作者又将距离公式进行预先处理。使尽可能多的在线下计算,建立起线上计算与线下计算的关系来提高计算的时间效率。