近似最近邻搜索(Approximate Nearest Neighbor Search,ANNS)是一种在高维向量空间中寻找与给定查询向量相近向量的技术。在精确的最近邻搜索(NNS)中,目标是找到距离查询向量最近的一个或多个向量。然而,随着数据维度的增加和数据规模的扩大,精确搜索在计算上变得非常昂贵。ANNS通过牺牲一定的精度来换取搜索速度的大幅提升。例如,在一个包含数百万张图像特征向量的数据库中,使用ANNS可以快速找到与给定图像特征向量近似最近的图像,虽然找到的可能不是绝对最近的邻居,但在很多实际应用场景中,这种近似结果已经足够满足需求。
一、发展过程
1.早期探索阶段
随着数据量的增加和对高效搜索需求的出现,研究人员开始思考如何在大规模数据集中快速找到近似最近邻。最初的方法主要是基于对数据的简单划分和索引结构的构建,如KD树、R树、M树等树形索引结构被提出用于对低维数据进行分区以实现高效索引。
然而,这些方法在高维数据和大规模数据集面前存在效率瓶颈,当数据维度较高或数据量巨大时,搜索效率会急剧下降。
2.哈希算法与量化方法的出现
为了解决高维数据的近似最近邻搜索问题,局部敏感哈希(LSH)方法被提出。其核心思想是通过哈希函数将高维空间的数据映射到低维空间,使得在高维空间相邻的数据在低维空间落入同一个桶的概率较大,从而将欧式空间的距离计算转化到汉明空间,提高检索速度。
乘积量化(PQ)作为一种量化方法,将特征向量进行正交分解,在分解后的低维正交子空间上进行量化,由于低维空间可以采用较小的码本进行编码,因此可以降低数据存储空间,并通过基于查找表的非对称距离计算快速求取特征向量之间的距离,在压缩比相同的情况下,检索精度更高。
3.基于图的算法兴起
以HNSW(Hierarchical Navigable Small World)为代表的基于图的算法逐渐受到关注。它构建了一个层次化的图结构,通过在图中进行导航搜索来找到近似最近邻。这种方法在处理高维数据和大规模数据集时表现出了较好的性能和可扩展性,能够在保证一定精度的前提下快速返回近似结果。
一些基于图的改进算法不断涌现,通过优化图的构建、搜索策略和节点管理等方面,进一步提高了基于图的ANNS算法的性能和效率。
4.深度学习时代的融合与创新
随着深度学习的发展,ANNS与深度学习技术开始深度融合。例如,在图像检索和推荐系统等领域,通过卷积神经网络等深度学习模型提取图像或文本的特征向量,然后利用ANNS在特征向量空间中进行快速搜索,实现了更精准和高效的图像检索和个性化推荐。
一些研究开始探索利用深度学习自动学习哈希函数或索引结构,以更好地适应数据的分布和特征,进一步提高ANNS的性能。例如,通过训练神经网络来生成适合特定数据集的哈希码,或者学习图结构中的节点表示和边权重等。
5.大规模数据处理与系统优化阶段
面对海量数据的挑战,研究人员开始关注如何在大规模数据集上实现高效的ANNS。DiskANN的出现是一个重要突破,它能够在一台配备64GB内存和普通固态硬盘(SSD)的工作站上,索引和搜索高达10亿个数据点,颠覆了传统认知,证明了基于SSD的索引可以同时实现高召回率、低查询延迟和高密度。
异构内存(HM)的利用也为ANNS带来了新的发展。HMANN算法充分考虑了内存和数据的异构性,实现了在单个节点上进行十亿级相似度搜索,且无需使用数据压缩,在相同的搜索延迟下,获得的召回率比其他算法高出很多。
5.工业界的广泛应用与开源引擎的出现
ANNS在工业界得到了广泛应用,如百度的Puck开源项目,包含两种自研的检索算法,以高召回、高准确、高吞吐为目标,适用于多种数据规模和场景,在千万、亿、十亿等多个数据集上性能优势明显,广泛应用于百度内部包括搜索、推荐等三十余条产品线,支撑万亿级索引数据和海量检索请求。
其他公司如Spotify的Annoy、Google的Scann、Facebook的Faiss等也都有各自的ANNS实现和应用,推动了ANNS技术在工业界的不断发展和优化。
二、工作原理
1.空间划分与索引构建:
ANNS方法通常会对向量空间进行划分,并构建索引来加速搜索过程。例如,基于树的索引方法(如KD Tree、VP Tree等)会将向量空间递归地划分为多个子空间。以KD Tree为例,它会根据向量的维度(如对于二维向量,可能根据x轴或y轴坐标)交替地进行划分,每个节点代表一个子空间。在构建索引时,将向量分配到相应的子空间节点中。这样,在搜索时就可以通过比较查询向量与划分边界的关系,快速定位到可能包含最近邻向量的子空间,而不是对所有向量进行全量搜索。
哈希方法也是一种常见的索引构建方式。例如,局部敏感哈希(LSH)会将相似的向量以较高的概率映射到相同的哈希桶中。通过对向量进行哈希计算,将向量空间划分为多个哈希桶,在搜索时,只需要在少数几个哈希桶中查找,大大缩小了搜索范围。
2.搜索算法与近似策略:
许多ANNS算法采用多轮搜索的方式。在第一轮搜索中,会使用较粗糙的划分或索引,快速定位到一个较大的候选向量集合。这个候选集合可能包含了真正的最近邻向量,但也可能包含一些距离稍远的向量。例如,在基于树的索引搜索中,从根节点开始,根据一定的规则(如比较向量在某个维度上的值与节点划分边界的值)向下搜索,找到叶子节点对应的向量集合作为初始候选集。
然后,会对候选集合进行进一步的筛选和排序。这可能涉及到计算候选向量与查询向量的相似度(如使用余弦相似度或欧几里得距离),并根据相似度的值选择最接近的向量。在这个过程中,为了控制搜索精度和速度的平衡,会设置一些参数。例如,可以设定一个距离阈值,只考虑距离在阈值范围内的向量;或者设定一个候选集大小的上限,只对前若干个最接近的向量进行进一步的精确计算。
三、优势
1. 速度提升
应对大规模数据高效:在处理海量数据时,精确的最近邻搜索可能需要遍历整个数据集来找到真正的最近邻,这在数据量巨大(如包含数十亿个向量的数据库)的情况下计算成本极高。而ANNS通过索引结构和近似策略,能够快速定位到一个相对较小的候选集合。例如,在图像搜索引擎中,面对数以亿计的图像特征向量,ANNS可以在短时间内返回一组与查询图像视觉上相似的图像,大大提高了搜索效率。
实时性要求场景适用:对于一些对实时性要求很高的应用场景,如自动驾驶中的物体识别或实时视频监控中的目标检测,快速响应至关重要。ANNS能够在短时间内提供近似的结果,满足系统在短时间内做出决策的需求。比如,自动驾驶车辆需要在瞬间识别出道路上的行人、车辆等物体,ANNS可以快速匹配可能的物体类别,为后续的精确识别和决策提供初步支持。
2. 资源利用
降低计算资源消耗:精确最近邻搜索在高维空间中计算距离和排序的过程非常复杂,需要大量的计算资源,包括CPU和内存。ANNS采用近似策略,减少了对距离计算和排序的严格要求,从而降低了计算资源的消耗。以自然语言处理中的问答系统为例,在处理大规模知识库的向量表示时,ANNS可以在不占用过多计算资源的情况下,快速检索出可能与问题相关的文档,避免了因精确搜索导致的资源瓶颈。
存储资源优化:一些ANNS方法采用的索引结构(如基于树的索引或哈希索引)在存储方面相对高效。这些索引结构在存储向量空间的划分信息和向量位置信息时,相比于存储所有向量之间的精确距离等信息,可以节省大量的存储资源。这使得在有限的存储设备上能够存储更多的向量数据,扩大了应用的规模和范围。
3. 精度损失
实际应用效果良好:在许多应用场景中,绝对精确的最近邻并不是必需的。例如,在电商平台的相似商品推荐中,用户更关注能够找到一些与当前查看商品在风格、功能等方面相似的商品,而不要求找到绝对最相似的商品。ANNS返回的近似结果通常能够满足用户的实际需求,并且在视觉、语义等方面提供有价值的参考。
精度 速度权衡灵活:ANNS可以根据具体应用的需求,通过调整参数(如搜索范围、候选集大小、相似度阈值等)来灵活控制精度和速度之间的平衡。在对精度要求较高的场景,可以适当收紧参数,牺牲一些速度来获取更精确的近似结果;而在对速度要求极高的场景,可以放宽参数,以更快的速度获得相对不那么精确但仍然有价值的结果。这种灵活性使得ANNS能够适应不同的应用场景和用户需求。
四、应用场景
1. 计算机视觉
图像检索与推荐:
在电商平台中,有大量的商品图片。通过提取这些图片的特征向量(例如使用卷积神经网络提取),并将其存储在向量数据库中。当用户查看某一商品图片时,利用ANNS可以快速在数据库中找到与之相似的商品图片,为用户提供“相似商品推荐”服务。这种近似搜索能够在保证推荐结果具有一定相关性的前提下,大大提高搜索速度,提升用户购物体验。
对于图像搜索引擎,ANNS可以帮助快速检索与给定查询图像相似的图像。例如,在图片素材网站上,设计师可以输入一张参考图片,ANNS快速找到与之视觉特征相近的其他图片,方便设计师获取灵感或寻找合适的素材。
图像识别与分类辅助:
在复杂的图像识别系统中,如医学影像诊断或安防监控中的人脸识别,ANNS可以作为预分类或候选筛选的工具。以人脸识别为例,系统中存储了大量人脸特征向量,当识别新的人脸图像时,通过ANNS快速找到近似最近邻的人脸特征向量,缩小识别范围,提高识别效率。
在自动驾驶场景中,对于车辆识别和道路标志识别等任务,ANNS可以根据预先存储的物体特征向量,快速匹配实时摄像头捕捉到的图像中的物体,辅助自动驾驶系统做出快速决策。
2. 自然语言处理
问答系统:
对于基于知识库的问答系统,知识库中的文档通常会被转换为向量表示并存储。当用户提出问题并将其转换为向量后,ANNS可以快速从向量数据库中找到与问题向量近似最近的文档向量。然后,系统可以提取这些文档中的相关内容来回答用户的问题。这种近似搜索能够在可接受的回答准确性范围内,显著加快问答系统的响应速度。
在聊天机器人应用中,ANNS可以帮助快速匹配用户输入的语义向量与预定义的回答模板或知识片段的向量,使得聊天机器人能够更快地生成合适的回答。
文本聚类与分类:
在新闻媒体行业,每天会产生大量新闻稿件。通过将新闻文本转换为向量,ANNS可以快速将新的新闻文本向量分配到最接近的新闻类别向量簇中。例如,将体育新闻、财经新闻、娱乐新闻等分别聚类,便于新闻的分类和推荐。
在学术文献管理中,ANNS有助于对文献进行主题分类。通过将文献摘要或全文转换为向量,快速找到与某一研究主题相关的文献,帮助研究人员更好地组织和发现文献。
3. 推荐系统
个性化推荐:
在内容推荐平台,如视频、音乐、阅读等平台,存储用户兴趣向量和内容(如视频、音乐、书籍)特征向量。通过ANNS,可以快速找到与用户兴趣向量近似匹配的内容特征向量,从而为用户提供个性化推荐。例如,在视频推荐平台,根据用户的观看历史、点赞、评论等行为构建用户兴趣向量,然后利用ANNS在海量的视频特征向量中找到近似匹配的视频推荐给用户,加快推荐速度,提高推荐效率。
对于电商推荐系统,结合用户的购买行为、浏览行为等信息构建用户兴趣向量,利用ANNS在商品特征向量中找到近似匹配的商品,为用户推荐可能感兴趣的商品,增加商品转化率。
协同推荐:
在社交网络或具有用户社交行为数据的平台上,ANNS可以辅助进行协同推荐。通过分析用户之间的社交关系、共同兴趣爱好等行为构建用户之间的相似度向量。当为一个用户推荐内容时,不仅考虑该用户的个人兴趣向量,还结合与其相似用户的兴趣向量,利用ANNS从向量数据库中找到更广泛的推荐内容,丰富推荐结果,增强推荐的精准性和多样性。