Cross-Encoders¶
SentenceTransformers 还支持加载用于句子对评分和句子对分类任务的 Cross-Encoders。
Bi-Encoder 与 Cross-Encoder¶
首先,理解 Bi-Encoder 和 Cross-Encoder 之间的区别很重要。
Bi-Encoders 为给定的句子生成句子嵌入。我们将句子 A 和 B 独立传递给 BERT,结果生成句子嵌入 u 和 v。然后可以使用余弦相似度比较这些句子嵌入:
相比之下,对于 Cross-Encoder,我们将两个句子同时传递给 Transformer 网络。它随后产生一个介于 0 和 1 之间的输出值,表示输入句子对的相似度:
Cross-Encoder 不生成句子嵌入。此外,我们无法将单个句子传递给 Cross-Encoder。
正如我们在论文中所详述的,Cross-Encoder 比 Bi-Encoder 表现更好。然而,对于许多应用来说,它们并不实用,因为它们不生成我们可以例如索引或使用余弦相似度高效比较的嵌入。
何时使用 Cross- / Bi-Encoders?¶
当你有一个预定义的句子对集合并希望对其进行评分时,可以使用 Cross-Encoders。例如,你有 100 对句子,并且你希望获得这 100 对句子的相似度分数。
当你需要在向量空间中为高效比较而获取句子嵌入时,使用 Bi-Encoders(见计算句子嵌入)。例如,信息检索/语义搜索或聚类的应用。对于这些应用,Cross-Encoders 是错误的选择:使用 CrossEncoders 对 10,000 个句子进行聚类需要计算大约 5000 万句组合的相似度分数,这大约需要 65 小时。而使用 Bi-Encoder,你只需计算每个句子的嵌入,这只需要 5 秒。然后你可以执行聚类。
Cross-Encoders 使用¶
使用 Cross-Encoders 非常简单:
from sentence_transformers.cross_encoder import CrossEncoder
model = CrossEncoder("model_name_or_path")
scores = model.predict([["My first", "sentence pair"], ["Second text", "pair"]])
你将句子对的列表传递给 model.predict
。注意,Cross-Encoder 不处理单个句子,你必须传递句子对。
作为模型名称,你可以传递任何与 Hugging Face AutoModel 类兼容的模型或路径。
有关完整的示例,如何对语料库中所有可能的句子评分查询,请参见 cross-encoder_usage.py。
结合 Bi- 和 Cross-Encoders¶
Cross-Encoder 比 Bi-Encoders 性能更高,但它们不太适合大规模数据集。在这里,可以考虑结合 Cross- 和 Bi-Encoders,例如在信息检索/语义搜索场景中:首先,使用高效的 Bi-Encoder 检索例如查询的 100 个最相似的句子。然后,使用 Cross-Encoder 通过计算每个(查询,命中)组合的分数来重新排序这 100 个命中。
有关结合 Bi- 和 Cross-Encoders 的更多详细信息,请参见 应用 - 信息检索。
训练 Cross-Encoders¶
请参见 Cross-Encoder 训练 如何训练你自己的 Cross-Encoder 模型。