交叉编码器
SentenceTransformers 也支持加载交叉编码器,用于句子对评分和句子对分类任务。
双编码器 vs. 交叉编码器
首先,重要的是理解双编码器和交叉编码器之间的区别。
双编码器 为给定的句子生成句子嵌入向量。我们独立地将句子 A 和 B 传递给 BERT,这会产生句子嵌入向量 u 和 v。然后可以使用余弦相似度比较这些句子嵌入向量
相比之下,对于 交叉编码器,我们同时将两个句子传递给 Transformer 网络。然后它产生一个介于 0 和 1 之间的输出值,指示输入句子对的相似度
交叉编码器不生成句子嵌入向量。此外,我们无法将单个句子传递给交叉编码器。
正如我们在 论文 中详细说明的那样,交叉编码器比双编码器取得更好的性能。然而,对于许多应用来说,它们并不实用,因为它们不生成我们可以索引或使用余弦相似度有效比较的嵌入向量。
何时使用交叉编码器 / 双编码器?
当您有一组预定义的句子对想要评分时,可以使用交叉编码器。例如,您有 100 个句子对,并且想要获得这 100 对的相似度分数。
双编码器(参见 计算句子嵌入向量)用于您需要在向量空间中使用句子嵌入向量进行有效比较的任何时候。应用示例包括信息检索 / 语义搜索或聚类。交叉编码器对于这些应用来说是错误的选择:使用交叉编码器聚类 10,000 个句子将需要计算大约 5000 万个句子组合的相似度分数,这大约需要 65 个小时。使用双编码器,您只需计算每个句子的嵌入向量,这只需 5 秒钟。然后您可以执行聚类。
交叉编码器的用法
使用交叉编码器非常容易
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
。请注意,交叉编码器不适用于单个句子,您必须传递句子对。
作为模型名称,您可以传递任何与 Hugging Face AutoModel 类兼容的模型或路径
有关完整示例,要使用语料库中的所有可能句子对查询进行评分,请参见 cross-encoder_usage.py。
结合使用双编码器和交叉编码器
交叉编码器比双编码器取得更高的性能,但是,它们对于大型数据集的扩展性不好。在这里,结合使用交叉编码器和双编码器可能是有意义的,例如在信息检索 / 语义搜索场景中:首先,您使用高效的双编码器检索例如查询最相似的 top-100 个句子。然后,您使用交叉编码器通过计算每个(查询,命中)组合的分数来对这 100 个命中结果进行重排序。
有关结合使用双编码器和交叉编码器的更多详细信息,请参见 应用 - 信息检索。
训练交叉编码器
请参阅 交叉编码器训练 了解如何训练您自己的交叉编码器模型。