基于欧式距离的海量高维向量相似度计算方法综述及局部敏感哈希 Cross-polytope LSH 简介

    在做海量高维向量相似度快速计算比赛时,对最近邻搜索方法做了一些泛读和总结。主要以下分为几大类。

    一是基于树形的高维索引,如kd-tree,R-tree等,但当维度较高时,查询性能急剧下降。

    二是基于map-reduce方法,选择合适个数的中心点,相当于一个聚类操作,将一个中心点定义为一个cell。使用多个计算节点将查找集和被查找集同时映射到距离最近的中心点,也就是对应的cell中。对每个cell中的点进行reduce,计算cell内部的一些数据用于后续处理,如cell内向量总数等。为了减少错误率,与查找向量最近的向量可能不在同一个cell中,采用启发式复制的方式,从相邻的cell中复制向量进行距离计算。更多的优化细节见论文

Comparing MapReduce-Based k-NN Similarity Joins on Hadoop for High-Dimensional Data

这种方法适合查找集规模很大时,并行计算会产生较优的效果。

    三是facebook提出的矢量量化方法faiss具有比较好的效果且支持数据集的动态增删。

    四是哈希方法,即本文的重点,局部敏感散列(LSH),其核心思想是:设计一种特殊的hash函数,使得2个相似度很高的数据以较高的概率映射成同一个hash值,而令2个相似度很低的数据以极低的概率映射成同一个hash值。我们把这样的函数,叫做LSH。根据这次比赛的数据规模我们最终选择这个方法。网上对于LSH介绍的博客已经有很多,以及对于欧式距离量度的p-stable哈希都有了比较详细的介绍(可参考这篇文章LSH(Locality Sensitive Hashing)原理与实现),但对于我们想要使用的cross-polytope LSH却鲜少有中文资料可供参考,因此写下这篇博客用于记录。如读者发现其中的什么问题可指正于我。

    该哈希函数使用了这样一个结论,向量归一化后,欧式距离等价于余弦距离。

    将cross-polytope用通俗的语言解释即为,将所有向量归一化到一个单位球面上,每次对球做一个随机旋转相当于一个哈希函数,将球面上的向量按区域分割,映射为不同的哈希函数值,相当于做完了一次哈希。接下来与LSH思想相同,k个哈希函数构成一个哈希表,使用独立的L个哈希表进行相似性查询。

    所使用的哈希函数如下:

基于欧式距离的海量高维向量相似度计算方法综述及局部敏感哈希 Cross-polytope LSH 简介_第1张图片

    x为归一化后的向量,G为独立同分布的随机高斯矩阵(相当于一次随机旋转)。u为1到d维度中某维度为正负1的基向量,选择最近的基向量作为哈希函数值。可用以下方法简化计算,得到的结果等价。

基于欧式距离的海量高维向量相似度计算方法综述及局部敏感哈希 Cross-polytope LSH 简介_第2张图片

    即计算出x随机旋转后绝对值最大的数所在的维度,若为负则+=d。至此,这个哈希函数将所有向量映射为2d个不同的哈希值。

    而对于一个随机高斯矩阵与向量相乘时间复杂度为,有一个可以降低时间复杂度的方法,即使用伪随机旋转。,其中H表示哈达玛变换,有实现好的库可供调用。D为对角线为+1或-1的对角矩阵。即对x做三次这样的变换以达到随机旋转的效果。时间复杂度为

    以上提到的cross-polytope LSH在已经在FALCONN开源工具包中实现,可点击链接查看文档及github中的代码。另外,在FALCONN中实现了两个哈希函数,另一个是hyperplane LSH。刚才我们提到,在计算哈希函数值时从所有d个维度中选择最近邻,实际上使用代替d得到的哈希函数也可使用。而当时得到的哈希函数即为hyperplane LSH。

    下面对单个表中哈希函数个数k和哈希表数L做一个简单的总结。对于单表哈希,希望k取得足够大,使得每个桶中点的数量较少,获得较优的查询效率,而LSH实际上是一个概率性映射,查询样本与最近邻落入同一桶中的可能性变得很微弱,即漏报率增加(本来相近的两条数据认为是不相近的)。对于这个问题,我们重复这个过程L次,构建L个独立的哈希表,从而增加最近邻的召回率。

    处理大数据集时往往需要很多个独立的哈希表以获得较好的召回率,这样会带来很高的内存代价。因此提出了multiprobe LSH概念,即在单表中选择查询向量最有可能落入的T个桶中,在这T个桶中进行线性搜索。对于其上三个参数的选取可采取以下原则:首先,根据可使用的内存大小选取L,然后在K和T之间做出折中:哈希函数数目K越大,相应地,近邻哈希桶的数目的数目T也应该设置得比较大,反之K越小,L也可以相应的减小。获取K和L最优值的方式可以按照如下方式进行:对于每个固定的K,如果在查询样本集上获得了我们想要的精度,则此时T的值即为合理的值。在对T进行调参的时候,我们不需要重新构建哈希表,甚至我们还可以采用二分搜索的方式来加快T参数的选取过程。也是FALCONN中实现的方式。





你可能感兴趣的:(大数据)