仅用于站内搜索,没有排版格式,具体信息请跳转上方微信公众号内链接
今天看到SentenceTransformersv5. 0集成了许多稀疏嵌入模型。为了搞清楚什么稀疏嵌入模型以及应用,查到了SPLADE,比较巧合的是在paperreading分享的时候看到有同学分享了一片ACL2025的工作也是基于SPLADE去做的。下面结合一些资料分享关于SPLADE在稀疏向量搜索中的原理以及应用。
主要内容来自:https ://www. pinecone.io/learn/splade/
在现代向量搜索出现之前,我们主要采用“传统”的词袋模型(BagofWords,BOW)方法。基于这些方法,我们将待检索的文档(例如谷歌的网页)转化为一个词集(即词袋),进而生成一个表示词频的稀疏向量。TF-IDF和BM25是其中典型的算法。
稀疏向量因其高效性、可解释性和精确的词语匹配特性,在信息检索领域曾广受欢迎。然而,它们远非完美。
稀疏向量搜索的工作方式与人类的自然表达存在脱节。我们在搜索信息时,通常很难预测目标文档中会包含哪些确切的词语。
稠密嵌入模型(DenseEmbeddingModels)在这方面提供了一定的帮助。利用稠密模型,我们可以基于“语义含义”进行搜索,而非仅仅依赖于词语匹配。然而,这些模型仍然有不足之处。
稠密嵌入模型需要大量数据进行微调(fine-tune),否则其性能可能不如稀疏方法。这对于难以获取数据且领域特定术语很重要的小众领域来说,是一个棘手的问题。
过去曾涌现出各种临时性的补救方案来应对这些挑战,包括复杂且(仍然不完美)的两阶段检索系统,以及查询和文档扩展或改写方法(我们将在后文探讨)。然而,这些方案都未能提供真正鲁棒、持久的解决方案。
幸运的是,该领域已取得显著进展,有望结合两者的优势。通过混合搜索(HybridSearch)技术,稀疏和稠密检索得以融合;而可学习的稀疏嵌入(LearnableSparseEmbeddings)则有助于克服传统稀疏检索的不足。
本文将深入探讨可学习稀疏嵌入领域的最新进展——SPLADE(SparseLexicalandExpansionmodel)模型[ 1]。
在信息检索中,向量嵌入(VectorEmbeddings)将文档和查询表示为数值向量格式。这种格式使得我们能够在向量数据库中通过计算相似度来检索相似的向量。
稀疏向量和稠密向量是向量表示的两种不同形式,各有优缺点。
稀疏向量包含很多零值,非零值比例非常小。
TF-IDF或BM25等稀疏向量具有高维度,但包含的非零值非常少(因此得名“稀疏”)。稀疏向量已有数十年的研究历史,由此产生了紧凑的数据结构和许多专门针对这类向量设计的高效检索算法。
稠密向量维度较低,但包含丰富信息,大多数或全部维度都包含非零值。这些向量通常由神经网络模型(如Transformer)构建,因此能够表示更抽象的信息,例如文本的语义含义。
总的来说,这两种方法的优缺点可以概括如下表:
稀疏检索
通常检索速度更快
性能无法相比基线显著提升
具有良好的基线性能
性能无法相比基线显著提升
不需要模型微调
存在词汇不匹配问题
词汇精确匹配
密集检索
通过微调可以超越稀疏检索性能
需要训练数据,在低资源场景下较困难
可以搜索类似人类的抽象概念
泛化能力不强,特别是对于细分术语
支持多模态(文本、图像、音频等)和跨模态搜索(如文本到图像)
比稀疏检索需要更多计算和内存资源
无法精确匹配
不易解释
理想情况下,我们希望结合两者的优势,但这很难实现。
一种常见的处理方法是实现两阶段检索和排序系统(Two-stageRetrievalandRanking)。在这种方案中,系统使用两个不同的阶段来检索和排序与给定查询相关的文档。
在第一阶段,系统使用稀疏检索方法召回大量候选文档。然后,这些文档被传递到第二阶段,使用稠密模型根据它们与查询的相关性重新排序结果。
两阶段检索系统包含一个稀疏检索器和一个稠密重排序器。
这种方法有一些优点:(1)对完整的文档集应用稀疏模型进行召回更高效;(2)对召回后较小的文档集使用较慢的稠密模型进行重排序可以更准确。通过这种方式,我们可以向用户返回更相关的结果。另一个优点是,重排序阶段与检索系统是分离的,这对于多用途的检索系统很有帮助。
然而,它并非完美。两阶段的检索和重排序可能比使用近似搜索算法的单阶段系统要慢。拥有两个阶段会带来更高的工程复杂性。最后,系统的性能依赖于第一阶段检索器能否返回相关的结果;如果第一阶段未能召回有用的内容,第二阶段的重排序也无济于事。
由于两阶段检索存在固有的不足,大量研究致力于改进单阶段检索系统。
单阶段检索系统。注意,检索器可以是稀疏、稠密,甚至两者兼具。
这方面的研究成果之一就是更鲁棒、更可学习的稀疏嵌入模型——其中性能最优的模型之一就是SPLADE。
SPLADE(SparseLexicalandExpansionmodel)模型的理念是:一个预训练语言模型(如BERT)可以识别词语/子词(在本文中称为“词片段”或“词项”)之间的联系,并利用这些知识来增强我们的稀疏向量嵌入。
这通过两种方式实现:它允许我们为不同词项赋予相关性权重(例如,“the”这样的词项权重较低,而“orangutan”等不常用词权重较高);同时,它支持词项扩展(TermExpansion):包含除原始文本中出现词项之外的、相关但不同的备选词项。
词项扩展允许我们识别相关但不同的词项,并在稀疏向量检索步骤中使用它们。
SPLADE最显著的优势在于它能够学习词项扩展,而非仅仅执行词项扩展。传统方法需要基于规则进行词项扩展,这既耗时又本质受限。而SPLADE可以利用最优秀的语言模型来学习词项扩展,甚至可以根据句子的上下文对其进行微调。
尽管查询和文档包含许多相关的词项,但由于它们不是“精确匹配”,因此未能被识别。
词项扩展对于缓解词汇不匹配问题至关重要——这是查询和相关文档之间典型缺乏词项重叠的现象。
通过对查询进行词项扩展,我们将获得更大的重叠度,因为现在能够识别相似的词语。
由于语言的复杂性以及描述同一事物的多种方式,相关文档与查询之间可能存在很少甚至没有词项重叠,这是可以预期的。词项扩展正是为了解决这一问题。
SPLADE构建稀疏嵌入的过程是易于理解的。我们首先使用一个带有掩码语言模型(Masked-LanguageModeling,MLM)头的Transformer模型,例如BERT。
MLM是许多Transformer常用的预训练方法。我们可以直接使用一个现成的预训练BERT模型。###BERT模型介绍
如前所述,我们将使用带有MLM头的BERT模型。如果您熟悉BERT和MLM,那很好;如果不熟悉,下面我们将进行分解。
BERT是一种流行的Transformer模型。与所有Transformer一样,其核心功能是生成信息丰富的词元嵌入(TokenEmbeddings)。这具体意味着什么呢?
词元ID被映射到嵌入矩阵中学习到的词元嵌入。
这些词元会与一个“嵌入矩阵(EmbeddingMatrix)”相匹配,嵌入矩阵是BERT模型的第一层。在这个嵌入矩阵中,我们可以找到学习到的“向量嵌入(VectorEmbeddings)”,它们是这些词语/子词词元的“数值表示”。
嵌入矩阵中的向量在有意义的向量空间中分别代表一个词元。
接下来,原始文本的词元表示会通过多个“编码器块(EncoderBlocks)”。这些编码器块基于文本的其余上下文,将越来越多的上下文信息编码到每个向量嵌入中。
在此之后,我们就得到了Transformer的“输出(Output)”:信息丰富的向量嵌入。每个嵌入都代表了先前的词元,但融入了从原始句子中提取的其他词元向量嵌入中获取的信息。
通过多个注意力编码器块处理初始词元嵌入,可以编码更多上下文信息,从而生成信息丰富的嵌入。
这个过程是BERT和其他所有Transformer模型的核心。然而,Transformer的强大之处在于,这些信息丰富的向量可以用于众多不同的任务。通常,我们会给Transformer添加一个任务特定的“头(Head)”,将这些向量转换为其他形式,例如预测结果或稀疏向量。
MLM头是BERT模型常用的众多“头”之一。与大多数头不同,MLM头用于BERT的初始预训练阶段。
可以使用[ MASK]词元屏蔽任何词语或子词词元。
这个经过掩码处理的词元序列作为输入传递给BERT。在另一端,我们将原始句子提供给MLM头。然后,对BERT和MLM头进行优化,使其能够预测被[ MASK]词元替换的原始词语/子词词元。
MLM头从每个输出logits生成一个概率分布。这些概率表示对词汇表中每个词元代表[ MASK]的预测。
为实现这一功能,MLM头为每个词元位置输出30522个值。这30522个值代表BERT的词汇表大小,并构成一个在词汇表上的概率分布。激活度最高的值对应的词元,即为该词元位置的词元预测结果。
这30522个概率分布wijw{ij}wij指示了词汇表VVV中哪些词语/词元jjj最为重要。MLM头为模型输入的每个词元iii输出这些分布。
MLM头为每个词元(无论是否被掩码)提供一个概率分布。这些分布被聚合起来,得到重要性估计。
SPLADE将所有这些概率分布聚合成一个单一的分布,称为重要性估计(ImportanceEstimation)wjw\jwj。这个重要性估计就是SPLADE生成的稀疏向量。我们可以将所有这些概率分布组合成一个单一的分布,它告诉我们词汇表中的每个词元与输入句子的相关性。
其计算公式如下:
其中:
:表示输入词元集合中的每一个词元。
:表示对于每个词元,模型预测的词汇表中所有词元的权重值。
这使得我们能够识别输入句子中不存在但相关的词元。例如,如果我们掩码了词语rainforest(雨林),模型可能会对jungle(丛林)、land(土地)和forest(森林)等词返回较高的预测概率。这些词语及其相关的概率随后会在SPLADE构建的稀疏向量中得到体现。
这种“学习到的”查询/文档扩展能力,即包含其他相关词项的能力,是SPLADE相较于传统稀疏方法的一个关键优势。它基于学习到的词项关系和上下文,帮助我们最大程度地缓解词汇不匹配问题。
查询中的词项扩展可以大大增加查询与相关文档之间的重叠度,从而帮助我们缓解词汇不匹配问题。
由于许多Transformer模型都使用MLM进行预训练,因此有大量模型在预训练阶段学习了MLM头的权重,这些权重可以用于后续的SPLADE微调。
SPLADE是缓解稀疏向量方法常见词汇不匹配问题的一种优秀方法。然而,我们还需要考虑它的一些局限性。
相较于其他稀疏方法,使用SPLADE进行检索速度相对较慢。这主要有三个原因:
SPLADE查询和文档向量中的非零值数量通常多于传统稀疏向量,而现有的稀疏检索系统并未针对这一点进行优化。
非零值的分布偏离了传统稀疏检索系统所预期的分布,这也会导致速度变慢。
大多数稀疏检索系统不原生支持SPLADE向量,这意味着我们必须执行多步预处理和后处理,例如权重离散化等。
幸运的是,所有这些问题都有解决方案。针对原因(1),SPLADE的作者在模型的后续版本(SPLADEv2)中解决了这个问题,该版本最小化了查询向量中的非零值数量[ 2]。
减少查询向量中的非零值数量是通过两个步骤实现的。首先,通过对原始池化策略进行最大池化(MaxPooling)修改,提高了SPLADE文档编码的性能:
wj=maxi∈tlog(1+ReLU(wij))w\j=max{i\int}log(1+ReLU(w{ij}))wj=maxi∈tlog(1+ReLU(wij))
其次,将词项扩展仅限于文档编码。得益于改进后的文档编码性能,即使去掉了查询扩展,性能依然优于原始的SPLADE模型。
原因(2)和(3)则可以通过使用Pinecone向量数据库解决。(2)的解决方案在于Pinecone的检索引擎从头设计时就不依赖数据分布。Pinecone支持实数值的稀疏向量,这意味着SPLADE向量天然就能得到支持。
首先,安装所有必需的库:
接下来,我们可以创建一个输入文档文本text,对其进行词元化,并通过model处理,以生成MLM头的输出logits。
我们得到了91个概率分布,每个分布的维度是30522。要将其转换为SPLADE稀疏向量,我们执行以下操作:
由于我们的向量是稀疏的,我们可以将其转换为更紧凑的字典格式,只保留非零值的位置和权重。
{1000:0. 6246446967124939,1039:0. 45678916573524475,1052:0. 3088974058628082,1997:0. 15812619030475616,1999:0. 07194626331329346,2003:0. 6496524810791016,2024:0. 9411943554878235,…,29215:0. 3594200909137726,29278:2. 276832342147827}
现在我们可以看到稀疏向量中得分最高的词元,包括一些重要的领域特定词项,如programmed(编程的)、cell(细胞)、lattice(晶格)、regulated(被调节的)等等。
我们仍然需要使用HuggingFace分词器对输入文本进行词元化以获取tokens,然后使用以下代码创建稀疏向量:
这些嵌入可以像之前使用HuggingFace和PyTorch方法那样,被处理成一个更小的稀疏向量字典。最终得到的数据是相同的。
让我们看看如何实际比较我们的稀疏向量。我们将定义三个短文本。
像之前一样,我们使用tokenizer对所有文本进行编码,使用model生成输出logits,并将词元级别的向量转换为单一的稀疏向量。
现在我们得到了三个30522维的稀疏向量。为了比较它们,我们可以使用余弦相似度(CosineSimilarity)或点积(DotProduct)计算。使用余弦相似度,我们执行以下操作:
最终得到以下相似度矩阵:
使用上面计算出的相似度值生成的相似度热力图。句子1和句子2共享最高的相似度(对角线除外,它们代表每个句子与自身的比较)。
可以看到,两个内容相似的句子(句1和句2)的相似度得分自然高于与第三个不相关句子(句3)的相似度得分。
—以上便是对SPLADE学习型稀疏嵌入的介绍。通过SPLADE,我们可以使用高效的稀疏向量嵌入来表示文本,有助于解决词汇不匹配问题,同时兼顾精确词语匹配的能力。
我们也探讨了SPLADE在传统检索系统中的局限性,以及SPLADEv2和Pinecone这类数据分布无关检索系统如何克服这些问题。
该领域仍有许多工作可以开展。更多的研究和近期成果表明,结合稠密和稀疏表示的混合搜索(HybridSearch)索引能带来更多优势。通过这些以及其他众多进展,我们可以看到向量搜索正变得越来越精确和易用。
添加微信,备注”LLM“进入大模型技术交流群
如果你觉得这篇文章对你有帮助,别忘了点个赞、送个喜欢
/作者:致Great