☰
train-sentence-transformers - evaluators_cross_encoder
2026/10/2 2:19:22 网站建设 项目流程

评估器(交叉编码器)

所有交叉编码器评估器都位于sentence_transformers.cross_encoder.evaluation中。

选择合适的评估器

任务评估器
重排检索结果(BM25 top-N 上的 nDCG@k)——快速默认CrossEncoderNanoBEIREvaluator
使用每个查询的自定义候选项重排CrossEncoderRerankingEvaluator
二分类 / 多分类成对分类CrossEncoderClassificationEvaluator
连续成对打分(STS 风格)CrossEncoderCorrelationEvaluator

将多个评估器包装在SequentialEvaluator(来自sentence_transformers.base.evaluation)中,以便一起跟踪:

fromsentence_transformers.base.evaluationimportSequentialEvaluator evaluator=SequentialEvaluator([nano_beir_eval,custom_rerank_eval])

默认评估器:CrossEncoderNanoBEIREvaluator

NanoBEIREvaluator对重排器的类比。取每个 NanoBEIR 查询的 BM25 top-100,并衡量交叉编码器对它们的重排效果。

fromsentence_transformers.cross_encoder.evaluationimportCrossEncoderNanoBEIREvaluator evaluator=CrossEncoderNanoBEIREvaluator(dataset_names=["msmarco","nfcorpus","nq"],# 默认:13 个 NanoBEIR 数据集中的 11 个(排除 "arguana"、"touche2020")batch_size=64,rerank_k=100,# 对 BM25 top-K 重排)

metric_for_best_model的输出键:eval_NanoBEIR_R100_mean_ndcg@10。R100表示"重排 top-100";如果更改rerank_k,前缀会变化(例如R50)。

每个单独的数据集也会贡献eval_Nano{DatasetName}_R100_ndcg@10(例如eval_NanoMSMARCO_R100_ndcg@10)。

使用你自己的候选进行自定义重排

当你有不属于 NanoBEIR 的查询 + 正例 + 干扰项候选时使用:

fromsentence_transformers.cross_encoder.evaluationimportCrossEncoderRerankingEvaluator samples=[{"query":"...","positive":["the gold answer"],"documents":["...","...",...]}for...]evaluator=CrossEncoderRerankingEvaluator(samples=samples,batch_size=64,name="my-rerank",always_rerank_positives=False,# 默认是 True;为真实评估覆盖为 False)
  • always_rerank_positives=True(库默认值)会强制将正例纳入候选池,即使检索器漏掉了它。重排器只针对它实际能打分的候选被评分,因此该指标反映的是纯重排器质量。
  • always_rerank_positives=False:只有当正例已在documents中时才重排它。如果检索器漏掉了它,排名计为 N+1。这反映的是端到端的检索器+重排器质量。检索器漏掉的正例就丢失了,无论重排器多厉害。

输出键:eval_{name}_ndcg@10、eval_{name}_map、eval_{name}_mrr@10。

分类风格交叉编码器

CrossEncoderClassificationEvaluator

同时适用于二分类(num_labels=1)和多分类(num_labels>=2)交叉编码器。内部有分支:

  • num_labels=1:二分类模式。扫描阈值以报告准确率、F1、精确率、召回率以及average_precision(主指标)。
  • num_labels>=2:多分类模式(例如 NLI:蕴含 / 中性 / 矛盾)。报告f1_macro(主指标)、f1_micro、f1_weighted 以及每类的精确率 / 召回率。
fromsentence_transformers.cross_encoder.evaluationimportCrossEncoderClassificationEvaluator evaluator=CrossEncoderClassificationEvaluator(sentence_pairs=[(premise,hypothesis),...],labels=[0,1,2,...],batch_size=64,name="nli-dev",)

输出键(二分类,num_labels=1):eval_{name}_accuracy、eval_{name}_f1、eval_{name}_average_precision(主指标)。
输出键(多分类,num_labels>=2):eval_{name}_f1_macro(主指标)、eval_{name}_f1_micro、eval_{name}_f1_weighted。

CrossEncoderCorrelationEvaluator

用于连续分数交叉编码器(如输出相似度分数的 STS 交叉编码器)。报告与金标准分数的 Pearson/Spearman 相关性。

fromsentence_transformers.cross_encoder.evaluationimportCrossEncoderCorrelationEvaluator evaluator=CrossEncoderCorrelationEvaluator(sentence_pairs=[(a,b),...],scores=[0.4,0.8,...],name="stsb-dev",)

输出键:eval_{name}_spearman、eval_{name}_pearson。

编写metric_for_best_model

模式:f"eval_{evaluator.primary_metric}"。构造后检查:print(evaluator.primary_metric)。常见值:

  • eval_NanoBEIR_R100_mean_ndcg@10—CrossEncoderNanoBEIREvaluator默认
  • eval_{name}_ndcg@10—CrossEncoderRerankingEvaluator
  • eval_{name}_average_precision—CrossEncoderClassificationEvaluator(二分类,num_labels=1)
  • eval_{name}_f1_macro—CrossEncoderClassificationEvaluator(多分类,num_labels>=2)
  • eval_{name}_spearman—CrossEncoderCorrelationEvaluator

陷阱

  • 训练前务必先运行一次evaluator(model)—— 预训练基线。训练后增量很小意味着损失/数据/基座有问题。
  • CrossEncoderClassificationEvaluator同时接受num_labels=1(二分类,主指标average_precision)和num_labels>=2(多分类,主指标f1_macro);CrossEncoderCorrelationEvaluator需要num_labels=1。
  • 默认的dataset_names=None排除了arguana和touche2020(论证检索任务与其他不同);传入来自sentence_transformers.cross_encoder.evaluation.nano_beir的list(DATASET_NAME_TO_HUMAN_READABLE)以实际运行全部 13 个。
  • 训练期间使用 NanoBEIR 数据集的子集(3–4 个)以保持评估廉价;训练后在更广泛的数据集上运行。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询