语义文本相似度
语义文本相似度(STS)对两个文本的相似度进行评分。在这个例子中,我们使用 stsb 数据集作为训练数据,来微调我们的稀疏编码器模型。请参阅以下示例脚本,了解如何调整 SparseEncoder,特别是如何在 STS 数据上微调 splade 模型。
train_splade_stsbenchmark.py - 此示例展示了如何通过使用预训练的 splade 模型(例如
splade-cocondenser-ensembledistil)来微调一个已经预训练好的 splade 模型,并对其进行微调以在此特定任务上获得更好的结果。
训练数据
在 STS 中,我们有带有一个指示相似度分数的句子对注释。在原始的 STSbenchmark 数据集中,分数范围从 0 到 5。它们在 stsb 中已被归一化到 0 到 1 之间,这是 SparseCosineSimilarityLoss 所必需的,正如您可以在 损失概览 中看到的那样。
以下是我们的训练数据的简化版本
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
# })
损失函数
我们使用 SparseCosineSimilarityLoss 作为我们的损失函数。
对于每个句子对,我们通过稀疏编码器模型输入句子 A 和句子 B,这会生成稀疏嵌入 *u* 和 *v*。这些嵌入的相似度使用余弦相似度计算,结果与黄金相似度分数进行比较。请注意,这两个句子通过相同的模型而不是两个单独的模型进行处理。特别是,相似文本的余弦相似度被最大化,而不相似文本的余弦相似度被最小化。这使得我们的模型能够被微调并识别句子的相似度。
欲了解更多详情,请参阅 Sentence-BERT: 使用 Siamese BERT-Networks 的句子嵌入。