HNSW 的基础实现和优化探索

HNSW 的基础实现和优化探索

exdoubled Lv4

感谢 wibyuan 对优化探索过程中的讨论和建议。

问题引入

向量检索是指从一个实数向量集合 \(\mathcal{B}=\{v_1,v_2,..., v_n \} \subseteq R^{n\times d}\) 中,找到与查询向量 \(q \in R^d\) 最相似的向量集合 \(\mathcal{R}=\{v_{i_1}, v_{i_2}, ..., v_{i_k}\}\) 的过程

最相似的 K 个向量被称为 K 近邻(K Nearest Neighbors, KNN)

在大模型时代,向量检索被广泛应用于文本检索、图像检索、推荐系统等领域

这里的相似常用的有三种:

  • \(L2\) 相似度:\(sim(q, v) = -||q-v||_2\)
  • 内积相似度:\(sim(q, v) = q \cdot v\)
  • 余弦相似度:\(sim(q, v) = \frac{q \cdot v}{||q||_2 ||v||_2}\)

这几个相似度在特殊情形下是等价的,其实也是为了处理“相似”而产生的不同做法,本质上相同。

比如,在向量已经归一化的情形下(归一化:\(||v||_2 = 1\)),内积相似度、余弦相似度和 \(L2\) 相似度本质上是相同的

内积相似度和余弦相似度的等价比较好理解,对于 \(L2\) 相似度: \[ ||q-v||_2^2 = ||q||_2^2 + ||v||_2^2 - 2 q \cdot v = 2 - 2 q \cdot v \]

向量检索算法的发展

为了方便,记 \(|\mathcal{B}|=n\)\(d\) 为向量的维度,\(c\) 为编码压缩率,\(k\) 为空间划分的个数

暴力匹配

暴力匹配(Brute-Force Search)是最简单直接的向量检索方法,它通过计算查询向量 \(q\) 与数据集中每个向量 \(v_i\) 的相似度,找到最相似的 \(K\) 个向量,时间复杂度为 \(O(n \cdot d)\)

但在实际生产中,往往不需要如此精确的数据,可以通过近似算法在更短时间内获得足够好的结果,这就引出了近似最近邻搜索(Approximate Nearest Neighbor Search, ANNS)

量化

由于高维向量的存储和计算成本较高,量化(Quantization)技术被引入以减少存储空间和加速计算

量化的意思是将高维向量映射到一个较小的离散空间中,从而减少存储需求和计算复杂度

常见的量化方法包括:\(PQ\)\(SQ\)

以上的量化方法受到了数据分布的影响,无法估计出精确的误差下界

\(2024\) 年,提出了 \(RaBitQ\) 量化,准确的估计了量化误差下界,并且速度和 \(PQ\)\(SQ\) 近似

空间划分算法

空间划分算法通过将数据空间划分为多个区域,从而减少搜索空间,提高检索效率

KD 树

KD 树是一种空间划分方法,它通过递归地将数据空间划分为超平面,构建一棵二叉树,从而实现高效的近邻搜索

IVF

IVF (Inverted File)倒排索引是一种常用的空间划分方法,它通过聚类算法将数据集划分为多个簇,并为每个簇建立倒排索引

倒排索引算法具有优秀的性能,Faiss 库中实现的倒排算法结合了倒排索引和量化技术,显著提高了向量检索的效率,在 ANNBenchmarks 中表现出色

图匹配

图匹配是现在向量匹配发展的研究方向

主要的思路是将数据集中的向量表示为图中的节点,节点之间的边表示向量之间的相似度关系,下面介绍目前主流和经典的图匹配算法

NSW

NSW(Navigable Small World)图是一种基于小世界网络理论的近邻搜索算法

算法主要逻辑是把所有向量组织成一个小世界图结构,通过在图中进行贪心搜索来找到近邻

HNSW

HNSW(Hierarchical Navigable Small World)图是 NSW 的改进版本,它引入了层次结构,将图划分为多个层次,从而提高搜索效率

算法的主要逻辑是在不同层次上进行搜索,逐层缩小搜索范围,最终在底层找到近邻

一开始,认为 HNSW 对 NSW 的改进主要体现在引入了层次结构上,也就是所说的跳表,但深入研究会发现,HNSW 的层次结构实际上并未带来显著的性能提升,反而是 HNSW 在图构建和连接策略上的优化才是其性能提升的关键

NGT

NGT 是日本雅虎开源的向量检索库,核心算法基于 NSW,后续在度方面做出了多处优化

NSG

NSG(Navigable Small World Graph)是一种基于小世界网络理论的近邻搜索算法,目前主要使用该算法的开源库有 nmslib 和 pynsg

他是在 HNSW 的基础上进行改进的,主要优化了图的构建和连接策略,HNSW 在构建图时,使用了启发式方法来选择连接边,而 NSG 的入口点是固定的。

NSG 的选边策略实际上和 HNSW 是一致的

Vamana

Vamana 实际上是在 HNSW 建图算法的基础上添加了一个参数 \[\alpha\],当 \(\alpha = 1\) 时,实际就为 HNSW 选边,但 Vamana 取不同的 \(\alpha\) 值进行了两次选边

DiskANN

DiskANN 是微软提出的一种基于磁盘存储的近邻搜索算法,主要用于处理大规模数据集

HNSW 基础实现

值得一提的是,原论文启发式选边算法中有一个小错误

HNSW 优化探索

  • Title: HNSW 的基础实现和优化探索
  • Author: exdoubled
  • Created at : 2026-01-20 10:00:00
  • Updated at : 2026-01-20 16:42:29
  • Link: https://github.com/exdoubled/exdoubled.github.io.git/misc/lab2/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments