语义文本相似度

语义文本相似度 (STS) 为两个文本的相似性分配一个分数。 在此示例中,我们使用 stsb 数据集作为训练数据来微调 CrossEncoder 模型。 请参阅以下示例脚本,了解如何调整 STS 数据上的 CrossEncoder 模型

您还可以训练和使用 SentenceTransformer 模型来完成此任务。 有关更多详细信息,请参阅 Sentence Transformer > 训练示例 > 语义文本相似度

训练数据

在 STS 中,我们有句子对以及指示相似度的分数。 在原始 STSbenchmark 数据集中,分数范围从 0 到 5。 我们已将这些分数归一化到 stsb 中的 0 到 1 之间,这是 BinaryCrossEntropyLoss 所要求的,正如您在 损失概述 中看到的那样。

这是我们训练数据的简化版本

from datasets import Dataset

sentence1_list = ["My first sentence", "Another pair"]
sentence2_list = ["My second sentence", "Unrelated sentence"]
labels_list = [0.8, 0.3]
train_dataset = Dataset.from_dict({
    "sentence1": sentence1_list,
    "sentence2": sentence2_list,
    "label": labels_list,
})
# => Dataset({
#     features: ['sentence1', 'sentence2', 'label'],
#     num_rows: 2
# })
print(train_dataset[0])
# => {'sentence1': 'My first sentence', 'sentence2': 'My second sentence', 'label': 0.8}
print(train_dataset[1])
# => {'sentence1': 'Another pair', 'sentence2': 'Unrelated sentence', 'label': 0.3}

在上述脚本中,我们直接加载 stsb 数据集

from datasets import load_dataset

train_dataset = load_dataset("sentence-transformers/stsb", split="train")
# => Dataset({
#     features: ['sentence1', 'sentence2', 'score'],
#     num_rows: 5749
# })

损失函数

我们使用 BinaryCrossEntropyLoss 作为我们的损失函数。

CrossEncoder architecture

对于每个句子对,我们通过基于 BERT 的模型传递句子 A 和句子 B,之后分类器头将来自基于 BERT 的模型的中间表示转换为相似度分数。 通过此损失,我们应用 torch.nn.BCEWithLogitsLoss,它接受 logits(也称为输出、原始预测)和黄金相似度分数,以计算损失,表示模型在此批次上的表现。 可以最小化此损失以提高模型的性能。

推理

您可以像这样使用任何 用于 STS 的预训练 CrossEncoder 模型 执行推理

from sentence_transformers import CrossEncoder

model = CrossEncoder("cross-encoder/stsb-roberta-base")
scores = model.predict([("It's a wonderful day outside.", "It's so sunny today!"), ("It's a wonderful day outside.", "He drove to work earlier.")])
# => array([0.60443085, 0.00240758], dtype=float32)