预训练模型

我们已经通过我们的 Cross Encoder Hugging Face 组织发布了各种预训练的 Cross Encoder 模型。此外,许多社区的 CrossEncoder 模型已经在 Hugging Face Hub 上公开发布。

这些模型中的每一个都可以轻松下载并像这样使用:

from sentence_transformers import CrossEncoder
import torch

model = CrossEncoder("cross-encoder/ms-marco-MiniLM-L-6-v2", default_activation_function=torch.nn.Sigmoid())
scores = model.predict([
    ("How many people live in Berlin?", "Berlin had a population of 3,520,031 registered inhabitants in an area of 891.82 square kilometers."),
    ("How many people live in Berlin?", "Berlin is well known for its museums."),
])
# => array([0.9998173 , 0.01312432], dtype=float32)

交叉编码器需要文本对作为输入,并输出一个分数 0...1(如果使用 Sigmoid 激活函数)。它们不适用于单个句子,也不为单个文本计算嵌入。

MS MARCO

MS MARCO 段落检索是一个大型数据集,包含来自 Bing 搜索引擎的真实用户查询以及标注的相关文本段落。

备注

你可以使用 default_activation_function=torch.nn.Sigmoid() 来初始化这些模型,以强制模型返回0到1之间的分数。否则,原始值可以在-10到10之间合理地变化。

  • cross-encoder/ms-marco-TinyBERT-L-2-v2 - MS Marco 开发集上的 MRR@10: 32.56

  • cross-encoder/ms-marco-MiniLM-L-2-v2 - MS Marco 开发集上的 MRR@10: 34.85

  • cross-encoder/ms-marco-MiniLM-L-4-v2 - MS Marco 开发集上的 MRR@10: 37.70

  • cross-encoder/ms-marco-MiniLM-L-6-v2 - MS Marco 开发集上的 MRR@10: 39.01

  • cross-encoder/ms-marco-MiniLM-L-12-v2 - MS Marco 开发集上的 MRR@10: 39.02

有关使用方法的详细信息,请参阅 Retrieve & Re-Rank 或 MS MARCO Cross-Encoders。

SQuAD (QNLI)

QNLI 基于 SQuAD 数据集(HF),并由 GLUE 基准测试(HF)引入。给定来自维基百科的一段文本,标注者创建了可以通过该段落回答的问题。

  • cross-encoder/qnli-distilroberta-base - QNLI 开发集上的准确率: 90.96

  • cross-encoder/qnli-electra-base - QNLI 开发集上的准确率: 93.21

STSbenchmark

以下模型可以这样使用:

from sentence_transformers import CrossEncoder

model = CrossEncoder("cross-encoder/stsb-roberta-base")
scores = model.predict([("It's a wonderful day outside.", "It's so sunny today!"), ("It's a wonderful day outside.", "He drove to work earlier.")])
# => array([0.60443085, 0.00240758], dtype=float32)

它们返回一个分数 0...1,表示给定句子对的语义相似度。

  • cross-encoder/stsb-TinyBERT-L-4 - STSbenchmark 测试性能: 85.50

  • cross-encoder/stsb-distilroberta-base - STSbenchmark 测试性能: 87.92

  • cross-encoder/stsb-roberta-base - STSbenchmark 测试性能: 90.17

  • cross-encoder/stsb-roberta-large - STSbenchmark 测试性能: 91.47

Quora 重复问题

这些模型已经在Quora重复问题数据集上进行了训练。它们可以像STSb模型一样使用,并给出一个0...1的分数,表示两个问题是重复问题的概率。

  • cross-encoder/quora-distilroberta-base - 开发集的平均精度: 87.48

  • cross-encoder/quora-roberta-base - 开发集的平均精度: 87.80

  • cross-encoder/quora-roberta-large - 开发集的平均精度: 87.91

备注

该模型不适用于问题相似性。问题 如何学习Java如何学习Python 将得到低分,因为这些问题不是重复的。对于问题相似性,在Quora数据集上训练的相应双编码器会产生更有意义的结果。

NLI

给定两个句子,这些句子是相互矛盾的、相互蕴含的还是中立的?以下模型是在SNLI和MultiNLI数据集上训练的。

  • cross-encoder/nli-deberta-v3-base - MNLI 不匹配集上的准确率:90.04

  • cross-encoder/nli-deberta-base - MNLI 不匹配集上的准确率: 88.08

  • cross-encoder/nli-deberta-v3-xsmall - MNLI 不匹配集上的准确率: 87.77

  • cross-encoder/nli-deberta-v3-small - MNLI 不匹配集上的准确率:87.55

  • cross-encoder/nli-roberta-base - MNLI 不匹配集上的准确率: 87.47

  • cross-encoder/nli-MiniLM2-L6-H768 - MNLI 不匹配集上的准确率: 86.89

  • cross-encoder/nli-distilroberta-base - MNLI 不匹配集上的准确率:83.98

from sentence_transformers import CrossEncoder

model = CrossEncoder("cross-encoder/nli-deberta-v3-base")
scores = model.predict([
    ("A man is eating pizza", "A man eats something"),
    ("A black race car starts up in front of a crowd of people.", "A man is driving down a lonely road."),
])

# Convert scores to labels
label_mapping = ["contradiction", "entailment", "neutral"]
labels = [label_mapping[score_max] for score_max in scores.argmax(axis=1)]
# => ['entailment', 'contradiction']

社区模型

社区中一些值得注意的模型包括: