FAiSS

\[\mathbf{x} = (x_1, x_2, ..., x_d) \]

\[\mathbf{y} = (y_1, y_2, ..., y_d) \]

FlatL2 欧式距离(L2 距离) 来衡量两个向量之间的相似度

则它们之间的 欧式距离平方(L2 距离平方) 定义为:

\[D(\mathbf{x}, \mathbf{y}) = |\mathbf{x} - \mathbf{y}|^2 = \sum_{i=1}^{d} (x_i - y_i)^2 \]

\[D(\mathbf{x}, \mathbf{y}) = |\mathbf{x} - \mathbf{y}| = \sqrt{\sum_{i=1}^{d} (x_i - y_i)^2} \]

在 FlatL2 中,计算的就是这个距离。相似度越高,该值越小。
注意:实际使用中,有时会省略开根号操作(即只计算平方距离),因为排序结果一致且计算更高效。

IndexFlatIP 表示使用 内积(Inner Product) 来衡量两个向量之间的相似度,通常指的是 余弦相似度 的一种实现方式(在向量归一化的情况下,内积等价于余弦相似度)。

\[S(\mathbf{x}, \mathbf{y}) = \mathbf{x} \cdot \mathbf{y} = \sum_{i=1}^{d} x_i \cdot y_i \]

\[\cos(\theta) = \frac{\mathbf{x} \cdot \mathbf{y}}{|\mathbf{x}| \cdot |\mathbf{y}|} \]

\(|\mathbf{x}| = |\mathbf{y}| = 1\) 时:

\[\cos(\theta) = \mathbf{x} \cdot \mathbf{y} \]

HNSW(Hierarchical Navigable Small World)原理与实现方式

核心原理 HNSW(分层可导航小世界网络)是一种高效的近似最近邻搜索(ANN)算法,用于在大规模高维数据集中快速找到与查询向量最相似的向量。它结合了跳表(Skip List)和可导航小世界图(NSW, Navigable Small World)的思想,通过分层结构加速搜索。

  • HNSW 在 NSW 的基础上引入多层结构(类似跳表):
  • 高层(Higher Layers):节点较少,连接较稀疏,用于快速导航。
  • 底层(Layer 0):包含所有数据点,连接较密集,用于精确搜索。
  • 搜索过程:
    从上到下逐层搜索:先在高层粗略定位,再逐步向下层细化,减少计算量。

2. 实现方式

建图(Index Construction)

随机分层:
  每个节点以一定概率分配到不同层(高层节点少,底层节点多)。

逐层构建 NSW:

  从最高层开始,逐层向下构建图结构,每层都是一个 NSW。
  在每层中,新插入的节点会连接到最近的若干邻居(通过贪婪搜索)。
从顶层开始搜索:
    从最高层的入口点出发,找到距离查询点最近的节点。
逐层向下细化:
    在当前层找到最近邻后,进入下一层继续搜索,直到最底层(Layer 0)。
在最底层(Layer 0)完成精确搜索:
    返回最终的 Top-K 最近邻。

Flat 索引的特点:

精确搜索:
计算查询向量与索引中所有向量的精确距离(如欧氏距离、内积等),确保返回的结果是全局最优的(最相似的)。
适合对精度要求极高的场景。

posted @ 2025-05-05 12:17  不报异常的空指针  阅读(28)  评论(0)    收藏  举报