关于数据库:从零到一教你搭建以文搜图搜索服务一

42次阅读

共计 3619 个字符,预计需要花费 10 分钟才能阅读完成。

一图胜千言: don’t waste my time, show me the image

为什么「以文搜图」如此重要?以文本的形式收回问题,再以图片的形式返回答案,这种信息获取范式,连我奶奶都说好。电商平台淘货色,找喜爱的宠物,租心仪的房子,学菜谱,找喜爱的短视频……不论是哪一类强交互的利用,图文的跨模态了解都是大幅晋升用户体验的利器

嗯,问题挺重要。但如果用传统技术做文本和图像的语义了解,在理论利用中还是略微差了那么一点意思,所以间接硬刚去解决问题还是挺有挑战的。落地靠谱的解决方案多少都会曲折一下,并不尝试间接了解数据语义,而是通过协同过滤的形式,依赖大规模的用户浏览行为串起数据间的语义关联。这听起来有点先有鸡还是现有蛋的滋味——对数据了解不到位,就很难建设用户粘性,但要了解到位,又要依赖大量的用户数据???

现实情况也的确如此,大规模图文的跨模态利用始终都是头部大厂的地盘,小一点的我的项目想玩转这套技术,启动都很艰难。直到去年,OpenAI 丢了个 CLIP 模型到平静湖面,并通知所有人,“咱们搞了一套 4 亿规模的文本 - 图片对,鼎力出奇观了一把,当初有了 CLIP,文本和图片之间的语义桥曾经搭好了。”

对于本篇: 咱们从哪里来,要到哪里去

「以文搜图」系列文章会从零到一地介绍如何利用 CLIP 构建大规模以文搜图服务,包含:

  • 理解 搜寻、CLIP,以及以文搜图
  • 5 分钟实现以文搜图的原型
  • 进阶 1:部署向量数据库,进行大规模向量召回
  • 进阶 2:部署推理服务,让你的推理申请解决超过 1000 QPS
  • 进阶 3:向量数据压缩

本篇是这个系列的开篇,会笼罩第一个主题。接下来,咱们须要先积攒一些基础知识,疾速地建设对以下内容的根底了解,包含:搜寻、CLIP、以文搜图的根底组件,一起来吧!

来点儿基础知识 -1:搜寻与语义类似

凡是讲到搜寻,不论是传统的还是新派的,或是繁多模态、跨模态的,都离不开一样货色:语义类似的度量 ,或者说,两样货色的 语义间隔。这听起来如同有点形象,咱们举几个例子。

让咱们从一维的整数空间开始,这是从小学就刻在大家 DNA 外面的常识。给定 5 个正整数 {1, 5, 6, 8, 10},问,和 5 最靠近的是哪个数字?(不必抢答 6,毕竟大家都是成年人 ……)

当年,老师会说,“5 和 6 之间的间隔是 1,是所有数中和 5 间隔最近的。”这里提到的“间隔 1”,就是 5 和 6 这两个货色的语义间隔。

这如同有点小儿科,让咱们甩开腿,再往前迈一步,看一看传统的文本搜寻是怎么做的。如果你和搞文本搜寻的敌人同学聊,那大概率会听到 TF-IDF 这么个词。这外面 TF 指的是 term frequency,也就是词频。设想有一个高维空间,这个空间的维度和字典中的词一样多。咱们统计每篇文章中雷同词语呈现的次数,并将这个次数设为这个空间相应维度上的值。这样,咱们能够将任何一篇文章形容为一个这个词向量空间上的稠密向量(之所以稠密,是因为通常每篇文章只能笼罩字典上很少的一部分词)。

这是个十分奢侈且实用的思路。如上图所示,如果两篇文章的畛域或内容相近,那么在词向量空间中,这两篇文章对应的向量应该离得不远,如果两篇文章完全相同,那他们的词向量之间的间隔为 0。在文本搜寻中,咱们将第一个例子的一维正整数空间扩大到了高维词向量空间,但搜寻技术背地的套路是基本一致的:定义一个能用来形容数据语义的空间,再确定数据语义间的间隔。

走到这一步,拍拍聪慧的脑袋瓜,思路来了:咱们甩开腿再往前迈一步,再泛化一下。既然文本搞定了,咱们把图片的语义也投到词向量空间,这样不就能文本 - 图像跨模态了么?

思路没故障,然而少了点货色。不必特地认真看,咱们就能发现图片和文本不一样,文本有“词”这个天生白送的天然语义根本单元,咱们在这个根底上能够很容易搞下面说的词袋模型。但图片不一样,首先,像素显著不会像词那样一套就 work 了,其次,咱们如果尝试提取图像中的图元,老本会很高,另外图片的结构化信息提取也很难做到全面、精准。

“没有天然语义单元,怎么向量化?”在以前,这不仅仅是图片搜寻的特有问题,而是 非结构化数据利用的广泛问题,因为绝大多数数据类型(想想图片、视频、音频、点云这些数据)都不会天生存在天然的语义单元。这个问题直到数据、算力变得便宜,神经网络技术失去遍及才得以无效解决。咱们来看看通过神经网络是怎么解决这个问题的。

Convolutional Neural Network Layers and Architectures

深度神经网络,很大的一个特点就是“够深”。察看上图,右边输出是一张 224 x 224 的图片,左边输入是一个 4096 维的向量。从左到右,一张图片会通过很多的神经网络层,每往右一步,神经网络就会将原图片像素上的空间信息逐渐压缩成语义信息。在这个过程中,能够看到空间维度越来越窄,语义维度越来越长(这个说法严格上讲不是特地精确,然而我没有找到更适合的表白)。实质上,这个过程就是 一个将图片语义映射到一个具备 4096 维的实向量空间的过程。和后面讲的技术相比,通过深度神经网络对数据语义进行向量化编码,有几点显著劣势:

  • 不要求原始数据具备天然的,可间接宰割的根底语义单元,例如“词”。
  • 对于“数据类似”的定义非常灵便,由模型的训练数据以及指标函数确定,能够面向利用个性定制。
  • 数据向量化的过程即模型的推理过程,这个过程中的运算次要是矩阵运算,能够充分利用古代 GPU 的减速能力。

最初,咱们来看一下 CLIP 在文本 - 图片跨模态这个畛域做了哪些事。首先,在数据方面,OpenAI 搞了一套文本 - 图片跨模态的大规模数据集 WIT (WebImageText)。模型训练则采纳了比照学习的办法,预测图片和文本是否配对。整个模型的设计还是十分简洁的。用艰深的话讲,这个模型蕴含三步,

1)文本和图片两路别离进行特色编码;

2)将文本、图片的特色从各自的单模态特色空间投射到一个多模态的特色空间;

3)在多模态的特色空间中,本来成对的图像文本(正样本)的特征向量之间的间隔应该越近越好,相互不成对的图像文本(负样本)的特征向量之间的间隔应该越远越好。

Learning Transferable Visual Models From Natural Language Supervision[1]

这里比拟要害的是 2),通过投射层,将来自文本、图片的单模态特色投射到一个多模态的特色空间。从搜寻的角度看,这意味着咱们能够将图片和文本的语义映射到同一个高维空间。这个语义空间就是 CLIP 为文本 - 图片跨模态搜寻筹备的那座桥。当初,咱们能够将一段描述性文本编码为一个向量,在通过这个向量找到左近具备近似语义的图片向量,再通过这些图片的向量找到咱们想要的原始图片!

有点绕,咱们总结一下。整体上看,还是经典套路,向量空间 + 语义类似的度量。重点在于,CLIP 帮咱们搞了一个对立文本与图像语义的高维空间,在这个空间中,文本和图像的语义越靠近,对应向量的间隔越小。

到这里,咱们所需的 CLIP 基础知识根本够用了。如果你感觉 CLIP 很酷,想来一个 CLIP 的 deep dive,墙裂倡议观看李沐老师的 论文精读系列[2]。

来点儿基础知识 -2:以文搜图服务须要的根底组件

「以文搜图」顾名思义,所须要的根底组件波及「文」「搜」「图」三局部。

先来看看「图」。「图」形成的是底库的局部,次要蕴含三套货色,一个是原始图片库,另一个是与原始图片绝对应的向量库。两头是负责对原始图片进行语义向量化编码的模型推理服务。

「文」对应的是申请侧的内容。申请侧次要须要的是对文本进行语义向量化编码的模型推理服务。

「搜」对应的是连贯申请、向量库、图片库的搜寻过程。一条申请的文本,通过模型编码后,咱们能够取得与申请对应的向量。咱们拿这个向量到向量数据库进行近似搜寻,取得 topK 个最近的图片向量。最初,通过向量 - 图片的 ID 关联,从图片库取得对应的原始图片(或图片 url),组织申请的返回后果。

好了,本篇打基础的内容到这里就差不多完结了。在接下来的文章中,咱们会联合本篇讲到的基础知识进行一次入手实际:5 分钟搭建以文搜图的原型。感激观众老爷的观看学习!

更多我的项目更新及具体内容请关注咱们的我的项目:https://github.com/towhee-io/…,您的关注是咱们用爱发电的弱小能源,欢送 star, fork, slack 三连 :)

参考文献

[1] https://arxiv.org/pdf/2103.00…

[2] https://www.bilibili.com/vide…


Zilliz 以从新定义数据迷信为愿景,致力于打造一家寰球当先的开源技术创新公司,并通过开源和云原生解决方案为企业解锁非结构化数据的暗藏价值。

Zilliz 构建了 Milvus 向量数据库,以放慢下一代数据平台的倒退。Milvus 数据库是 LF AI & Data 基金会的毕业我的项目,可能治理大量非结构化数据集,在新药发现、举荐零碎、聊天机器人等方面具备宽泛的利用。

正文完
 0