使用MultipleNegativesRankingLoss微调sentence-transformers训练停滞问题
用MultipleNegativesRankingLoss微调Sentence-BERT时训练停滞的排查与修复
核心问题梳理
你的代码存在几个关键错误和使用误区,直接导致训练停滞:
- 变量名错误:
model.fit中传入的loader未定义,实际你定义的数据加载器是train_dataloader,这会引发未定义变量错误,修正后才能正常执行。 - 缺失导入:
NoDuplicatesDataLoader需要显式导入,不能直接通过sentence_transformers.datasets调用,需添加导入语句。 - 数据格式不符合MNR Loss逻辑:MultipleNegativesRankingLoss的设计逻辑是每个InputExample必须是一对语义相似的正样本,同批次内的其他样本对会被自动当作负例。你示例中第二个样本是语义不相关的负例对,完全违背了该损失函数的使用要求。
- 数据量与批次不匹配:仅2个训练样本却设置
batch_size=16,导致批次内没有足够样本生成有效负例,损失计算失效,训练自然停滞。
修正后的代码示例
from sentence_transformers import SentenceTransformer, InputExample, losses from sentence_transformers.datasets import NoDuplicatesDataLoader # 加载预训练模型 model = SentenceTransformer('all-mpnet-base-v2') # 所有样本均为语义相似的正样本对 train_examples = [ InputExample(texts=['猫是常见宠物', '家养猫咪温顺可爱']), InputExample(texts=['狗是人类伙伴', '忠诚的犬类伴侣']), InputExample(texts=['深度学习属于AI', '深度神经网络是人工智能分支']), # 需补充至少几十到上百个正样本对,保证批次内负例多样性 # ... 更多正样本对 ] # 初始化损失函数与数据加载器 train_loss = losses.MultipleNegativesRankingLoss(model) train_dataloader = NoDuplicatesDataLoader(train_examples, batch_size=16) # 启动微调(注意变量名匹配) model.fit( train_objectives=[(train_dataloader, train_loss)], epochs=10, warmup_steps=100 )
关键注意事项
- 数据要求:必须全用正样本对,无需手动提供负例,MNR Loss会自动从同批次其他样本中生成负例进行对比学习。
- 批次设置:batch_size不能超过训练样本总数,建议根据样本量设置32、64等合理值,确保每个批次有足够负例供模型学习。
- NoDuplicatesDataLoader作用:该加载器会避免同一正样本对在批次内重复出现,保证负例的多样性,提升训练效果。
内容的提问来源于stack exchange,提问作者pceccon
相关产品推荐
相关产品推荐

