你知道Faiss吗?

352 阅读3分钟

「这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战

概念

Facebook智能相似度搜索(Facebook AI Similarity Search,Faiss)

是一个用于高效相似性搜索和密集向量聚类的库,可以让Facebook对相似的多媒体文档进行快速搜索。

这是以前传统的搜索引擎无法做到的挑战。在十亿级的数据库上,比当前已知的最好方法的速度快大约8.5倍。

相似性搜索的本质

传统数据库由包含符号信息的结构表组成。比方说,一个图像集,会用每行放一张索引照片的列表来表示。每一行都包含诸如图像标识和描述语句等信息。每一行也可与其他表格的条目关联,比如照片与人名列表相关联。

很多AI 工具都会产生高维矢量,比如像 word2vec 这样的文本嵌入工具,以及用深度学习训练的 CNN 描述符(descriptors),这些表示与固定的符号表示相比更加强大灵活。然而,用 SQL 来检索的传统数据库并没有适配这些新型表示。

这是为什么呢?🧐

首先,海量的新多媒体流创造了数十亿的矢量。其次,而且更重要的是,找到相似的条目意味着要找到相近的高维矢量。而对于当下的标准检索语言,这是极度低效、甚至无法实现的。

如何使用矢量表示?

矢量表示的两个应用是相似性搜索和相似性分类。

相似性搜索

让我们假设你有一张某建筑的影像,比方说某城市的礼堂照片,但你忘记这是哪一个城市的了。然后,你希望找到图片库中该建筑的所有照片。该情况下,SQL 中常用的 key/value 检索并没有帮助——because你已经忘了这是哪个城市。

这就轮到相似性搜索派上用场💥。由于设计,图像的矢量表示会对相似图像生成相近的矢量。这个相近矢量被定义为在欧几里得空间相邻的矢量。

相似性分类

想象下你需要一个分类器,来判别图片库中哪一个图片代表了菊花。选取某个算法,先把菊花和非菊花的图像作为输入,若分类器是线性的,它会输出一个分类矢量,分类矢量带有一项重要属性:它的向量点积和图像矢量在一起,能反映出该图像包含菊花的概率。 下一步对向量点积和图片库中的所有条目进行计算。最后 return 有最高概率值的图像。这种检索是一种“最大内积”搜索。

🚩综上,对于相似性搜索和分类,我们需要以下操作:

  • 给定检索矢量,return 在欧几里得距离上最接近这个矢量的数据库对象列表。
  • 给定检索矢量,return 有最高向量点积的数据库对象列表。

一个额外的挑战,是 Facebook 想要在一个大尺度🙃上执行这些操作。这里,“大尺度”指的是数十亿的矢量。

通常固定内存使用,来评估速度和准确率之间的权衡。Faiss重点在于压缩初始向量的方法,因为他们是唯一能缩放到数十亿向量的数据集的工具:当有十亿个矢量需要被索引时,即使每个向量只有32位也会占据大量的存储空间。