对于目前的研究学习任务需求,需要细粒度的文本查询,以下
Learning-to-Rank 排序学习
让模型从历史数据中自己学习:什么样的候选文本应该排在前面,即训练模型在多路召回为每路分配的权重
LambdaMART,考虑把 A 和 B 的顺序调换,会对 NDCG / MAP 等指标造成多大影响?(Lambdarank)
可以对每个 Query → Candidate 的结构提取几十甚至几百个特征
对于训练数据 QueryA,人工标注:
| Candidate | Label |
|---|---|
| B1 同一段异文 | 4 |
| B2 改写版本 | 3 |
| B3 增补版本 | 2 |
| B4 同一人物但不同事件 | 1 |
| B5 完全无关 | 0 |
以此构造出一个标准的LTR training group
所以 LTR 数据中最好大量使用:BM25/Dense Top-K 中的高分错误结果作为 hard negative。
SPLADE(Sparse Lexical and Expansion model)
让一个 Transformer 自动决定:一段古籍文本中的哪些词应该被“激活”,以及哪些相关但原文没出现的词也应该被激活;最后得到一个高维但稀疏的词权重向量,再用倒排索引进行检索。
模型会为BERT整个词表中的每一个词(约3万个)都计算一个重要性权重。这个过程不仅会给文档中已有的词(如"mac", “cheese”)赋权,还会“扩展”出语义相关的词,比如给"cheese"相关的"dairy"(奶制品)或"food"(食物)也赋予一个较高的权重,以及扩展相似词语。
embedding 模型输出的向量是一个768维的向量,维度大小是根据模型最后输出的全连接层规定的,而 SPLADE 输出的向量是一个稀疏的向量,即绝大多数维度是0,且维度大小是 tokenizer vocabulary 决定的。也就是说dense 索引和 SPLADE 索引在使用时要维护两个不同的向量查询表。
SPLADE(Sparse Lexical and Expansion Model)与 Dense Retrieval 类似,都是通过预训练 Transformer Encoder 将文本映射为可用于检索的向量表示,但二者所构建的表示空间和检索机制存在本质区别。Dense Retrieval 将文本编码为固定维度的稠密连续向量,通过向量间的距离或内积衡量文本整体语义相似度;SPLADE 则利用 Transformer 的词汇预测能力,将文本映射到以词表(vocabulary)为维度的高维稀疏表示空间,每个维度对应一个词项或 token,其数值表示该词项对当前文本的重要程度。
通过稀疏正则化,SPLADE 会抑制大量无关词项,仅保留少量具有较高激活值的词项;同时,由于其词汇扩展机制,模型不仅可以激活原文本中直接出现的 token,还可以根据上下文激活与文本语义相关但未显式出现的词项。因此,SPLADE 在保留词项级匹配可解释性的同时,能够一定程度上缓解传统 BM25 中的词汇不匹配(Vocabulary Mismatch)问题。
因此,从检索粒度来看,Dense Retrieval 更强调文本整体语义空间中的相似性,而 SPLADE 更强调基于词项维度的稀疏匹配与语义扩展。二者并非简单的“句子级”和“词级”对立,而是分别采用不同的表示空间和匹配机制来刻画文本相关性。
问题:SPLADE 到底是怎么从 [batch, seq_len, vocab_size] 的 MLM logits 变成 [batch, vocab_size] 的 sparse representation,以及为什么 ReLU + log(1+x) + max pooling + sparsity regularization 能同时实现“词汇扩展”和“稀疏化”。
SPLADE的向量生成过程是一个从稠密上下文到稀疏语义向量的精确变换。给定输入文档,BERT编码器首先为每个位置生成上下文感知的MLM logits,形状为[batch, seq_len, vocab_size]。随后,模型通过三次关键操作将其压缩为[batch, vocab_size]的文档表示:第一步是ReLU激活函数,将所有负logit硬截断为0,实现初步稀疏化;第二步是log(1+x)对数变换,对保留的正值进行平滑压缩,防止大数值主导后续计算;第三步是在序列长度维度上执行最大池化(Max Pooling),这意味着只要文档中任意一个位置对词表中某个词(无论是否在原文出现)产生正向激活,该词就会被保留在最终的文档向量中。最终,绝大多数维度为0,仅少数关键词及语义扩展词(如“mac”扩展出“dairy”)拥有正权重,形成高效的稀疏向量。
这种设计的精妙之处在于,四重机制协同工作,同时实现了“词汇扩展”和“稀疏化”。词汇扩展源于BERT的MLM预训练能力——模型在预测掩码词时,天然学会将语义相关的词(如“cheese”与“dairy”)在隐空间中关联,而Max Pooling则负责捕获并保留这些跨位置的语义激活,使文档向量能包含原文未出现的相关词。稀疏化则主要依赖ReLU的硬截断和训练时的FLOPS正则化损失,后者会惩罚在整个批次中被过多文档激活的词,迫使模型只保留最必要、最具区分性的关键词,从而抑制噪声扩展。同时,log(1+x)保证了权重分布的平滑性,使得点积分数能够稳定反映文档间的相关性,而非被少数极端值支配。最终,这一表示既能像传统倒排索引那样快速检索,又能像稠密向量那样捕捉深度语义,是SPLADE兼具效率与效果的根本原因。
Multi-vector
Multi-vector 不再强迫一段文本仅转化一个向量,而是让一段文本由多个 token 向量表示,再进行细粒度匹配。由于问题和文档都被转化为多个向量的表示形式,因此又需要维护一种数据的向量表示
对于多个向量,转化出了 MaxSim 算法计算相似度,对于 Query 的每一个 token,只找 Document 中与它最相似的 token。即保留查询中的大量局部语义,然后在文档中逐个寻找最佳匹配。
Hard Negative Mining
Hard Negative Mining 实际上是一种训练策略,在一些样例中,模型认为(这里的认为可以进一步阐释)检索结果与查询文档高度相关,但实际上并不是同一事件。注意,相比于普通负样本,Hard Negative 是“模型找出来的错误”。因此需要把这种错误结果单独标记,并作为训练数据训练。训练后的模型再输出高相关的错误结果之后,同样进行标注和训练,如此迭代。即 HNM 用来构造训练数据,然后对 Dense Retriever 或 SPLADE 这类 embedding/retrieval 模型进行微调(fine-tuning)
DPR(Dense Passage Retrieval) 是一个非常经典的 Dense Retrieval(稠密向量检索)模型/方法,由 Facebook AI Research(现在的 Meta AI)提出。
该种优化策略侧重于对已经具有一定判断鉴别能力的模型进一步的提高,其训练数据通常要使用 Triplet:Anchor / Positive / Negative 格式,即:
1 | { |
SPLADE 的训练也可以直接使用这种 (query, positive, negative) 三元组形式。Sentence Transformers 的 SPLADE 训练示例就明确采用这种 triplet 数据。