关于算法:多模态搜索的未来超越关键字和向量的混合搜索

52次阅读

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

二十年前,“混合”一词仅在植物学和化学畛域应用。现在,“混合”这个概念在搜寻畛域一片凋敝,许多搜寻零碎都在推出基于 AI 技术的混合搜寻计划。然而,“混合搜寻”是真的具备利用价值,还只是风行的一阵风呢?

许多搜寻零碎都在推出混合搜寻性能,混合搜寻将传统搜寻中的关键字、文本信息检索技术和基于 AI 的“向量”或“神经”搜寻联合在一起。“混合搜寻”是否只是一个风行词呢?毕竟基于文本的搜寻是一项利用宽泛的技术,以至于用户早已习惯了它的特点,甚至是局限性。将文本搜寻与新的 AI 技术联合真的能为搜寻零碎精益求精吗?

答案不言而喻:这取决于理论状况

当初的数据存储是多媒体和多模态的,文本、图像、视频和音频经常存储在同一数据库和同一计算机上。这意味着,如果你想在五金商店的网站上搜寻螺丝刀的图片,你不能只查问“螺丝刀”这个词,就冀望它能返回相应的后果。首先你得存储并索引文本或商品的标签。除非你明确地将数据库中所有螺丝刀的图片与“螺丝刀”这个标签或其余文本相关联,表明它是螺丝刀的图片,否则利用传统的搜寻技术是无奈返回搜寻后果的。如果你没有明确的标签和文本,将最先进的 AI 技术增加到文本搜寻中将不会有任何帮忙。这样的话,那么将 AI 技术与传统搜寻联合就没有意义了。假如有一个领有网购平台的大型五金商,售卖数十万种不同的商品。然而,他们没有员工制作具体的产品标签和形容或查看它们的准确性;没有商品图片,也没有工夫拍摄好的图片。这样的话,对他们来说,最好的文本搜寻零碎也是一个的有缺点的解决方案。最新的 AI 技术能够很好地解决这些局限性。深度学习和 神经搜寻 让创立弱小的通用神经网络模型成为可能,并将搜寻模型以一种通用的形式利用于不同类型的数据中——文本、图像、音频和视频。因而,即便没有文本标签,搜寻“螺丝刀”也能够找到螺丝刀的图片!

然而这些最新的搜寻技术,返回的后果通常不足可解释性。客户可能心愿输出查问“十字螺丝刀”,理论返回“开槽和十字螺丝刀,4 寸长”的产品。传统的搜寻技术能够做到,但 AI 技术却很难达到这样的成果。

搜寻模型

咱们将基于三个特定的搜寻模型搭建混合搜索引擎:BM25, SBERT 和 CLIP。BM25 是最经典的基于文本的信息检索算法。BM25 最早倒退于 1990 年代,当初曾经被宽泛应用。无关 BM25 的更多信息,请参阅 Robertson & Zaragoza(2009): “),2000a00015-7 “2000a: “) 和 2000b00016-9 “2000b: “),或查看 维基百科上对于 BM25 的演示。咱们利用 Python 的  [rank_bm25] 包,实现了 BM25 排名算法。SBERT 是一个宽泛用于文本信息检索的神经网络框架,咱们应用的是 msmarco-distilbert-base-v3 模型,因为它是为 MS-MARCO 段落排名工作训练的,与咱们所做的排名工作差不多。CLIP 是一个连贯的图像和形容文本的神经网络,它是在图像 - 文本对上训练的。CLIP 有许多利用,在本文咱们中将应用它实现文本查问和图像匹配,并返回排名后果。咱们应用的是 OpenAI 的 clip-vit-base-patch32 模型,这也是应用最宽泛的 CLIP 模型。

三种模型都能够输出文本查问,返回用户指定数量的后果,并且每个后果都有一个分数。查问后果会依照分数排序。

三种模型都能够输出文本查问,返回用户指定数量的后果,并且每个后果都有一个分数。查问后果会依照分数排序。三种模型都是对文本查问的匹配后果进行评分和排名,而后返回一些排名靠前的后果(后果数由用户决定)。这三种模型都很容易集成。SBERT 和 CLIP 返回的分数都在 -1.0(查问最差匹配)到 1.0(查问最佳匹配)之间。BM25 分数最低为 0.0,但没有下限。为了不便比拟,咱们进行了以下解决:

  • 去除 CLIP 或 SBERT 返回的小于 0.0 的后果,因为这些都是谬误的匹配后果。
  • 利用公式将 BM25 分数归一化到 0.0 到 1.0 之间:将 BM25 分数除以自身加上 10。
  • 当匹配后果呈现在一个或两个,但不是所有三个搜寻办法的顶部后果中时,咱们会为错过它的搜寻办法调配一个内插分数。如果申请前 N 个匹配项,咱们会为缺失的匹配项调配一个较小的非零值,该值是经验值。

    例如,假如咱们搜寻“螺丝刀”,并从 BM25、SBERT 和 CLIP 中取得了 20 个最佳匹配项。BM25 和 SBERT 搜寻都在前 20 个匹配中辨认出了产品“磁头螺丝刀 6 件套,3 个十字头和 3 个平头”,但 CLIP 的前 20 个匹配中没有该产品,因为图片是它的包装盒。这时,咱们会找到 CLIP 前 20 个匹配后果中的最低分数,并将这个分数调配给“磁头螺丝刀 6 件套,3 个十字头和 3 个平头”这个产品。

混合搜寻

咱们构建了一个混合搜寻计划,该计划联合了 BM25、SBERT 和 CLIP 的搜寻后果。对于每个查问,咱们都应用 3 种零碎实现搜寻,从每个零碎中检索出 20 个最佳匹配,并依照上一节中的形容调整它们的分数。每个匹配项的分数都是 3 个搜寻零碎(SBERT、CLIP 和归一化的 BM25)的分数的加权和。上面是混合搜寻计划工作的示意图:

在理论利用中,咱们发现以下的权重组合成果很好:

对于这个后果,咱们能够直观地了解为,混合搜寻零碎在文本检索(SBERT 和 BM25)上的权重略大于 0.5,在文本到图像检索(CLIP)上的权重略小于 0.5,BM25 的 0.1 权重确保了对传统术语匹配的偏好,或者在神经模型无奈产生好的匹配后果时作为补充。

搜寻计划比拟

测试数据

现实状况下,咱们应该领有在线商家的产品数据库和查问日志。然而,出于商业和法律起因,公司(特地是虚构的公司)通常不会向钻研人员提供产品数据库和查问日志。因而,咱们只能应用代替计划。咱们应用了最靠近的代替计划:XMarket dataset 数据集。这些数据来自 18 个国家的亚马逊市场,包含亚马逊网站上的产品图像,以及产品名称、产品描述、类别和各种元数据。本文中,咱们应用了 XMarket 数据集的一个子集:仅应用来自于美国亚马逊网站的电子产品类别中的条目,波及 837 个类别,15934 种产品。此外,在每个产品的可用信息字段中,咱们仅应用了以下内容:

  • ASIN — 亚马逊调配的惟一产品 ID。
  • 题目 — 亚马逊应用的产品名称。
  • 形容 — 产品的文本形容,大略来自制造商或供应商。
  • 类别 — 亚马逊分层产品本体中的一个标签。
  • 图片 — 亚马逊在产品页上应用的图片。

上面是一个示例图:

你能够通过登录 Jina AI (在命令行中输出 jina auth login,拜访现有帐户或创立帐户)并应用 DocArray 模块下载数据:


from docarray import DocumentArray

xmarket_dataset = DocumentArray.pull('xmarket_dataset')
xmarket_dataset.summary()
╭────────────────── Documents Summary ───────────────────╮
│                                                        │
│   Type                      DocumentArrayInMemory      │
│   Length                    16934                      │
│   Homogenous Documents      True                       │
│   Has nested Documents in   ('chunks',)                │
│   Common Attributes         ('id', 'tags', 'chunks')   │
│   Multimodal dataclass      True                       │
│                                                        │
╰────────────────────────────────────────────────────────╯
╭──────────────────────── Attributes Summary ────────────────────────╮
│                                                                    │
│   Attribute   Data type#Unique values   Has empty value   │
│  ────────────────────────────────────────────────────────────────  │
│   chunks      ('ChunkArray',)   16934            False             │
│   id          ('str',)          16934            False             │
│   tags        ('dict',)         16934            False             │
│                                                                    │
╰─────────────────────────────────────────────────────

工作形容

因为咱们没有亚马逊的查问日志,因而咱们无奈对代表性样本的查问进行零碎测试,所以只能抉择相似但不同的工作。亚马逊在 XMarket 数据集中为每个产品调配了一个类别属性,并为这些类别调配了文本标签。例如,上一节中的“Sandisk MicroSD 卡”被归为“Micro SD 卡”类。咱们用于比拟的搜寻工作是应用这些类别标签作为文本查问,而后查看查问后果是否为属于该类别的产品项。为了定量比拟,咱们应用 MRR (Mean Reciprocal Rank) 作为指标,按以下形式掂量:

  • 应用类别标签查问搜寻零碎,检索返回的前 20 个排名最高的后果,而后找到实际上属于该类别的后果,最初为该查问调配 1.0/ 排名的分数。例如,如果输出查问“Micro SD 卡”,返回的第一个后果是属于“Micro SD 卡”的产品,那么这个查问的分数为 1.0。如果前四个后果不属于该类别,但第五个后果属于该类别,则分数为 0.2。如果前二十个后果都不属于该类别,则分数为 0.0。
  • 对于每个搜寻零碎,咱们通过对所有查问的分数求均匀来计算 _MRR_。因为这取决于每个查问返回的后果数量,所以咱们将分数标记为 _MRR@20(_返回 20 个后果)。

    筹备搜寻数据库和索引

咱们从 15934 种商品中抉择了 1000 种用于测试,测试涵盖 296 个类别。其余数据将在下一节中应用。而后,通过获取测试集中每个产品的题目和形容来筹备 BM25 索引,接着,利用 rank_bm25 包中的 BM25Okapi  算法,创立文本检索数据库。具体细节请参阅 GitHub 上的 README。

对于 SBERT 模型,咱们基于 Jina AI DocArray,应用测试集的题目和形容作为输出文原本创立向量检索数据库。

import finetuner
from docarray import Document, DocumentArray

sbert_model = finetuner.build_model('sentence-transformers/msmarco-distilbert-base-v3')

finetuner.encode(sbert_model, product_categories)
finetuner.encode(sbert_model, product_texts)

对于 CLIP,咱们采纳了雷同的步骤,但应用来自同一测试集的产品图像。

import finetuner
from docarray import Document, DocumentArray

clip_text_model = finetuner.build_model('openai/clip-vit-base-patch32', select_model='clip-text')
clip_vision_model = finetuner.build_model('openai/clip-vit-base-patch32', select_model='clip-vision')

finetuner.encode(clip_text_model, product_categories)
finetuner.encode(clip_vision_model, product_images)

Baseline 后果

咱们通过计算零碎返回的前 20 个查问后果的 MMR@20 来评估三个搜寻零碎的性能:

这个后果并不令人诧异。CLIP 是间接将文本查问与图像进行比拟,而不是将查问与文本形容比拟,所以性能比 BM25 差。尽管 CLIP 是间接比拟文本查问与图像,然而它的 MRR@20 只是比 BM25 略低一点,这恰好阐明了 CLIP 的弱小之处。尽管如此,咱们能够预料到单纯的图像驱动的搜寻零碎很难满足事实用例的需要。

SBERT 基于神经办法进行文本搜寻,均匀性能比 BM25 更好。在这个数据集中,咱们能够看出相比于图像信息,文本信息为搜寻零碎提供了更好的性能。

混合后果

这里应用的混合搜索引擎的具体实现,包含代码,请查看 Colab Notebook。你能够应用本人的数据和用例尝试运行,看看这是否是适宜的解决方案。咱们应用雷同的测试数据,对混合搜寻计划进行了雷同的测试。咱们将三个搜寻零碎两两组合,而后将三个搜寻零碎组合在一起,实现了测试。最终,结果显示混合搜寻零碎的性能完胜繁多搜寻零碎:

混合搜寻模型都比独自的搜寻零碎性能更好。

这些结果显示出了混合搜寻办法的后劲,最大的晋升来自于两个独自得分最差的模型: 混合 BM25 和 CLIP,得分从约 30% 进步到 41%,这阐明文本和图像搜寻是互补的。然而,与独自的 SBERT 搜寻零碎相比,SBERT + CLIP+ BM25 办法的晋升并不显著,MMR 从 49% 的进步到了 53%,晋升了 8%。

微调

微调是利用新工作的训练数据对预训练模型进一步训练,从而进步预训练模型的性能,适应于特定工作。Jina AI Finetuner 是一款可能简化神经网络微调流程的工具,它通过解决云上的操作复杂性和物理基础架构,使得微调神经网络更容易,更高效。咱们从 XMarket 数据集中抉择了 1000 项作为测试数据,并利用剩下约 15000 项数作为训练数据来微调 SBERT 和 CLIP。

💡 训练集中只蕴含测试集中的局部类别,没有产品。

Jina AI Finetuner 通过训练神经网络使得属于一类的文本的输入向量更靠近,不属于一类的输入向量间隔更远。对于 SBERT,首先从训练集中提取出产品题目、产品描述和类别名称。微调的目标是,通过训练 SBERT,使其可能辨认同一类别的产品名称和形容,并且匹配它们的类别标签。为此,咱们须要基于该信息,利用训练数据构建用于微调 SBERT 的 DocumentArray 对象,如 Jina AI Finetuner 文档中所述。

import finetuner

# login to finetuner api
finetuner.login()

# create and submit SBERT finetuning job
sbert_run = finetuner.fit(
    model='sentence-transformers/msmarco-distilbert-base-v3',
    train_data=sbert_train_data,
    epochs=3,
    batch_size=64,
    learning_rate=1e-6,
    cpu=False,
)

# Wait for the run to finish!

finetuned_sbert_model = finetuner.get_model(sbert_run.artifact_id)

而后,提取成对的产品图像和类别名称,用雷同的步骤结构用于微调的 CLIP DocumentArray 对象,其目标是通过训练模型使得类别名称向量和图像向量的间隔更近。

# create and submit CLIP finetuning job
clip_run = finetuner.fit(
    model='openai/clip-vit-base-patch32',
    loss='CLIPLoss',
    train_data=clip_train_da,
    epochs=3,
    batch_size=128,
    learning_rate=1e-6,
    cpu=False
)
​
# Wait for the run to finish!
​
finetuned_clip_text_model = finetuner.get_model(clip_run.artifact_id, select_model='clip-text')
finetuned_clip_vision_model = finetuner.get_model(clip_run.artifact_id, select_model='clip-vision')

在所有的搜寻零碎中,咱们都看到了微调后 MMR\@20 的显著晋升,其中微调后的 CLIP 体现突飞猛进。对于应用所有三种技术的混合搜寻,绝对改良超过 12%。

💡 基于神经网络的 AI 搜寻技术的益处在于可能利用本人的数据集微调与训练模型,从而适应于特定工作。

为什么混合搜寻如此高效呢?

很显著,混合搜寻的成果很好,然而仅仅看定量指标还不能充分体现每个组件带来的改良。例如,对于查问“CD-RW 光盘”,BM25 对标注为“Verbatim CD-RW 700MB 2X-12X 可重写媒体光盘 – 25 包 主轴”的产品给出了很高的分数,这是正确的。

然而,SBERT 却被一段很长的形容文本误导了,这个形容中蕴含了许多与搜索词相干的术语:

因为 CLIP 模型依赖于视觉相似性,所以它很难辨别“CD-RW 光盘”和其余类型的光盘。如果去掉标签文本,对人类来说,它们也是截然不同的。CLIP 模型给出了最高排名,这个和用户查找的产品显然不相符:

当查问输出与形容不匹配,但与产品图片的可视化剖析匹配时,CLIP 表现出色。例如,查问“耳塞式耳机”与文本标签“Maxell 190329 便携式轻型脑后缩短舒服柔软触感橡胶记忆颈带立体声线颈带头塞 – 银色”不匹配。但它却和下图匹配:

CLIP 给这款产品打了高分,因为 CLIP 依据产品外观,正确地将其辨认为“耳塞”。SBERT 和 BM25 都错过最佳匹配,将他们最高的分数给了像传统的“耳罩式”耳机:

SBERT 在产品领有良好的文本信息的状况下表现出色,即便匹配不是准确的。例如,查问“光纤电缆”SBERT 返回的匹配后果见下图:

相比之下,CLIP 对于这个查问却起不到任何作用,因为它无奈从视觉上与其余电缆辨别,辨认出光纤电缆,CLIP 返回的最佳匹配产品如下:

将 Hybrid Vigor 融入你的搜寻零碎

即便是在洁净的视觉数据和具体的形容的状况下,基于文本检索技术与 AI 驱动的神经检索相结合的混合搜寻,也比独自的搜寻技术成果更好。事实中的大多数用例都不现实,形容不精确、不充沛或齐全缺失,商品图片品质差或不存在的状况经常出现。当用户输出准确的文本查问时,他们心愿搜寻零碎返回称心的后果。所以这三种技术缺一不可,它们对于满足用户需要,返回良好的匹配后果必不可少。

基于 Jina AI 的框架,将搜寻后果与针对具体用例的微调相结合,用户能够搭建开箱即用的高质量的搜寻利用。Jina AI 在前行的路上步履不停,咱们致力于通过直观的 Python 框架和 NoCode 解决方案,为用户提供最先进的云原生神经 AI 平台。如有任何疑难,欢送退出咱们的  Slack 社区 来分割咱们。

作者简介
Michael Günther,Jina AI ML ScientistScott Martens,Senior Evangelist
译者简介
吴书凝,Jina AI 社区贡献者
原文链接
https://jina.ai/news/hype-and-h

正文完
 0