乐趣区

关于人工智能:向量数据库是如何检索的基于-Feder-的-IVFFLAT-可视化实现

Embedding 是剖析非结构化数据的重要形式,当咱们将图片、声音编码为向量后,这些数据仍旧可能保留原始数据(图片、声音等)的详细信息。然而,咱们很难间接对这些编码后的向量中的数字与原始数据建立联系,想要弄清楚向量形成的空间到底意味着什么就更是难上加难了。

本篇文章,咱们将以向量 Embedding 场景中最重要的利用“以图搜图”为例,通过应用开源工具 Feder 来分析相似性检索场景中的向量空间到底是怎么的,以及介绍最罕用的向量索引 IVF_FLAT 在空间中的构造体现、它的数据检索过程是如何进行的。

向量检索常见场景:“以图搜图”

日常网络数据中,图片、视频等非结构化数据越来越多。“以图搜图”这种新型信息检索形式,也变得越来越常见。以图搜图,通常也被称作“反向图像搜寻”,它的工作流程非常简单:咱们向搜索引擎提交一张图片,搜索引擎从数据库中返回最类似的几张图片后果给咱们。

有的时候,咱们会惊叹搜寻后果十分类似,有的时候也不免吐槽后果离谱至极。那么,这个后果到底是怎么来的呢?或者说,计算机是如何判断图片们是否“类似”的呢?

计算机如何了解“图片的相似性”:嵌入向量(Embedding)

咱们晓得图片是由许多像素点形成的,所以间接比照位图的每一个像素点是能够判断图片的相似性的,然而这个计划显然不是那么高效,甚至不会那么无效:一张夜空的图片和一张黑猩猩的图片只有色彩形成类似,内容则齐全不同。

如果咱们事后对图片进行“打标签”来进行分类,把类似图片的搜寻问题转化为标签的搜寻和匹配问题,是不是就可能解决这个问题了呢?比方:辨认到用户上传的图片是一只橘猫,那么就在数据库中查找并返回所有带橘猫标签的图片。这个办法是可行的,晚期的搜索引擎中也是这样实现的,然而咱们很容易发现一个致命问题:搜寻后果的准确性高度依赖于标签的精密水平。在数据量爆炸的明天,为每一张图片打上足够的标签的经济老本显然会十分高,并且“标注”十分依赖于人工。

那么是否有什么办法,可能在没有“标签”的状况下,实现图片之间的类似度判断呢?AI 畛域最为风行的嵌入向量 (Embedding) 就很好地解决了这个问题。那什么是嵌入向量呢?以咱们相熟的“苹果”举例,在咱们脑海中,它的特色关键词能够被形容为 [红色,球形,甜,芬芳,长在树上,…] 等等,任何与这些特色类似(不肯定完全相同)的物品都可能是苹果。

好了,如果咱们设置 一套规定,用数字来对应这些特色概念,就可能失去苹果的向量表达方式,比方将它示意为:[1.024, 9.527, 1.314, 5.201, 1.111, 0.618 …]。此时,再交给计算机程序,实现这些数字的计算,再适合不过了。咱们能够设置多种映射规定,从不同维度对图片进行特征提取,并将这些特色以数字的模式展现进去,而后应用程序获取图片之间的向量间隔,比方:欧式间隔、余弦间隔等等。

通常,咱们会将这些“确定的映射规定”称作训练好的模型,而“提取尽可能多的特色”就是模型在学习和训练过程中获取的外围能力,这些“提取出的特色”就是图片标签在向量空间中的表达方式。咱们只须要通过程序来判断不同图片在向量空间中的间隔,就可能判断图片之间是否存在相似性,以及类似度有多高。

如果在提取过程中,咱们应用了不同的模型,即便对于雷同的图片,咱们失去的嵌入向量的后果也是不同的,如同不同的人对待雷同事物的认知存在不同一样。但只有是一个品质还不错的模型,计算失去的红苹果和青苹果之间的向量间隔,肯定会比它们和一只猫要近得多。单纯比拟向量的相对数值是没有意义的,相比之下“绝对间隔”对于计算机了解图片类似度更为重要。

如何高效地搜寻间隔最近的向量:近似最近邻搜寻

在理解计算机是如何计算图片之间的类似度之后,咱们来简略演绎下它的具体工作流程:

  • 筹备工作:训练模型,针对数据进行预处理,将图片全副编码为向量并进行贮存。
  • 第一步:获取指标图片的嵌入向量。
  • 第二步:在向量数据库中找到间隔最近的向量,收集向量的 ID。
  • 第三步:依据检索到的后果,返回对应向量 ID 所代表的图片。

在理论检索过程中,如果咱们不进行任何优化,采纳默认的索引类型,比方 FLAT,那么在查找的过程中,会暴力地对所有数据进行遍历查问。在图片类似度比对的过程中,如果 embedding 抽取数据维度为 512 / 1024 甚至更高维度,意味着单次计算量也会十分高。生产环境中,咱们的数据总量个别都比拟大,如果不采取任何优化措施,数据量 x 向量维度带来的将是十分可怕的计算量,与之绝对的是单次查问的负载将十分高。

在云主机环境中(8cores),当咱们在 100 万 512 维向量数据中进行数据检索时,如果应用 FLAT 索引进行检索,将破费靠近 100ms 的工夫,而如果咱们采纳 HNSW 索引进行数据检索,检索工夫将升高到 1~2ms,是不是很惊艳!

为了可能让向量检索程序高效的执行,咱们须要思考如何针对它进行优化。这个检索过程中,除了筹备工作中的数据预处理会破费比拟多的工夫之外,最费时的莫过于第二步操作。因为筹备工作是一次性计算,所以咱们能够将其疏忽,重点放在如何优化高频次的向量检索过程。

除了优化计算效率,让计算减速之外,有一个风行的计划是通过算法来缩小整体计算量,来晋升整体检索效率。在计算机领域,对时空复杂度很高的算法,经常会用 近似检索 来均衡准确率和计算效率。通过 就义一些精度 换取效率的微小晋升

这篇文章中,咱们先来介绍最为经典的一种近邻搜索算法:IVF_FLAT,通过向量数据库可视化工具 Feder 揭开它在向量检索过程中的神秘面纱。

了解 IVF_FLAT 向量索引的检索过程

IVF_FLAT 向量索引的检索过程一共分为三步,在理解具体步骤之前,咱们先来筹备向量数据。

筹备工作:应用 Towhee 取得向量数据

通过应用 Towhee,咱们能够轻松地将机器学习畛域经典图片数据集 VOC 2012 中的一万七千多张图片转换为向量数据。

import numpy as np
import towhee

 dc = (towhee.glob('train/*/*.JPEG')
              .image_decode()
              .image_embedding
              .timm(model_name='resnet50')
              .to_list())
vectors = np.array(dc, dtype="float32")

步骤一:对所有向量进行聚类

接下来,咱们应用开源我的项目 facebookresearch/faiss 来为这些向量数据构建 IVF_FLAT 索引。对于 Faiss 的入门,能够参考《向量数据库入坑指南:聊聊来自元宇宙大厂 Meta 的类似度检索技术 Faiss》这篇文章,本文就不过多开展了。

和事实世界中一样,当国家因为土地广袤,通常会进行行政区域划分,比方将间隔相近、有独特特点的区域归属于一个省份。IVF_FLAT 索引采纳的思路也是相似的,会将间隔相近的向量组成一个聚类。相似事实中不同省份领有城市、乡镇数量不同,因为向量散布的密度不同,每个聚类蕴含向量的数目也会是不一样的。

import faiss

num_elements, dim = vectors.shape
nlist = 256

index = faiss.index_factory(dim, 'IVF%s,Flat' % nlist)
index.train(vectors)
index.add(vectors)

faiss.write_index(index, 'faiss_ivf_flat_voc.index')

在下面的代码中,咱们设置索引构建参数 nlist=256,依据k-means 算法,可能将前文中 Towhee 解决好的所有向量分为 256 份。k-means 是机器学习畛域里最简略和最常见的无监督的聚类办法,能够让间隔相近的向量尽可能归属于同一个聚类中,同时每一个聚类中的向量们,间隔这个聚类的几何核心相比拟其余的聚类而言都是最近的。

为了更好的了解下面的内容,咱们通过 Feder 进行了可视化出现。如下图所示,咱们在一个二维立体上模仿了高维空间上的聚类划分。

咱们能够通过挪动鼠标来查看不同聚类中的内容,鼠标停下的中央,将随机展现该聚类中最多九张图片。(在线预览地址)

实现向量数据的聚类后,当咱们进行查问的时候,会产生什么呢?

步骤二:粗查问(Coarse Search)

当咱们输出指标向量进行查问时,首先会将指标向量与上图中所有聚类(256 个)的核心进行间隔计算,并找到间隔最近的几个聚类。因为聚类的划分根据是向量间的绝对间隔,因而咱们能够认为,间隔指标最近的向量极大概率会属于这最近的几个聚类中。

在查问过程中,咱们通过设置查找个数的参数nprobe=8,将检索范畴从 17000 张图片所在的 256 个区域,缩减为最类似的八个聚类中(图中高亮的区域)。在粗查问过程中,咱们一共进行了nlist(256)次计算。(在线预览地址)

步骤三:精密查问(Fine Search)

在实现“粗筛”之后,咱们确定了与查问数据间隔最近的几个聚类,接下来将进行精密查问。

咱们能够通过设置查问参数k=9,来指定最终检索的后果是最类似的九张图片。在检索过程中,算法将逐个将查问数据与这些聚类中的每一个向量进行间隔计算,并从中选取间隔查找数据最近的九个向量后果。

如上图所示,咱们将不同的聚类应用不同的色彩来进行辨别,能够察看到这些聚类中的向量的具体空间散布。其中,每个向量节点间隔核心的间隔映射了该向量与咱们要检索的指标向量的理论间隔。

除了看详情之外,咱们还能够进一步查看这些向量更具体的数据。

除了依据与指标的间隔来布局外,Feder 还反对通过降维投影的形式来可视化向量散布,欢送亲自动手来试一试,轻松玩转向量数据。 https://github.com/zilliztech/feder

IVF_FLAT 类型向量检索性能剖析

如果咱们应用传统的 FLAT 类型的索引,想要实现雷同的检索,至多须要计算一万七千次,实现整个向量数据库的遍历。而当咱们应用了 IVF_FLAT 索引之后,依据上文中的参数配置,咱们只须要进行不到一千次的计算:蕴含了粗略查问 256 次,以及后续的精密查问 742 次左右,可能大幅晋升咱们对于检索成果的获取速度。

而通过在精密查找阶段的 nprobe 参数,将可能满足具体的业务场景须要,均衡效率(检索效率)和精度(召回率):增大 nprobe,通过搜寻更多的数据所在的聚类空间,可能失去更多的搜寻后果;缩小 nprobe,则能够通过缩小搜寻范畴来缩短计算工夫,失去更疾速的检索后果返回。

从新扫视以图搜图

在理解了 IVF_FLAT 背地的近似最近邻算法后,回顾下整个以图搜图的流程,咱们不难发现,最终搜寻后果的好坏取决于上面两点,以及背地的各种因素:

1. 第一步:机器学习模型是否可能正确的提取图片的特色数据?提取的特色数据量是否足够?这些嵌入向量保留了多少原始空间中的信息?

2. 第二步:通过“近似最近邻搜寻”算法取得的数据自身是否准确?是否存在有更近的向量数据存在,然而没有通过索引查找到?通过调整索引参数是否可能改善搜寻后果?以及这些参数是如何影响搜寻过程的?

尽管写进去就几句话,然而这两个问题都并不是那么简略。想要解决第二步中的问题,须要咱们对于近似最近邻算法十分相熟,才可能对各个参数施展理论效用有所理解;而第一个问题,则是困扰学术界多年的难题,对于机器学习模型的可解释问题。

以往咱们评估下面两个过程对于检索后果的好坏,次要是通过筹备不同 测试集 来从宏观上计算不同模型在不同近似最近邻算法下的准确率和召回率。在有了 Feder 这个可视化工具之后,咱们能够尝试从 单次查问 登程,从 宏观 上来深刻察看这个过程。以前文中的图片为例:

咱们先从个别的视觉感知角度登程,来进行图片形容:晴空 万里,一个人 骑着 ,在 场馆 草地 上,此时一人一马正 腾飞在地面 ,逾越 栏杆

接下来,咱们通过应用 Feder 来进行图片查问,看看模型是如何了解这张图片的。在粗略查问中,咱们找到了间隔指标最近的几个聚类区域。

能够发现,图片右上角的 cluster-54 这个聚类中的图片大多描述了人的跳跃过程:腾飞在地面 ;而右下角的图片 cluster-103 更多蕴含了以为主题的图片;在 cluster-217 与 cluster-113 尽管看起来和原图不是很类似,但实际上蕴含了 栏杆 场馆 这类修建特色。

在精密查问过程中,咱们能够从深刻到聚类外部,进行更粗疏向量粒度的图片比照。来思考嵌入后的信息空间与实在感知的视觉空间的差别。

最初

你或者会纳闷为什么图片 A 比图片 B 更近?为什么最合乎视觉的图片 C 反而被错过?或者,当初的咱们还不可能很好的解答这些问题,但恰好是这些一个又一个的“为什么”在指引着咱们去一直靠近假相,去更好的意识模型、优化模型。咱们认为神经网络绝不只是凉飕飕的参数堆砌的多层构造,在不远的将来,研究者们终将可能训练出和人类感知统一的模型,甚至通过模型反观人脑的认知神经,揭开大脑更深层次的神秘。

如果看到这里你还意犹未尽,想亲自上手体验,咱们为你筹备了一个可交互的以图搜图剖析网页,你能够自在地筛选感兴趣的图片进行搜寻,并联合可视化工具 Feder 去察看模型和近似最近邻的搜寻过程。欢送向大家分享你的所思所感~

如果你对近似最近邻算法很感兴趣,那么请放弃关注,接下来的内容中,咱们将分享更多精彩的技术干货。

最初的最初,不管你是进阶的模型训练家,还是刚刚入门的炼丹士,都欢送应用咱们的开源可视化工具 Feder,来摸索模型中暗藏的神秘。Feder 蕴含两个版本:Python 以及 JavaScript,咱们在 GitHub 有具体的文档和教程,心愿可能失去你的“一键三连”。你的激励,将是咱们持续提高的能源!


如果你感觉咱们分享的内容还不错,请不要悭吝给咱们一些激励:点赞、喜爱或者分享给你的小伙伴!

流动信息、技术分享和招聘速递请关注:https://zilliz.gitee.io/welcome/

如果你对咱们的我的项目感兴趣请关注:

用于存储向量并创立索引的数据库 Milvus

用于构建模型推理流水线的框架 Towhee

退出移动版