You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 16:07:32