哈希快速检索之三种海明空间中的检索方法

来源:互联网 发布:mac最新远程windows 编辑:程序博客网 时间:2024/06/08 06:01

哈希检索简介:

近年来,哈希检索算法领域有闷声大规模填坑的迹象,2012-2015年间有一大堆论文在国际机器学习顶级会议期刊上发表。详见哈希算法综述:“Hashing for Similarity Search:A Survey”。

哈希检索的主要思想是把向量表示的数据投影到海明空间,在海明空间中进行K近邻(k>=1)的检索。为了使海明空间中的K近邻与原始空间保持一致,哈希算法需要满足局部保持特性,即保持投影前后的相似性(常见的相似性包括欧氏距离和语义相似性)。

本文主要介绍哈希投影之后如何在海明空间检索K近邻。通常哈希检索的论文都侧重于如何构造或训练(学习)投影函数,对投影后的检索描述甚少。很多情况下,只用海明距离进行计算是不够的,因为根据海明距离得到的数据数量不大可能恰好是等于K的。那么在海明空间中到底该如何检索呢?

总体的思路很直观:利用海明距离得到一组候选集(如海明距离<=2),然后在这组候选集中用更精确的方法得到K近邻。例如要检索query的欧氏距离近邻,那么就可以用候选集的原始数据而不是投影后的数据做进一步筛选。当然,如果对检索速度要求很高而对检索精度要求较低或者无法找到更精确的计算方法,也可以考虑直接在候选集中随机选择K个结果。下面主要介绍在海明空间中三种常用的检索方法并假设是要检索欧氏距离K近邻。

方法一:按海明距离排序

用哈希算法进行检索主要就是利用了海明空间离散的特点。在海明空间中可以用机器指令或查表来计算距离(减法),相比于欧氏距离计算其速度相当快,有几十甚至上百倍的差距。所以在海明空间进行检索,可以先计算query和database的海明距离,然后进行排序。注意到这里不同距离数量是很有限的,如32 位编码中最多有33种(0-32)不同的距离。计算完海明距离之后可以有两种不同的处理方法:

做法一:对海明距离为0的检索结果用原始数据计算欧式距离,如果距离为0的数据数量小于K,先把距离为0的数据加入返回结果或候选集,再看距离为1的数据,以此类推;

做法二:找到d,使得海明距离<=d的数据数量大于等于K,海明距离<=(d-1)的数据数量小于K。然后在距离小于等于d的候选集内进一步计算。

这种方法的缺点是计算量会比较大,但是实现简单。

方法二:哈希表

哈希表,英文名称Hash Table。如果海明空间的维数为b,则构建一个包含2b个项的哈希表,对应于每一种海明编码。在检索的时候首先计算要加入到候选集的海明编码(选择海明距离较小的海明编码,与方法一类似),然后通过索引取出数据。显然,该方法有一个巨大的缺点:当b增大时,哈希表呈指数倍增大,会浪费大量空间。Toronto大学的大牛Mohammad提出了Multi-Index Hashing算法可以在一定程度上缓解这个问题。

优点:找到与 query编码距离较近的海明编码后可以直接取出对应的数据,不需要计算每一个数据与query之间的海明距离。

哈希表结构示意图:

这里写图片描述

方法三:Multi-Index Hashing

Multi-Index Hashing算法的思路很直观:把海明空间b维投影分成m段,也就是m个哈希表,每段包含bm位(注意到一个数据在每个哈希表中都会有对应的编码,即被索引m次)。但是这样做会产生一个问题:如果要取出海明距离小于等于r(r>=1)的数据该怎么做?此时对于某个数据x需要计算它在m个哈希表中与query的海明距离的和,这就需要对database中的每个数据计算一次海明距离,线性时间复杂度。

Mohammad的论文中把时间复杂度降低到次线性。主要思路是:如果两个数据对应的二进制编码h和g最多只有r位不同,那么他们的m段编码中至少有一段编码的不同位的个数是小于等于r/m的。例如,r=3,m=4,3/4=0,那么h和g至少有一段编码是完全一致的。所以先检索各个哈希表(总共m 个哈希表),找出其中与query在该表的海明距离小于等于r/m的数据放入候选集,然后计算候选集中的每个数据与query的总的海明距离,把距离小于等于r的作为返回结果。详细描述、实验效果等可参考论文“Fast Search in Hamming Space with Multi-Index Hashing”。

有了海明距离小于等于r的数据集,剩下的检索步骤就和上面两种方法类似了,即用原始数据计算欧氏距离。

借用论文中的一个实验结果图展示一下Multi-index Hashing和线性计算海明距离的时间比较:

这里写图片描述

0 0