Cross-Encoders

SentenceTransformers 也支持加载交叉编码器,用于句子对评分和句子对分类任务。

交叉编码器 vs. 双编码器

首先,重要的是理解双编码器和交叉编码器之间的区别。

双编码器 为给定的句子生成句子嵌入。我们独立地将句子 A 和 B 传递给 BERT,这会生成句子嵌入 u 和 v。然后可以使用余弦相似度比较这些句子嵌入

BiEncoder

相比之下,对于 交叉编码器 ,我们将两个句子同时传递给 Transformer 网络。然后,它生成一个介于 0 和 1 之间的输出值,指示输入句子对的相似性

交叉编码器不生成句子嵌入。此外,我们无法将单个句子传递给交叉编码器。

正如我们的 论文 中详细说明的那样,交叉编码器比双编码器实现更好的性能。但是,对于许多应用来说,它们并不实用,因为它们不生成我们可以索引或使用余弦相似度有效比较的嵌入。

何时使用交叉编码器/双编码器?

当您有一组预定义的句子对要评分时,可以使用交叉编码器。例如,您有 100 个句子对,并且想要获得这 100 个对的相似度分数。

双编码器(参见 计算句子嵌入)用于您需要在向量空间中使用句子嵌入以进行有效比较的任何时候。应用示例包括信息检索 / 语义搜索或聚类。交叉编码器对于这些应用来说将是错误的选择:使用交叉编码器聚类 10,000 个句子将需要计算大约 5000 万个句子组合的相似度分数,这大约需要 65 个小时。使用双编码器,您可以计算每个句子的嵌入,这仅需 5 秒钟。然后,您可以执行聚类。

交叉编码器用法

使用交叉编码器非常容易

from sentence_transformers.cross_encoder import CrossEncoder

model = CrossEncoder("cross-encoder/ms-marco-MiniLM-L6-v2")
scores = model.predict([["My first", "sentence pair"], ["Second text", "pair"]])

您将句子列表传递给 model.predict。 请注意,交叉编码器不适用于单个句子,您必须传递句子对。

作为模型名称,您可以传递任何与 Hugging Face AutoModel 类兼容的模型或路径。

对于完整示例,要使用语料库中所有可能的句子对查询进行评分,请参阅 cross-encoder_usage.py

结合使用双编码器和交叉编码器

交叉编码器比双编码器实现更高的性能,但是,对于大型数据集,它们的可扩展性不佳。在这里,结合使用交叉编码器和双编码器可能是有意义的,例如在信息检索 / 语义搜索场景中:首先,您使用高效的双编码器来检索例如查询最相似的前 100 个句子。然后,您使用交叉编码器通过计算每个(查询,命中)组合的分数来重新排序这 100 个命中结果。

有关结合使用双编码器和交叉编码器的更多详细信息,请参阅 应用 - 信息检索

训练交叉编码器

请参阅 交叉编码器训练 了解如何训练您自己的交叉编码器模型。