1. 引言 - 近似近邻搜索被提出所在的时代背景和挑战
0x1:从NN(Neighbor Search)说起
ANN的前身技术是NN(Neighbor Search),简单地说,最近邻检索就是根据数据的相似性,从数据集中寻找与目标数据最相似的项目,而这种相似性通常会被量化到空间上数据之间的距离,例如欧几里得距离(Euclidean distance),NN认为数据在空间中的距离越近,则数据之间的相似性越高。
当需要查找离目标数据最近的前k个数据项时,就是k最近邻检索(K-NN)。
0x2:NN的技术挑战与发展
近些年的研究中涌现出大量以最近邻检索为基本思想的方法,主要可分为两类:
数据结构改进:基于提升检索结构性能的新数据结构,大多基于树形结构,例如KD-Tree。关于KD-tree的相关讨论可以参阅另一篇博客。高效索引方法改进:基于对数据本身的索引和处理的方法,包括哈希算法、矢量量化方法等。哈希算法就是使用HASH算法构建数据索引,HASH方法的确效率很高,但是因为其全局敏感性,输入文本只要有任何微小的变化,得到的Hash Index就会发生改变,因此无法提高近邻搜索的性能。
尽管出现了很多针对NN算法的改进措施,但是在实际工业场景中,NN算法遇到最大阻碍是:
数据经过向量化(即特征工程)之后,因为特征空间特别高维(上百/上千/甚至上万),导致在空间距离上特别稀疏,维度越高这个现象越明显,这直接导致了NN的近邻搜索效果不好。笔者自己也同样在项目开发中尝试使用过NN算法,当发现NN搜索效果不佳时,反过来调整特征工程,然后再继续NN搜索,如此反复迭代,最终效果难以保证,因为你无法保证每一次的特征工程都能精确地表征出业务场景的相似性。
举个例子来说,我们有一批恶意文件现在要对其进行聚类分析,首先我们对其进行文本方面的特征工程,得到一个向量集合。因为基于专家经验得到的特征维度之间是彼此“正交”的,因此每个特征向量之间的余弦相似性都不强,基于“空间距离度量”的聚类算法效果自然也不会很好。
而且另一方面,因为特征空间的维度太高了(几百维、几千维),一些本来很有用的”强贡献特征“可能会被淹没在大量的“弱贡献特征”中,这很好理解,看一下欧几里得空间的距离度量公式:
从公式中可以看到,所有维度都被“公平看待”,平方和