交叉编码器

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 个结果进行重新排序。

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

训练交叉编码器

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