哈希学习算法之一:ANN背景介绍

一、由ANN进入Hash

NN,即最近邻(nearest neighbor),定义在一个数据集X中,查询点q的最近邻是NN(q)=argmin dist(q,x) 其中x∈X。直接的表示,即为KNN查询,也就是需要找到K个最近邻。一个点x和查询点q的距离取决于具体的查询问题。例如:d维空间的数据集,和欧式距离的场景。
在低维空间时,这些情况都可以得到有效解决(比如k-d tree算法)。然而,在大规模高维数据时,有些算法的计算消耗甚至比线性消耗还要大。所以,ANN(Approximate nearest neighbors)近似最近邻查询被提出,主要是从两个方面实现近邻查询。

  1. error-constrained nn
    误差约束最近邻查询,包括(1+ε)-approximate 最近邻查询、R-near neighbor近邻查询
  2. time-constrained nn
    时间约束最近邻查询,是限制查询时间。它的目标是实现返回的k个最近邻点尽可能的与实际近邻点相似,同时查询代价尽可能小。

那这和我们研究的哈希算法有什么关系呢?哈希是在ANN中广泛应用的一种解决方案。哈希方法是将参考点和查询点映射到目标对象,ANN从而转换为对目标对象或者一部分原始参考点的处理。

二、Hash执行ANN查询

第一部分中最后提到经哈希函数转换后,得到的目标对象,即为Hash码。

2.1 hash函数

哈希函数定义为y=h(x),其中h(.)是哈希函数,y是哈希码。y可能是一个整数,也可能是一个二进制值:1或0、1或-1。
在实际应用中,一般是使用多个哈希函数计算复合哈希码,y=h(x),其中h=[h1,h2,h3…hM]^T ,y=[y1,y2,y3…yM]^T。

2.2 应用ANN

一般hash在ANN应用中,有两种基本的方法:哈希表查询(hash table lookup)和哈希码排序(hash code rank)。

  • hash table lookup
    哈希表查找是减少距离计算的数量。它采用哈希桶的数据结构,每一个参考点被放置到一个桶h(x)中,每一个桶可由一个哈希码找到。常规的哈希算法是尽可能的降低碰撞率,而哈希表的目标:尽可能的将邻近点的碰撞率最大化,同时远距离点的碰撞率最小化。在找到查询点对应的哈希桶后,需要对桶内所有的参考点,计算原始特征的距离,重排序后得到最近邻点。
    为提高召回率,一般有两种方式:1.单表哈希 单张哈希表,需访问多个哈希桶。2.多表哈希 构造多张哈希表。(详细解释参见下一节)
  • hash code ranking
    哈希码排序是一种穷尽检索。它的执行办法是:依据查询点和引用点的哈希码比较他们之间的距离,获得最近的候选列表。接着重排序,使用原始特征对候选项进行距离计算,获得最近邻点。

基于LSH的哈希表查询在实际中较少采用,而基于量化的哈希表查询被广泛应用获得较粗的候选列表。哈希码排序由于遍历所有的候选列表,在查询效率上不及哈希表查询。两者各有优缺点。
一种常用的方法是:首先使用倒排索引获得较小的候选列表(可视为哈希表),使用更长的哈希码计算查询点到候选列表的距离,从而提供前几个候选项,最后在原始空间上重排序候选项。

猜你喜欢

转载自blog.csdn.net/vainfanfan/article/details/83548690