简介
Vector Embeddings 向量嵌入是自然语言处理 NLP 的基本概念,作为单词、句子、文档、图像、音频、视频的数字表示,以此表示对象的语义以及上下文信息。
用来保存嵌入向量的数据库就被称为向量数据库,为了加速查询,一般会引入向量索引,可以准确进行相似性搜索和模式识别。
距离度量
判断向量之间的距离,决定了空间划分、候选节点和查询节点的距离和排序等等。
kNN/ANN
k-Nearest Neighbors Algorithm, kNN
最早在 1967 年的 Nearest neighbor pattern classification 中提出,其尝试解决的是,给定一个向量数据集和查询向量 Q,计算 Q 与数据集中所有向量之间的距离,根据距离大小找到最接近 Q 的 K 个向量。
默认采用的是暴力搜索,导致其效率极低,所以,可以通过缩小查询范围、向量维度提高效率,也就是 Approximate Nearest Neighbor, ANN
算法。
- 缩小查询范围,对数据集进行划分,子集合中的数据可以通过树、图、倒排索引方式组织。
- 减少向量纬度,通过量化有损压缩高维向量,常用的是
Product Quantization, PQ
乘积量化。
向量量化
用来将高维向量进行压缩,通常是有损压缩,如上所述,最常用的是 PQ 算法。
总结
在 FAISS 官方文档中有相关的论文整理,优化的核心包括了倒排索引的提升、PQ 编码的优化,还有就是通过 GPU、SIMD 等的加速以及应用。
索引
简单介绍一些常见的索引技术。
IVF
Inverted File, IVF 倒排索引,根据 K-Means 等聚类技术将数据分成多个簇,数据库中每个向量都分配给特定的簇,每个簇对应一个倒排列表,保存了该簇的向量索引。这样大大减少了需要比较的向量数量,从而提高检索速度。
上述在每个簇内部以平坦 (Flat) 方式保存,也被称为 IVFFLAT 实现,在簇内部需要暴力搜索,缺点是需要存储原始的向量,导致内存开销比较大,因此,有了如下几个常见变体。
IVF-PQ
在数据量大时,会占用太多的内存,可以通过 Product Quantization, PQ
乘积量化方法压缩向量数据,将高维向量分为多个子向量,但是量化过程会引入误差,从而导致其搜索精度降低,可能会导致召回率无法满足需求。
HNSW
Hierarchical Navigable Small World, HNSW 用于大规模高维数据近似最近邻搜索算法,其基于跳表和导航小世界实现,通常可以在几毫秒内从数百万个向量中找到最邻近的结果。
MSTG
Multi-Stage Tree Graph, MSTG 是由 MyScale 实现的索引。
其它
过滤
上述的向量搜索是基于向量表示,在数据集中查找相似向量的方法,不过现实使用时,向量通常会带有元数据,用户需要对元数据应用过滤器,以此提高搜索的准确性,这也被称为过滤向量搜索。
GPU 加速
包括 Faiss 以及 Milvus 都提供了 GPU 加速能力,在原有的基础上可以有近 10 倍的性能提升。