
人工智能NLPEmbedding微调【免费下载链接】sentence-transformersState-of-the-Art Embeddings, Retrieval, and Reranking项目地址https://gitcode.com/gh_mirrors/se/sentence-transformers点击查看免费下载本文围绕 sentence-transformers 仓库中 examples/cross_encoder/training/rerankers/README.md 展开系统讲解如何基于 CrossEncoder 架构训练自己的重排序Reranker模型。文章覆盖四种可直接套用的训练脚本、两种核心损失函数的原理与调参、NanoBEIR 评估方法以及完整的模型推理与部署流程。读完本文你将掌握从数据挖掘硬负样本、选择损失函数、配置训练器到评估与发布一个专属 Reranker 的完整技术路径。什么是 Reranker基于 CrossEncoder 的排序模型Reranker 模型通常是具有1 个输出类的 CrossEncoder 模型给定一对文本(query, answer)模型输出一个分数用于衡量该答案能在多大程度上回答该查询。这个分数可以是大约落在-10.0 ~ 10.0区间的浮点数也可以是绑定在0...1区间内的概率值。与先对 query 和 document 分别编码、再计算相似度的双塔Bi-Encoder/SentenceTransformer方案相比CrossEncoder 将查询与文档拼接后一次性送入模型能够建模两者之间的深度交互因此排序精度更高但代价是无法预先缓存文档向量推理成本更高。这正是两阶段检索的经典分工先用高效的嵌入模型召回 Top-K 候选再用 CrossEncoder Reranker 精排。关于两类架构的直观对比可参考仓库中的示意图从 CrossEncoder 模型源码 可以看到它默认以num_labels 1初始化即只输出一个 logitpredict()方法对一批(query, doc)对批量打分而rank()方法则直接对一个查询 一组候选文档给出排序结果按分数降序返回corpus_id与score本文后续的推理示例会用到这两个 API。许多公开的强 Reranker 都基于 MS MARCO 训练相关预训练模型清单与训练示例可参考docs/cross_encoder/pretrained_models.mdMS MARCO 预训练 Cross Encoder 部分examples/cross_encoder/training/ms_marco/README.mdMS MARCO 训练示例但更常见的做法是在你的自有数据上训练 Reranker 往往效果最佳。这正是本页提供四个可改编训练脚本的原因。四个开箱即用的训练脚本总览仓库在examples/cross_encoder/training/rerankers/下提供了四个示例脚本覆盖三种不同的损失函数与两种数据集脚本损失函数数据集数据形态亮点training_gooaq_bce.pyBinaryCrossEntropyLossGooAQ带标注的 (query, passage, label) 对用高效嵌入模型挖掘硬负样本同时评估 NanoBEIR 与 GooAQ 开发集上的重排增益training_gooaq_cmnrl.pyCachedMultipleNegativesRankingLossGooAQ正样本对无需标注用 in-batch negatives GradCache 训练training_gooaq_lambda.pyLambdaLossGooAQ带标注的 list 数据直接优化 NDCG 等排序指标training_nq_bce.pyBinaryCrossEntropyLossNatural Questions (NQ)带标注的 (query, passage, label) 对与training_gooaq_bce.py近乎相同的脚本仅换成更小的 NQ 数据集其中training_gooaq_bce.py与training_nq_bce.py的训练逻辑几乎完全一致唯一差别在于数据源GooAQGoogle 问答数据集规模更大NQNatural Questions相对更小便于在小数据集上快速验证流程。以下逐一深入解析各脚本的实现细节。公共骨架数据准备、模型加载与硬负样本挖掘四个脚本共享同一套加载模型 → 读取数据 → 挖负样本 → 定义损失 → 定义评估器 → 配置训练参数 → 训练 → 评估 → 保存/发布的流程。以training_gooaq_bce.py为例from datasets import load_dataset from sentence_transformers import SentenceTransformer from sentence_transformers.base.evaluation import SequentialEvaluator from sentence_transformers.cross_encoder import CrossEncoder, CrossEncoderModelCardData from sentence_transformers.cross_encoder.evaluation import ( CrossEncoderNanoBEIREvaluator, CrossEncoderRerankingEvaluator, ) from sentence_transformers.cross_encoder.losses import BinaryCrossEntropyLoss from sentence_transformers.cross_encoder.trainer import CrossEncoderTrainer from sentence_transformers.cross_encoder.training_args import CrossEncoderTrainingArguments from sentence_transformers.util import mine_hard_negatives model_name answerdotai/ModernBERT-base train_batch_size 64 num_epochs 1 num_hard_negatives 5 # 每个 (question, answer) 对要挖掘的硬负样本数量 # 1. 加载模型训练时优先用 fp32内存足够的前提下 model CrossEncoder( model_name, model_card_dataCrossEncoderModelCardData( languageen, licenseapache-2.0, model_nameModernBERT-base trained on GooAQ, ), model_kwargs{torch_dtype: float32}, ) print(Model max length:, model.max_length) print(Model num labels:, model.num_labels) # 2. 加载 GooAQ 数据集取前 100k 条切分出 1000 条作为开发集 full_dataset load_dataset(sentence-transformers/gooaq, splittrain).select(range(100_000)) dataset_dict full_dataset.train_test_split(test_size1_000, seed12) train_dataset dataset_dict[train] eval_dataset dataset_dict[test]硬负样本挖掘是训练高质量 Reranker 的关键一步。脚本使用sentence-transformers/static-retrieval-mrl-en-v1这个高效的嵌入模型放在 CPU 上即可作为负样本挖掘器embedding_model SentenceTransformer(sentence-transformers/static-retrieval-mrl-en-v1, devicecpu) hard_train_dataset mine_hard_negatives( train_dataset, embedding_model, num_negativesnum_hard_negatives, # 每个 query-answer 对挖掘几个负样本 absolute_margin0, # query 与负样本的相似度应比 query-正样本低 x0 表示不施加该约束 range_min0, # 跳过最相似的 x 个样本 range_max100, # 只考虑最相似的 100 个候选 sampling_strategytop, # 从候选区间中采样最难的 top 负样本 batch_size4096, # 嵌入模型的批大小 output_formatlabeled-pair, # 输出 (query, passage, label) 格式BinaryCrossEntropyLoss 需要 use_faissTrue, # 使用 FAISS 加速向量检索 )mine_hard_negatives定义在 sentence_transformers/util/hard_negatives.py其关键参数语义如下与源码 docstring 一致range_min负样本候选的最低相似度排名用于跳过与查询最相似的若干文本range_max候选的最大排名用于限制候选规模、控制挖掘成本absolute_margin硬负样本挖掘的绝对间隔即 query-负样本 与 query-正样本 之间至少应差多少相似度sampling_strategytop总是采样最难的 top n 个候选random则在候选区间内随机采样include_positives是否把正样本也纳入候选列表评估用output_format可选triplet、n-tuple、labeled-pair、labeled-list四种分别对应不同损失函数的输入需求。挖掘好的数据集可以用hard_train_dataset.save_to_disk(gooaq-hard-train)落盘下次用load_from_disk直接加载省去重复挖掘的时间。注意使用include_positivesTrue时源码会强制将output_format设为n-tuple以保证排序顺序被保留见 hard_negatives.py同时它会警告你改动range_min/range_max/margin/sampling_strategy等默认值可能把正样本也过滤掉评估场景请谨慎。评估器NanoBEIR 开发集重排增益脚本同时配置了两类评估器并用SequentialEvaluator串行执行# 4a. NanoBEIR轻量级英文重排序评估器 nano_beir_evaluator CrossEncoderNanoBEIREvaluator( dataset_names[msmarco, nfcorpus, nq], batch_sizetrain_batch_size, ) # 4b. 在 GooAQ 开发集上评估重排增益 # 把正样本一并放入候选列表这样评估器能同时报出嵌入模型基线与重排后两套指标 hard_eval_dataset mine_hard_negatives( eval_dataset, embedding_model, corpusfull_dataset[answer], # 用完整数据集作为语料库 num_negatives30, # 每个查询重排 30 篇文档 batch_size4096, include_positivesTrue, output_formatn-tuple, use_faissTrue, ) reranking_evaluator CrossEncoderRerankingEvaluator( samples[ { query: sample[question], positive: [sample[answer]], documents: [sample[column_name] for column_name in hard_eval_dataset.column_names[2:]], } for sample in hard_eval_dataset ], batch_sizetrain_batch_size, namegooaq-dev, always_rerank_positivesFalse, # 更贴近真实场景只重排 BM25/嵌入模型已召回的文档 ) evaluator SequentialEvaluator([reranking_evaluator, nano_beir_evaluator]) evaluator(model) # 先跑一遍基线模型便于对比训练前后的提升NanoBEIR是基于 BEIR 集合裁剪出的轻量版信息检索评估集规模小、跑得快适合在完整评估前快速验证模型检索性能。从 nano_beir.py 的源码可以看到每个数据集只会重排 BM25 排名中的前rerank_k默认 100篇文档返回指标与CrossEncoderRerankingEvaluator一致即MAP、MRRk、nDCGk并按数据集聚合出均值主指标键名格式为NanoBEIR_R{rerank_k}_{aggregate_key}_{metric}默认主指标是NanoBEIR_R100_mean_ndcg10可配合训练参数里的load_best_model_at_endTrue与metric_for_best_model使用未指定dataset_names时默认排除arguana与touche2020其 Argument Retrieval 任务与其他数据集差异较大可用数据集包括climatefever、dbpedia、fever、fiqa2018、hotpotqa、msmarco、nfcorpus、nq、quoraretrieval、scidocs、scifact等。而CrossEncoderRerankingEvaluator见 reranking.py的核心逻辑是对每个 sample 计算[query, doc_i]的分数并按降序排序然后计算MRR10、NDCG10、MAP。每个 sample 必须包含query与positive键并二选一提供negative不相关文档列表或documents包含正样本在内的完整候选列表假定已按相似度排序。当使用documents时评估器会同时报告重排前Base→ 重排后Reranked两套指标——这正是衡量 Reranker 在首阶段检索之上增益的方式。训练参数基于 Hugging Face Trainer 的配置short_model_name model_name.split(/)[-1] run_name freranker-{short_model_name}-gooaq-bce args CrossEncoderTrainingArguments( # 必填 output_dirfmodels/{run_name}, # 训练超参数 num_train_epochsnum_epochs, per_device_train_batch_sizetrain_batch_size, per_device_eval_batch_sizetrain_batch_size, learning_rate2e-5, warmup_steps0.1, fp16False, # 若 GPU 不支持 FP16保持 False bf16True, # 支持 BF16 的 GPU 可开启 dataloader_num_workers2, dataloader_persistent_workersTrue, # Windows/macOS 推荐Linux 可设 False load_best_model_at_endTrue, metric_for_best_modeleval_gooaq-dev_ndcg10, # 以开发集重排 NDCG10 为选优指标 # 日志与保存 eval_strategysteps, eval_steps1000, save_strategysteps, save_steps1000, save_total_limit2, logging_steps200, logging_first_stepTrue, run_namerun_name, # 安装 wandb 后会同步到 WB seed12, )然后组装CrossEncoderTrainer并启动训练trainer CrossEncoderTrainer( modelmodel, argsargs, train_datasethard_train_dataset, lossloss, evaluatorevaluator, ) trainer.train() # 训练结束后再评估一次结果可用于模型卡片 evaluator(model) # 保存最终模型 final_output_dir fmodels/{run_name}/final model.save_pretrained(final_output_dir) # 可选发布到 Hugging Face Hub先运行 huggingface-cli login try: model.push_to_hub(run_name) except Exception: logging.error( fError uploading model to the Hugging Face Hub:\n{traceback.format_exc()} fTo upload it manually, you can run huggingface-cli login, followed by loading the model fusing model CrossEncoder({final_output_dir!r}) and saving it using fmodel.push_to_hub({run_name}). )损失函数一BinaryCrossEntropyLoss简单而强大的点式排序损失BinaryCrossEntropyLoss是一种非常强大却又足够简单的损失。给定成对文本如(query, answer)它让 CrossEncoder 输出预测分数与金标gold或银标silver即用某个模型自动判定的标签对比模型表现越好损失越低。核心实现见 sentence_transformers/cross_encoder/losses/binary_cross_entropy.py其构造参数与输入要求如下model要训练的 CrossEncoder必须初始化 1 个输出标签num_labels 1即默认值否则会抛出ValueErroractivation_fn对 logits 应用激活函数后再算损失默认为nn.Identity()pos_weight正样本的权重必须是torch.Tensor如torch.tensor(4)表示权重 4脚本注释明确建议将pos_weight设为正负样本比例即num_hard_negatives其余**kwargs透传给torch.nn.BCEWithLogitsLoss。forward中输入的两个文本列会被配对为pairs经model.preprocess与batch_to_device后前向得到 logits取view(-1)展开、过activation_fn再交给BCEWithLogitsLoss与标签对比。由于训练数据是mine_hard_negatives(..., output_formatlabeled-pair)产出的带 0/1 标签对天然契合该损失的输入形态# 来自 training_gooaq_bce.py # pos_weight 建议设为正负比例即 num_hard_negatives loss BinaryCrossEntropyLoss(modelmodel, pos_weighttorch.tensor(num_hard_negatives))损失函数二CachedMultipleNegativesRankingLossGradCache 版 InfoNCECachedMultipleNegativesRankingLoss即InfoNCE with GradCache比常见的BinaryCrossEntropyLoss更复杂它接受正样本对(query, answer)或三元组(query, right_answer, wrong_answer)然后为每个查询随机选取num_negatives个批内负样本in-batch negatives——即从 batch 中其他问题的答案中抽取错误答案。随后损失会对所有(query, answer)组合包括刚选出的错误答案计算分数并用 Cross Entropy 损失确保(query, correct_answer)的分数高于所有(query, wrong_answer)。换句话说模型必须在1 个正确答案 若干批内负样本以及可选硬负样本中把正确答案挑出来。该损失采用GradCache方法详见其实现的注释与 cached_multiple_negatives_ranking.py分三步走先用无梯度计算图torch.no_grad快速预测出所有 logits计算损失并只反传到 logits缓存损失关于 logits 的梯度再做一次带梯度的前向通过 backward hook 把缓存的梯度接入反向链。这三步都以mini_batch_size为粒度分批执行从而在不显著增加显存的前提下支持超大 batchbatch 越大批内负样本越多性能通常越好。源码 docstring 也明确指出这是对普通MultipleNegativesRankingLossmultiple_negatives_ranking.py的增强版后者没有这种聪明的 mini-batch 机制、显存开销大代价是 GradCache 版训练略慢原论文估算约牺牲 20% 计算时间。源码中的get_in_batch_negatives展示了批内负样本的具体选取逻辑先构造 mask 屏蔽每个 anchor 自身的正样本与硬负样本再用torch.multinomial从剩余候选中随机抽取num_negatives个。脚本中的典型用法# 来自 training_gooaq_cmnrl.py loss CachedMultipleNegativesRankingLoss( modelmodel, num_negativesnum_rand_negatives, # 每个 query-answer 对使用多少个随机负样本 mini_batch_size16, # 前向的 mini-batch 大小直接影响显存占用 )该损失不需要标注数据只需正样本对因此training_gooaq_cmnrl.py直接使用原始 GooAQ 训练集而不做硬负样本挖掘。训练时推荐配合BatchSamplers.NO_DUPLICATES采样器确保批内负样本不会与 anchor 或正样本重复源码 docstring 的 Recommendations 部分有说明。关于activation_fn与scale的调参源码默认值为nn.Sigmoid()与scale10.0torch.nn.Sigmoidscale10.0效果尚可torch.nn.Identityscale1.0同样可行mGTE 论文作者建议使用torch.nn.Tanhscale10.0。该损失的当前默认值在源码注释中被明确标注为未来可能变动鼓励读者自行实验。损失函数三LambdaLoss面向排序指标的 Listwise 损失LambdaLoss实现的是《The LambdaLoss Framework for Ranking Metric Optimization》Wang et al., CIKM 2018中的 LambdaLoss 框架用于直接优化排序指标。它的输入是list 形态每个查询对应一组文档及其相关性标签二值或连续均可实现见 sentence_transformers/cross_encoder/losses/lambda_loss.py。关键参数weighting_scheme权重方案默认NDCGLoss2PPScheme。可选NoWeightingScheme权重恒为 1、NDCGLoss1SchemeNDCG Loss1论文中表现不如后两者、NDCGLoss2SchemeNDCG Loss2、LambdaRankSchemeLambdaRank优化 NDCG 的粗略上界、NDCGLoss2PPSchemeNDCG Loss2NDCG Loss2 与 LambdaRank 的混合论文中表现最强kNDCGK 考虑的文档数默认None表示使用全部文档sigmasigmoid 中的分数差权重默认 1.0reduction_lognatural自然对数或binary以 2 为底的对数默认binarymini_batch_size每次前向处理的样本数对显存和速度影响显著——None时等于 batch 大小大于 0 时按该值切分 mini-batch小于等于 0 时整批一次前向。脚本中的典型用法# 来自 training_gooaq_lambda.py loss LambdaLoss(modelmodel, mini_batch_sizemini_batch_size)该损失的输入需用mine_hard_negatives(..., output_formatlabeled-list)生成——每个查询对应一个带标签的文档列表这也是training_gooaq_lambda.py与training_gooaq_bce.py在数据准备上的唯一区别output_format从labeled-pair换成labeled-list。从源码forward可以看到LambdaLoss 会先按(query, doc)配对打分再把 logits 与标签重排成矩阵计算 gains、discounts对数位置折扣与 maxDCGs最终按加权概率的对数取负均值作为损失并利用 padding mask 与 NDCGK 截断 mask 只对有效文档对计算。源码 docstring 指出该损失在相同输入格式下经验上通常优于其他损失。推理加载预训练 Reranker 并排序仓库作者用第一个脚本training_gooaq_bce.py训练出了tomaarsen/reranker-ModernBERT-base-gooaq-bce模型。如果你不想自己训练可以直接下载该模型体验推理from sentence_transformers import CrossEncoder # 从 Hugging Face Hub 下载 model CrossEncoder(tomaarsen/reranker-ModernBERT-base-gooaq-bce) # 为文本对打分 pairs [ [how to obtain a teachers certificate in texas?, Some aspiring educators may be confused about the difference between teaching certification and teaching certificates. Teacher certification is another term for the licensure required to teach in public schools, while a teaching certificate is awarded upon completion of an academic program.], [how to obtain a teachers certificate in texas?, [Step 1: Obtain a Bachelor\s Degree. One of the most important Texas teacher qualifications is a bachelor\s degree. ... , \Step 2: Complete an Educator Preparation Program (EPP) ... \, \Step 3: Pass Texas Teacher Certification Exams. ... \, \Step 4: Complete a Final Application and Background Check.\]], [how to obtain a teachers certificate in texas?, Washington Teachers Licensing Application Process Official transcripts showing proof of bachelors degree. Proof of teacher program completion at an approved teacher preparation school. Passing scores on the required examinations. Completed application for teacher certification in Washington.], [how to obtain a teachers certificate in texas?, Teacher education programs may take 4 years to complete after which certification plans are prepared for a three year period. During this plan period, the teacher must obtain a Standard Certification within 1-2 years. Learn how to get certified to teach in Texas.], [how to obtain a teachers certificate in texas?, In Texas, the minimum age to work is 14. Unlike some states, Texas does not require juvenile workers to obtain a child employment certificate or an age certificate to work. A prospective employer that wants one can request a certificate of age for any minors it employs, obtainable from the Texas Workforce Commission.], ] scores model.predict(pairs) print(scores) # [0.00121048 0.97105724 0.00536712 0.8632406 0.00168043]可以看出模型对包含Step 1/2/3/4 得克萨斯教师资格认证步骤的答案给出了接近 0.97 的高分对得州最低工作年龄这类跑题答案给出了接近 0 的低分。更常见的场景是对单一查询的一组候选文档排序此时使用rank()方法# 对与单个文本最相似的若干文本进行排序 ranks model.rank( how to obtain a teachers certificate in texas?, [ [\Step 1: Obtain a Bachelors Degree. One of the most important Texas teacher qualifications is a bachelors degree. ... \, Step 2: Complete an Educator Preparation Program (EPP) ... , Step 3: Pass Texas Teacher Certification Exams. ... , Step 4: Complete a Final Application and Background Check.], Teacher education programs may take 4 years to complete after which certification plans are prepared for a three year period. During this plan period, the teacher must obtain a Standard Certification within 1-2 years. Learn how to get certified to teach in Texas., Washington Teachers Licensing Application Process Official transcripts showing proof of bachelors degree. Proof of teacher program completion at an approved teacher preparation school. Passing scores on the required examinations. Completed application for teacher certification in Washington., Some aspiring educators may be confused about the difference between teaching certification and teaching certificates. Teacher certification is another term for the licensure required to teach in public schools, while a teaching certificate is awarded upon completion of an academic program., In Texas, the minimum age to work is 14. Unlike some states, Texas does not require juvenile workers to obtain a child employment certificate or an age certificate to work. A prospective employer that wants one can request a certificate of age for any minors it employs, obtainable from the Texas Workforce Commission., ], ) print(ranks) # [ # {corpus_id: 0, score: 0.97105724}, # {corpus_id: 1, score: 0.8632406}, # {corpus_id: 2, score: 0.0053671156}, # {corpus_id: 4, score: 0.0016804343}, # {corpus_id: 3, score: 0.0012104829}, # ]rank()返回按分数降序排列的{corpus_id, score}列表可直接与首阶段检索如 SentenceTransformer 嵌入检索串联成两阶段 pipeline。predict()与rank()的完整签名均可参考 sentence_transformers/cross_encoder/model.py 与 model.py#L641。小结与选型建议综合以上内容为自有数据选择 Reranker 训练方案时可参考如下路线数据形态决定损失只有正样本对 → 首选CachedMultipleNegativesRankingLoss配合mini_batch_size控制显存实验activation_fn与scale有标注的成对数据 →BinaryCrossEntropyLoss记得用mine_hard_negatives挖硬负样本并把pos_weight设为正负比例有查询 文档列表 标签的 list 数据 →LambdaLoss直接优化 NDCG 类指标评估先行用CrossEncoderNanoBEIREvaluator在msmarco/nfcorpus/nq等 NanoBEIR 子集上快速验证并用CrossEncoderRerankingEvaluator在自有开发集上对比重排前 → 重排后的指标增益训练参数建议bf16TrueGPU 支持时、load_best_model_at_endTrue配合metric_for_best_modeleval_dev-name_ndcg10自动选优检查点通过save_total_limit控制数量发布与部署save_pretrained保存本地push_to_hub发布到 Hub推理时用predict()批量打分、rank()直接排序衔接首阶段检索构成完整的两阶段检索系统。所有脚本均可直接运行python examples/cross_encoder/training/rerankers/training_gooaq_bce.py依次类推其他三个并可按需替换model_name、数据集与超参数。赞分享人工智能NLPEmbedding微调【免费下载链接】sentence-transformersState-of-the-Art Embeddings, Retrieval, and Reranking项目地址https://gitcode.com/gh_mirrors/se/sentence-transformers点击查看免费下载相关推荐train-sentence-transformers 交叉编码器损失函数全解从 BinaryCrossEntropy 到 LambdaLoss 的 Reranker 训练选型与实践train sentence transformers 交叉编码器损失函数全解从 BinaryCrossEntropy 到 LambdaLoss 的 Rera人工智能AI 技能/插件大模型AI 评测sentence-transformers 预训练 CrossEncoder 模型全指南从 MS MARCO 重排序到多模态 Rerankersentence transformers 预训练 CrossEncoder 模型全指南从 MS MARCO 重排序到多模态 Reranker 本文基于仓库中人工智能NLPEmbedding微调如何永久保存微信聊天记录留痕项目完整使用指南如何永久保存微信聊天记录留痕项目完整使用指南 你是否曾为丢失重要微信聊天记录而懊恼是否希望将珍贵的对话永久保存下来 微信聊天记录导出 工具留痕项目正是人工智能RAGEmbeddingRerank微调模型评测上一篇MessageKitiOS聊天界面开发的终极解决方案下一篇性能翻倍LMDeploy低精度推理INT8/FP8混合精度配置实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考