距离向量算法_大规模向量检索
(一)什么是向量检索?
我们都知道,在数字化时代下构建智能化系统是一项基础性工作。如何让机器像人类一样具备感知与认知能力?实际上,在这台庞大的电子设备群体内,“理解世界”的本质是用一组有序排列的数据信息去描述客观存在的事物特征与属性——这些数值数据构成一个向量(Vector)。其中每个元素都是独立的数值数据,并遵循严格的数学规律排列组合在一起形成的数据结构被称为多维空间中的点坐标——其维度即为该数值数据的数量。例如,在当前广泛应用的人脸识别系统中,在获取一个人的照片或视频片段后系统会自动提取出其面部特征并将其转化为128维甚至更高维度的空间坐标点集
那向量检索的具体指的是什么?让我们先回顾一下初中的几何数学知识,在笛卡尔坐标系中的XY平面上有若干个点,其中A点坐标为(1.0, 2.0),B点坐标为(1.0, 0.0),C点坐标为(0.0, 2.0)。试着询问这些点中哪一个距离A点最近呢?

在本研究中ABC代表三个二维向量基于经典的欧几里得数学理论它们之间的距离计算方法可参考以下公式其中欧氏距离的计算公式为D = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2}

AB的距离计算结果为2, AC的距离则为1,由此可见A点与C点之间的距离关系表明A点靠近C点。这是一个最基本的形式的向量检索方法,通过计算我们可以得知向量A与向量C之间的距离关系,其中AC的距离较短意味着两向量之间更为接近。至于衡量向量相似程度还有另一种方法即余弦距离,两者的区别在于余弦距离要求向量进行归一化处理以确保公平比较,这部分暂时不做详细说明有兴趣的读者可以自行查阅相关资料
相应的,对于高维向量,假设用A和B分别代表两个n维向量,它们之间的欧式距离计算公式就是:

在人脸识别领域中,在已经收集了上千万张人脸的向量数据的前提下,在线输入一张新的人脸图像时,请问如何从这上千万张人脸中快速找到与目标最匹配的人脸?基于前面提到的知识基础,请问解决方案是什么?解决方案就是通过计算输入人脸与所有候选人的欧氏距离,在结果中选择最小的那个作为匹配对象。
在向量检索中存在两个核心参数。其中一个参数为n,其作用是用于从数据库中进行一次性的n次查询,每次查询涉及一条目标向量。另一个参数为k,表示该操作旨在找到与目标向量最接近的前k个结果,通常我们简称为top-k查询
向量检索主要采用两种方法:一种是基于最近邻搜索(Nearest Neighbor Search, NN),另一种是基于近似最近邻搜索(Approximate Nearest Neighbor Search, ANN)。传统的NN方法通过逐一计算目标向量与数据库中各向量的距离来实现搜索过程,并最终得出最精确的结果。随后发展出一系列优化算法(如KD-tree等空间划分与组织技术),有效提升了搜索效率。而ANN则通过将高维空间划分为多个区域并构建索引结构来提高搜索效率,在可接受的精度条件下实现了高效的查询处理。这也是在处理大规模高维数据时广泛采用的主要技术手段。
如何理解这个分簇索引的概念呢?举个例子来说吧,在某个城市中我们将所有的居民按照职业进行了分类归类比如工程师、律师、医生等不同的职业群体。假设我们要寻找某个人他是Java程序员那么根据我们的分类结果估算一下大概率会找到这个人就不需要再去其他职业类别中去寻找了

在向量检索中常用的方法是采用特定聚类算法将大量数据划分为若干簇,在每个簇内通常包含数百上千个数据项,并均设有一个核心代表向量;当系统接收用户输入的目标查询向量时,则首先计算目标查询与各簇核心代表之间的距离度量值,并根据预设阈值识别出与之距离最近的若干个主要簇群;随后系统会对这些主要簇群内的所有数据项逐一进行相似性度量运算,在此基础上筛选出与目标查询最为接近的前k条结果数据项作为最终检索结果输出
用简图来表示,假设我们有二维平面上若干个向量(点):

使用聚类算法将这些数据划分为多个簇群;其数量可由用户自行设定;在这里将它们划分为4个簇群;其中,每个黑圈代表一个簇的核心向量。

为了实现对目标样本特征提取的需求。我们需要针对该样本生成一系列特征。通过比较这些特征与训练数据集中的各个样本之间的相似性。我们能够确定出与该目标样本最相似的一个。这样一来,在后续的数据分析过程中就能精准识别出该样本所属的具体类别。

当然,在实现环节上会有多种不同的实现方式。其中包含了基于向量量化方法、基于图论以及基于树结构的各种算法。对这方面感兴趣的读者可以通过查阅ANN相关论文来深入学习这些技术细节。
(二)大规模向量检索面临的问题
大尺寸向量检索平台不仅具备海量数据存储能力还需能实现快速搜索功能。在生产环境中默认起始维度设置为128维更高版本可达至512维。每个向量包含512个浮点数值占位计算显示每个向量占用内存空间为2048字节因此一亿条这样的向量将占用约200GB存储空间若达到十亿甚至百亿级别数量则所需存储空间将突破‘百十’GB。
基于使用的场景不同, 可以将向量数据库划分为静态库与增量库两种类型. 静态库是指那些数据属性固定不变的数据库系统, 一旦完成数据导入操作, 就不再接收后续的数据更新. 这种类型的数据库主要关注的是检索效率. 相比之下, 增量数据库则需要应对用户的向量检索操作期间可能出现的数据持续插入问题. 在这种情况下, 需考虑的因素更多一些, 包括新数据插入后查询结果的变化情况, 如何平衡检索效率与插入效率之间的关系, 以及防止发生不可恢复的"死机"状态而丢失已有数据等问题.
目前,在向量检索领域最受欢迎的开源工具是Facebook提供的FAISS库。同时,微软也推出了一个名为SPTAG的开源库。普通用户无需深入理解复杂的向量聚类算法或计算相似性度量的知识即可通过这些工具轻松实现基本的向量检索功能。然而这些仅是基础级别的工具集合,并且它们的功能主要集中在数据存储与索引方面缺乏高可用性和扩展能力。没有集成监控和告警功能以及不支持分布式架构设计。此外还缺少针对不同编程语言生态系统的支持SDK等这也意味着普通用户需要投入大量时间和资源来开发自定义解决方案才能满足实际应用中的高负载需求
