使用 Sentence Transformers 进行多模态嵌入与重排序模型的训练与微调
Hugging Face 发布了一个教程,演示如何使用 Sentence Transformers 库训练和微调多模态嵌入和重排序模型,使用户能够将诸如 Qwen3-VL-Embedding-2B 等模型适配到特定任务,例如视觉文档检索。
为什么要微调多模态模型?
微调将通用多模态模型适配到特定任务,从而显著提升检索性能。基于多样化数据训练的通用模型往往在任何单一任务上表现平平;在视觉文档检索任务中,作者的实验表明,在领域特定数据上微调后,NDCG@10 从 0.888 提升至 0.947,超越了更大的模型。
训练多模态 Sentence Transformers 的关键组件
训练多模态 Sentence Transformer 模型需要六个组件:模型、数据集、损失函数、训练参数、评估器和训练器。该流水线使用与纯文本训练相同的 SentenceTransformerTrainer,唯一的区别在于数据集包含多种模态(文本、图像、音频、视频),且模型的 processor 会自动完成预处理。
多模态训练的模型准备
要微调已有的多模态嵌入模型,可使用 SentenceTransformer 加载,并可选地指定 model_kwargs(用于精度和注意力实现)和 processor_kwargs(用于图像分辨率范围)。或者,也可以从 Vision-Language Model 检查点开始;Sentence Transformers 将尝试推断模态并设置 forward 方法和池化。Transformer 模块会检查 processor 以确定可用的模态,必要时会自动添加 Pooling。可通过 model.modalities 和 model.supports("modality\)) 来验证支持的模态。
多模态训练的数据集要求
数据集格式必须符合损失函数的输入要求。除 “label” 或 “score” 列之外的列均视为输入,其顺序必须与损失函数所需的有效输入数量对应。输入可以是文本(字符串)、图像(PIL 图像、文件路径、URL 或 numpy/torch 数组)、音频、视频,或是将模态名称映射到数值的多模态字典。数据整理器会自动调用 model.preprocess() 进行模态特定的预处理,从而无需手动进行分词或图像处理。
多模态检索的损失函数
对于检索任务,使用 CachedMultipleNegativesRankingLoss,它接受 (query, positive) 对,并支持任意数量的 hard negative 列。该损失函数会提升每个查询与其正例的相似度,同时降低与所有负例的相似度,负例来源于数据集中的 hard negative 以及同一批次中其他样本的 in‑batch negative。 “cached” 变体通过梯度缓存实现大规模有效批次大小,可通过 mini_batch_size 参数进行控制。若希望嵌入在不同维度下均能使用,可将基础损失包装为 MatryoshkaLoss,使模型在截断嵌入至更小维度时仍保持良好性能。
训练参数与配置
使用 SentenceTransformerTrainingArguments 配置训练。多模态训练的关键设置包括:bf16=True,以提升 VLMs 的数值稳定性;batch_sampler=BatchSamplers.NO_DUPLICATES,确保 in‑batch negative 为唯一样本;以及将 per_device_train_batch_size 设置为如 64 的值(由于 CachedMultipleNegativesRankingLoss 的梯度缓存,这在内存上是可行的)。将 eval_strategy、save_strategy 和 logging_steps 设置为分数(例如 0.1),即可在每个 epoch 的 10% 时进行评估、保存和日志记录。
多模态检索的评估设置
使用 InformationRetrievalEvaluator 计算 NDCG@10、MAP、Recall@k 等指标。评估数据从数据集构建:使用整数 ID 映射查询和语料库,为硬负例在语料库中分配偏移 ID 以避免冲突,并将相关文档定义为与每个查询同索引的正文档。评估器接受文本查询、图像语料库(包括硬负例)以及查询到相关文档的映射。在评估时将 batch_size=1,以防止大型 VLMs 的显存溢出。
训练过程与结果
训练脚本通过 SentenceTransformerTrainer 将模型、数据集、损失、参数和评估器整合在一起。相较于纯文本训练的差异包括:在模型加载时传入 model_kwargs 和 processor_kwargs;使用 mini_batch_size=1 的 CachedMultipleNegativesRankingLoss 来管理显存;以及使用包含图像语料库、文本查询的评估器。在视觉文档检索示例中,对 Qwen3-VL-Embedding-2B 进行一次 epoch 的微调后,在评估集上达到了 NDCG@10 为 0.947,优于基线模型的 0.888,并超越了所有测试的 VDR 模型,即使是体积高达 4 倍的模型。Matryoshka 训练使得在更低维度下仍保持强劲表现:微调模型在 64 维(相当于完整 2048 维的 32 倍压缩)时仍保留超过 92% 的峰值 NDCG@10。
训练多模态重排序模型
使用 CrossEncoderTrainer 和针对 Cross Encoder 的损失函数微调多模态 Cross Encoder(重排序)模型。该流程与嵌入模型训练类似,只是使用 CrossEncoder 替代 SentenceTransformer,并采用相应的损失函数,如 BinaryCrossEntropyLoss。架构选择包括 Any-to-Any 搭配 LogitScore(使用多模态语言模型生成 token 并计算对数几率)或 Feature Extraction 结合 Pooling 与 Dense(提取最后一个 token 的隐藏状态并映射为分数)。训练示例可在 Sentence Transformers 仓库中找到。
其他资源
Sentence Transformers 仓库提供了多模态训练示例:Visual Document Retrieval、Multimodal Reranker(Any-to-Any)以及 Multimodal Reranker(Feature Extraction)。文档涵盖了训练概览、损失函数、数据集处理以及 API 参考。配套博客文章讨论了多模态推理、纯文本嵌入与重排序训练、稀疏编码器训练、Matryoshka 嵌入、静态嵌入、嵌入量化以及多语言 Visual Document Retrieval。