使用 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(用於影像解析度範圍)。亦可從視覺語言模型的 checkpoint 開始;Sentence Transformers 會嘗試推斷模態並設定 forward 方法與 pooling。Transformer 模組會檢查 processor 以確定可用的模態,必要時會自動加入 Pooling。可透過 model.modalitiesmodel.supports("modality") 來驗證支援的模態。

多模態訓練的資料集需求

資料集格式必須符合損失函式的輸入需求。除「label」或「score」之外的欄位皆為輸入,且其順序必須與損失函式所需的有效輸入數量相符。輸入可以是文字(字串)、影像(PIL 影像、檔案路徑、URL 或 numpy/torch 陣列)、音訊、影片,或是將模態名稱映射到值的多模態字典。資料整理器會自動呼叫 model.preprocess() 處理特定模態的前處理,省去手動分詞或影像處理的步驟。

多模態檢索的損失函式

對於檢索任務,使用 CachedMultipleNegativesRankingLoss,它接受 (query, positive) 配對,並可包含任意數量的 hard negative 欄位。該損失會提升每個 query 與其正例的相似度,同時降低與所有負例的相似度,負例來源包括資料集中的 hard negative 以及同一批次中其他樣本的 in‑batch negative。"cached" 變體透過梯度快取(gradient caching)實現大規模有效批次大小,受 mini_batch_size 參數控制。若要產生在多種維度下皆有效的嵌入,可將基礎損失包裹於 MatryoshkaLoss,該方法訓練模型,使得將嵌入截斷至較小維度時仍保有良好表現。

訓練參數與設定

使用 SentenceTransformerTrainingArguments 來設定訓練。多模態訓練的關鍵設定包括:bf16=True 以提升 VLM 的數值穩定性、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 映射查詢與語料庫,將 hard negative 以偏移 ID 加入語料庫以避免衝突,並將相關文件定義為與每個查詢同索引的正文件。評估器接受文字查詢、影像語料庫(包含 hard negative)以及查詢對相關文件的映射。評估時將 batch_size=1,以避免大型 VLM 記憶體不足的問題。

訓練流程與結果

訓練腳本透過 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 嵌入、靜態嵌入、嵌入量化以及多語言視覺文件檢索。

Sources