近似最近邻 (ANN) 算法是一种旨在高效地在数据集中查找最接近给定查询点的数据点的技术,但不保证精确结果。与精确最近邻搜索(将查询与数据集中的每个项目进行比较,导致大型数据集的高计算成本)不同,ANN 方法通过牺牲一些准确性来优先考虑速度。这些算法在高维空间中特别有用,例如机器学习中遇到的高维空间(例如,图像嵌入、文本向量),由于“维度诅咒”,精确搜索变得不切实际。通过使用巧妙的索引或近似策略,ANN 将搜索时间从线性 (O(n)) 减少到亚线性(例如,O(log n))甚至恒定时间,从而可以处理数百万或数十亿条条目的数据集。
ANN 算法的工作原理是将数据预处理成允许更快但近似查询的结构。常见的方法包括哈希、基于树的分区和基于图的遍历。例如,**局部敏感哈希 (LSH)** 将相似的向量映射到相同的“哈希桶”中,从而允许通过哈希查询并检查同一桶中的项目来进行快速查找。由 Spotify 开发的 **ANNOY**(近似最近邻,哦耶)构建了一个二叉树森林,该森林递归地划分数据空间,通过树遍历缩小候选点。另一种流行的方法是 **分层可导航小世界 (HNSW)**,它构建分层图,其中每一层将节点连接到其最近的邻居,从而可以跨层进行快速“贪婪”搜索。这些方法平衡了权衡:LSH 具有内存效率,但对参数调整敏感,而 HNSW 以更高的内存使用为代价提供高召回率。算法的选择通常取决于数据集大小、查询延迟要求和可接受的错误率等因素。
ANN 算法广泛应用于需要实时相似性搜索的应用程序中。例如,推荐系统使用 ANN 来查找与用户偏好相似的产品或内容,而自然语言处理模型利用它来检索语义相关的文本嵌入。图像检索系统(如反向图像搜索)依靠 ANN 来有效地匹配高维特征向量。像 **FAISS**(Facebook AI 相似性搜索)和 **ScaNN**(可扩展的最近邻)这样的工具提供了这些算法的优化实现,集成了 GPU 加速和量化以进一步提高速度。在实现 ANN 时,开发人员必须考虑诸如召回率(找到的真实最近邻居的百分比)和查询延迟之类的指标。例如,一种权衡可能涉及接受 90% 的召回率以实现快 10 倍的搜索速度。通过将 ANN 与现代基础设施(例如,用于数十亿规模数据集的分布式系统)相结合,开发人员可以构建可扩展的解决方案,以满足现实世界的性能需求,而不会牺牲可用性。