Hierarchical Navigable Small World,分层的可导航小世界。
一种向量查找算法。利用分层跳表方式建立索引,然后在 NSW 中查找向量的方向。
算法目的:向量查找,对于已有数据,建立其向量表示,放入向量空间中。在搜索时,根据query的向量表示,从数据库中提取数据。
前置知识
- 三角剖分:将一个图网络切分成一个个三角形网络;每个三角形网络最多相交在一个公共边上
- Delaunay剖分,三角剖分的进一步限制,可以理解为是“美的三角网络“,Delaunay 剖分是一个三角剖分的唯一最优解。
- 空圆性:任意四点不能共圆
- 最大化最小角:两个临接三角形构成的四边形,使其交换对角线,每个三角形内部的最小角不再变大。使得当前形状构建的临接形状是唯一的。
- 跳表
- 索引结构的链表:构建多个有序链表,高层链表是底层链表的索引,需要查找数据时从高层查起,逐渐向底层搜索
NSW
Navigable Small World,可导航小世界,HNSW 的基本组成部分。
新节点进入时,在附近搜索临近节点,然后建立连接。
搜索:贪心方法,每个节点之间存在直线距离的预估值。根据该预估值寻找下一个到 query 的靠近方向。
数据插入:对每个插入元素,使用 kNN 查找最近元素,然后将欻入的节点和附近的节点相连。
HNSW
分层的 NSW
查找:类似于跳表,将数据分层存储,上层是下层的索引。在每一层根据预估方向找到最近邻节点,然后进入下一层继续查找。
建立:预设好最大节点数 max_elements,根据最大节点数决定当前数据要进入哪一层,然后将数据插入到选定的层中。
搜索的例子