交叉编码器

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 个结果。

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

训练交叉编码器

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