语义文本相似性

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

您也可以训练并使用 CrossEncoder 模型来完成此任务。有关更多详细信息,请参阅 交叉编码器 > 训练示例 > 语义文本相似性

训练数据

在 STS 中,我们有句子对,并附带一个指示相似度的分数。在原始的 STSbenchmark 数据集中,分数范围为 0 到 5。我们已将这些分数归一化到 stsb 中的 0 到 1 之间,这是 CosineSimilarityLoss 所需的,如您在 损失概述 中所见。

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

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
# })

损失函数

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

SBERT Siamese Network Architecture

对于每个句子对,我们将句子 A 和句子 B 通过基于 BERT 的模型,这会产生嵌入 uv。这些嵌入的相似度使用余弦相似度计算,并将结果与黄金相似度分数进行比较。请注意,这两个句子是通过同一个模型而不是两个独立的模型进行处理的。特别是,相似文本的余弦相似度被最大化,而不相似文本的余弦相似度被最小化。这使得我们的模型能够进行微调并识别句子的相似性。

更多详细信息,请参阅 Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks

CoSENTLossAnglELossCosineSimilarityLoss 的更现代变体,它们接受相同的数据格式,即具有 0.0 到 1.0 相似度分数的句子对。非正式实验表明,这两个损失函数产生的模型比 CosineSimilarityLoss 更强大。