使用 Sentence Transformers 训练和微调稀疏嵌入模型
Hugging Face 发布了一份详细的技术指南,介绍如何使用 Sentence Transformers 库来训练和微调稀疏嵌入模型(sparse embedding models)。这些模型对于混合搜索场景至关重要,通过提供可解释的高维稀疏表示,在传统的词法方法(如 BM25)和稠密嵌入模型(dense embedding models)之间提供了折中方案。
理解稀疏嵌入模型
稀疏嵌入模型将文本转换为高维向量(例如 30,000+ 维),其中大部分数值为零。与使用大部分数值非零的低维向量的稠密模型不同,稀疏模型将激活的维度映射到模型词表中的特定 token。
核心能力
- 查询与文档扩展: 神经稀疏模型会自动使用语义相关的术语扩展文本(例如,将“天气”扩展为包含“晴朗”或“美丽”),从而解决词汇不匹配问题。
- 可解释性: 由于每个维度都对应一个 token,用户可以通过解码嵌入来查看哪些单词对相似度评分做出了贡献。
- 混合搜索潜力: 当稀疏模型与稠密模型结合使用时,能够同时捕捉精确的词法匹配和语义含义,效果非常出色。
稀疏编码器的架构选项
根据具体的用例,开发者可以从 Sentence Transformers 框架中的几种不同架构中进行选择:
SPLADE
SPLADE 模型利用掩码语言模型(MLM)Transformer,随后接一个 SpladePooling 模块。当向 SparseEncoder 类提供 fill-mask 模型时,这是默认架构。
无推理 SPLADE (Inference-free SPLADE)
该架构使用 Router 模块来分别处理查询和文档。它对查询采用轻量级的 SparseStaticEmbedding 以确保近乎即时的推理,而文档则使用完整的 MLM Transformer 和 SpladePooling 进行处理。这对于对查询延迟要求极高的应用场景非常理想。
对比稀疏表示 (CSR)
CSR 模型在稠密 Sentence Transformer 模型之上应用 SparseAutoEncoder 模块。与 SPLADE 不同,CSR 嵌入的规模并不等同于基础模型的词表,这意味着它们无法通过解码 token 直接解释,但对于高维稠密编码器来说非常有效。
微调工作流
微调允许稀疏模型学习特定领域的术语(例如,识别出“cephalalgia”是“headache”的同义词)。训练过程涉及几个核心组件:
训练组件
- 模型: 预训练的 Sparse Encoder 或基础模型(如 BERT 或 RoBERTa)。
- 数据集: 通过
datasets库从 Hugging Face Hub 或本地文件(CSV、JSON、Parquet 等)加载的数据。 - 损失函数: 如
SpladeLoss或CSRLoss等函数,它们在主损失函数中添加稀疏正则化。 - 评估器: 使用 NDCG、MRR 或 MAP 等指标评估性能的工具。可用的评估器包括
SparseNanoBEIREvaluator和SparseTripletEvaluator。 - 训练器:
SparseEncoderTrainer类,它整合所有组件以执行训练循环。
训练技巧与最佳实践
- 蒸馏: 强大的稀疏模型通常是使用来自更强教师模型(如 Cross-Encoder)的蒸馏来训练的,而不是直接从文本对中训练。
- 稀疏度监控: 不仅要根据检索准确度评估模型,还要评估其嵌入的稀疏度;低稀疏度会增加存储成本和检索延迟。
- 多数据集训练:
SparseEncoderTrainer支持使用MultiDatasetBatchSamplers(例如ROUND_ROBIN或PROPORTIONAL)同时在多个数据集上进行训练。
评估与部署
混合流水线中的性能
实验结果表明,结合稀疏和稠密排序(使用如 Reciprocal Rank Fusion 等方法)的效果显著优于任何单一方法。例如,在 NanoMSMARCO 数据集上,混合方法比仅使用稠密模型的基准线在 NDCG@10 上有大幅提升。
向量数据库集成
对于生产环境部署,稀疏嵌入可以索引在向量数据库中,如 Qdrant、OpenSearch、Elasticsearch 或 Seismic。例如,Qdrant 提供对稀疏向量的原生支持,从而实现大规模的高效语义搜索。