Zilliz 2024年11月21日
套娃嵌入:如何优化向量搜索成本,并兼顾延迟与召回
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

套娃嵌入是一种新颖的向量表示方法,它允许在单个向量中包含多尺度的信息,类似于俄罗斯套娃。这种方法可以有效地降低向量搜索的存储和计算成本,同时保持较高的召回率和精度。通过截断嵌入的不同部分,我们可以根据特定任务的需求调整精度和速度,例如,在快速搜索时使用较短的嵌入,而在需要高精度时使用完整的嵌入。此外,结合漏斗搜索策略,套娃嵌入可以显著加速相似性检索,并在不同应用场景下提供灵活的性能调节能力。

🤔 **套娃嵌入的概念:**套娃嵌入类似于俄罗斯套娃,在一个向量中嵌套多尺度的信息,模型将更重要的信息存储在前面维度,不太重要的信息存储在后面维度,每个嵌套子集都是一个性能不错的嵌入,长度越长,性能越好。

🚀 **加速相似性检索:**套娃嵌入可以用于加速相似性检索,通过查询数据库嵌入的较小子集(例如前1/32维度),在更小的空间中构建索引,并保留大部分相似性信息,从而减少搜索时间。

🔍 **漏斗搜索策略:**结合漏斗搜索,套娃嵌入可以进一步提升检索效率,通过逐步增加嵌入维度,缩小候选范围,最终获得更精准的结果,显著加速搜索速度,同时保持高召回率。

⚙️ **训练套娃嵌入:**训练套娃嵌入可以通过修改BERT模型的损失函数来实现,将原始损失在输入的递归子集上进行加权求和,从而学习多尺度表示。

💡 **Milvus支持套娃嵌入:**Milvus可以无缝支持套娃嵌入模型,用户可以使用预训练的套娃嵌入模型,例如来自OpenAI、Nomic和阿里巴巴的模型,并结合Milvus进行向量搜索。

原创 和你一起进步的 2024-11-21 18:30 上海

允许开发人员在不牺牲语义完整性的情况下创建更精巧的嵌入。

01.

什么是套娃嵌入?

在构建高效的向量搜索系统时,一个关键挑战是如何在存储成本可控的情况下,同时保持延迟和召回率在可以接受的范围。

通常来说, embedding模型可以生成数百甚至上千维度的向量,使得原始向量和索引在创建过程中产生了显著的存储和计算成本。

对此,我们可以在构建索引之前,通过量化或降维的方法来减少存储需求。例如,我们可以通过使用乘积量化(PQ)降低精度或使用主成分分析(PCA)的方式,来降低维度数量进而节省存储,同时保持向量之间的语义关系。

但以上方法,仅适用于在单一尺度上一次性降低精度或维度。如果我们要保持多尺度细节,构建起一个类似金字塔的层级结构时,我们要怎么办?

套娃嵌入应运而生。

这个方法以俄罗斯套娃命名(见插图),其特点是在单个向量中嵌入了多尺度的表示。

俄罗斯套娃嵌入模型的这一特点允许我们截断模型产生的原始 (长) 嵌入,同时仍保留足够的信息以在下游任务上保持不错的性能。

并且,与传统的后处理方法不同,套娃嵌入在初始训练过程中就学习了这种多尺度结构。它主要通过这种工作方式:模型可以将更重要的信息存储在前面的维度中,将不太重要的信息存储在后面的维度中,而且每个嵌套的子集前缀(前一半、前四分之一等)都是一个性能不错的嵌入,当然长度越长,性能更好。

图:具有多层细节的套娃嵌入的可视化

这种方法与传统嵌入形成鲜明对比,后者只能以原始长度进行使用,将其截断使用会导致其完全无法使用。有了套娃嵌入,我们就可以选择对于场景合适的长度,以平衡特定任务的精度和计算成本。

比如需要快速完成相似性搜索,就使用最小的“娃娃”。需要最大精度,就使用完整嵌入。这种灵活性使得它们对于适应不同性能要求或资源限制的系统特别有价值。

02.

推理

套娃嵌入的一个典型应用场景是在不牺牲召回率的情况下加速相似性检索。通过查询数据库嵌入的较小子集(例如其维度的前1/32),我们可以在这个删繁就简的空间中构建索引,并保留大部分相似性信息。并且,这个较小嵌入空间的初始结果依然是可以直接使用的。

图:漏斗搜索如何与套娃嵌入一起工作

此外,关于如何保持准确性的同时加速相似性搜索,我们可以使用“漏斗搜索”方法。首先,我们仅使用嵌入维度的前1/32执行初始相似性搜索,生成广泛的候选项目池。然后,我们使用前1/16个维度根据它们与查询的相似性重新排名这些候选项,进一步缩小候选项目池。这个过程不断重复迭代,我们使用的嵌入维度子集(1/8、1/4等)也随之越来越精细。

这么操作的意义在于,每一次的漏斗过程都缩小了候选范围,比直接在全维空间中搜索更快、更高效,可以显著加速相似性搜索,同时保留强大的召回率。

03.

训练

接下来我们对技术细节进行展开讲述。

其实方法非常简单。我们可以使用微调BERT模型(https://zilliz.com/learn/what-is-bert?__hstc=175614333.699d1a5626924f2009dc8c37d62d6a55.1726275950381.1732005095119.1732163515928.16&__hssc=175614333.3.1732163515928&__hsfp=2598757901)来进行句嵌入(Sentence Embedding)。为了将已在 masked-token 损失上进行预训练的 BERT 模型转换为句子嵌入模型,我们可以将句子嵌入变成最后一层的平均值,即每个 token 上下文化嵌入的平均值。

通常我们可以将句子嵌入的损失函数记作。它输入一对sentence embeddings,,以及它们期望的相似性得分(公式请参见上面的链接)。现在,为了学习套娃嵌入,我们对训练目标进行了小的修改:

其中,总和是通过计算前一个项输入的一半继续的,直到达到维度下限。作者建议设置

简单来说,套娃损失是原始损失在输入的递归子集上的加权和。

上述方程的一个关键洞见是,套娃损失通过在嵌入模型之间共享权重(同一模型用于编码,例如,)以及在尺度之间共享维度( 的子集)来实现多尺度表示的有效学习。

04.

套娃嵌入和Milvus

Milvus可以无缝支持任何可以通过标准库(如pymilvus. modelsentence-transformers或其他类似工具)加载的套娃嵌入模型。从系统的角度来看,常规嵌入模型和专门训练以生成套娃嵌入的模型之间没有功能差异。

流行的套娃嵌入模型包括:

有关在Milvus中使用套娃嵌入的完整指南,请参阅blog(https://github.com/milvus-io/bootcamp/blob/master/bootcamp/tutorials/quickstart/funnel_search_with_matryoshka.ipynb)

05.

总结

套娃嵌入允许开发人员在不牺牲语义完整性的情况下创建更精巧的嵌入,使它们成为更高效搜索和存储的理想选择。您可以修改现有模型,也可以使用预训练选项,例如来自OpenAIHugging Face的选项。

准备好简化您的搜索功能了吗?立即开始使用Milvus+套娃嵌入!

资源

作者介绍

Stefan Webb

Developer Advocate at Zilliz

王翔宇

Zilliz 算法工程师


推荐阅读


阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

套娃嵌入 向量搜索 相似性检索 嵌入模型 Milvus
相关文章