从向量检索说起
咱们日常生活中常见的图片和声音都是非结构化数据,通过应用各种机器学习的模型,能够提取出不同的特征向量。每个非结构化的对象,都可能作为提取特征向量的汇合,由一个高维向量进行示意。比方,苹果能够用 [圆球形,红色,水果,酸甜,…] 来示意。
与标量数据查问不同,在向量数据库中进行近似查问时,咱们的目标并不是找到和指标完全一致的对象,而是找到和指标类似度更高的对象。同时,在比拟两个向量类似度的过程中,咱们所破费的老本绝对于标量也要高得多,如果每次查问都须要遍历整个数据库的话,整体计算量将十分大,工夫代价也将十分低廉。
这个时候,通过应用一些向量检索算法,能够帮忙咱们解决下面的难题。例如,近似最近邻搜索算法(Approximate Nearest Neighbor Search, ANNS)。
ANNS 是什么
ANNS 又叫做近似最近邻算法,是一种减速向量相似性查问的办法。这种算法其实就是为给定的汇合构建一种数学模型(或数据结构),当输出一个检索对象时,能够在汇合中疾速找到与其最近的对象。
业界目前有许多不同“版本”的 ANNS 算法,比方 ivf_flat, hnsw, scann 等等,这些算法的实质是通过构建索引,缩小数据查问过程中对数据库的遍历,来进步查问的效率,但代价是会升高向量相似性搜寻的精度。
如何抉择索引类型、设置索引参数来均衡精度损失和查问效率,是向量数据库构建的重要内容。
想要解决下面的问题,未免须要用户相熟各类简单的索引以及繁多的参数,这都须要消耗大量的工夫来进行学习和把握,并且在神经网络算法中存在大量的黑盒情况,在向量索引场景中想要察看和调试业务也同样面临着微小的挑战:咱们如何晓得与某个数据类似的向量都是什么呢?
Feder – ANNS 算法的可视化神器
为了解决下面的难题,让生产环境中的向量数据具备肯定的可观测性,咱们推出了一款基于 ANNS 算法的可视化工具—— Feder,它能够将算法解决数据的过程可视化,并将清晰的后果疾速牢靠地出现在用户背后。有了 Feder,神经网络算法场景下的向量检索将不再是黑盒!
应用 Feder 能够帮忙咱们更容易地了解不同的索引类型及参数:Feder 能够反对用户察看不同索引的数据组织构造,以及不同参数对索引构造的影响;Feder 也能够向用户展现单次搜寻工作中残缺的搜寻过程,包含具体的数据拜访记录。
咱们曾经反对了两种支流索引: hnsw (from hnswlib) 和 ivf_flat (from faiss),咱们正在对我的项目进行踊跃的开发,让 Feder 能反对更多索引的类型,如果你有具体的索引需要,或者对我的项目感兴趣,欢送返回 Github(https://github.com/zilliztech/feder)参加我的项目的探讨。如果你感觉咱们的我的项目还不错,请给咱们的我的项目点赞和关注!
hnsw 可视化 – 基于 VOC 数据集的案例剖析
咱们应用机器学习畛域中经典的图片数据集 VOC 2012(17,000+ 张照片)为例,通过 Towhee(https://github.com/towhee-io/towhee)能够将这些照片高效地转换为向量,而后通过 hnswlib 实现索引的构建,最初通过 Feder 实现后果的可视化。
咱们实现了一个开箱即用的在线 demo,你能够在 colab 上疾速体验 hnsw 的可视化后果。(https://colab.research.google.com/drive/12L_oJPR-yFDlORpPondsqGNTPVsSsUwi?usp=sharing)
洞悉 hnsw 索引的整体构造
接下来,咱们为 VOC 数据集构建 hnsw 索引,如下图所示,一共有 5 层。为了不便演示,咱们仅展现最下面 3 层的构造。
hnsw 索引具备多层构造,其中每层都是一个联通网络。在下面的图片中,咱们能够察看到,下层的节点比拟稠密,然而节点间的跨度比拟大,而 层数越往下,节点越浓密。这个空间结构相似真实世界中的交通网络,从上往下,顺次能够看作:航空网络、铁路网络,以及高速公路网络。
当咱们利用 hnsw 索引进行向量搜寻时,会优先应用下层的网络,就像乘坐飞机一样,它提供更快的速度(更少的直达),然而单靠下层网络并不能间接找到与输出对象类似的指标对象。这时,咱们须要持续向上层网络进行数据查找,来取得更高的数据精度。同样地,咱们在现实生活中也须要换乘其余交通工具,例如铁路、高速公路、一般公路等等。(这里有一个细节,hnsw 在构建时会选取最上层的一个节点作为固定入口,每次查问都将从该入口登程)
Feder 反对用户进行交互,用户能够抉择任意一个数据节点进行察看,高亮的黄色轨迹示意从入口登程到最终到达该节点的最短门路(起码的直达),红色门路代表了该节点能到达的其余节点。通过交互查看该门路上更多细节,咱们能够看到,随着层数的减少,连贯对象的类似度会越来越高。
左上角的“数据概览面板”提供了一些参数信息:
- 参数 M : 每层网络中的每个节点能够到达节点的数量取决于参数 M。以后,M 的值为 8,那么从任意一个节点登程,能到达的节点数目不会超过 8 个(在最底层 level-0 是 2M=16 个)。咱们能够批改不同的参数,以察看在不同参数下的索引构造。随着 M 的减少,hnsw 的整体构造将会越偏向于“扁平”。
- 参数 ef : ef 对索引构造的影响并不如 M 那么显著,它理论影响的是索引构建时 link 的生成。具体能够参考论文[1]。
洞悉 hnsw 索引的搜寻过程
当咱们给定了搜寻指标后,就能够在 Feder 中以动画的模式理解到残缺的向量搜寻过程。
上图展现了理论搜寻工作中数据拜访的过程,其中包含了参加向量相似性计算的对象。
首先,从(固定的)入口登程,先在第一层逐渐拜访所有能到达的节点,而后跳转到间隔指标最近的一个,每次跳转都在逐渐凑近指标节点,当本层的节点不足以更加凑近指标时,将进入下一层一直搜寻。
在最初一层的搜寻过程中,其搜寻门路是多线开展的,ef 参数将影响搜寻门路的抉择。
通过交互,咱们也能够发现,尽管最开始搜寻门路上的节点相关性都较低,但随着搜寻的进行,搜寻的精度迅速变高。从左侧的统计面板中,咱们能够发现,总量超过 17,000 张的图片,理论被拜访到的向量(即参加间隔计算的向量)只有 143 个,约占总量的 1%,这大大减速了查问的效率,这也是 hnsw 的魔力所在。
用户能够调整参数,生成不同的索引文件,来察看不同索引构造下的搜寻效率和后果比照。
对于 Feder
Feder 的诞生离不开弱小的向量数据库软件 Milvus [2] 和先进的向量数据 ETL 框架 Towhee [3],如果你对 Feder 感兴趣,欢送拜访 GitHub,查看文档,理解 Feder 的更多信息 (https://github.com/zilliztech/feder)
Feder 基于 JavaScript 构建,咱们只须要筹备好数据的索引文件,就能够实现“向量的可视化”。
除此之外,咱们还提供了 Python 工具包:federpy,能够通过 IPython 生成可视化后果。
相干链接
- Efficient and robust approximate nearest neighbor search using hierarchical navigable small world graphs.:https://arxiv.org/abs/1603.09320
- Linux Foudation AI & Data 顶级毕业我的项目 Milvus:https://github.com/milvus-io/milvus/stargazers
- 囊括寰球近千款 SOTA 模型的 Towhee 社区:https://github.com/towhee-io/towhee
如果你感觉咱们分享的内容还不错,请不要悭吝给咱们一些激励:点赞、喜爱或者分享给你的小伙伴!
流动信息、技术分享和招聘速递请关注:https://zilliz.gitee.io/welcome/
如果你对咱们的我的项目感兴趣请关注:
用于存储向量并创立索引的数据库 Milvus
用于构建模型推理流水线的框架 Towhee