语义文本相似度¶
语义文本相似度(STS)为两个文本之间的相似度赋予一个评分。在本例中,我们使用stsb数据集作为训练数据来微调我们的模型。请参见以下示例脚本,了解如何在STS数据上微调SentenceTransformer:
training_stsbenchmark.py - 本示例展示了如何通过使用预训练的transformer模型(例如
distilbert-base-uncased
)和一个池化层来从头创建一个SentenceTransformer模型。training_stsbenchmark_continue_training.py - 本示例展示了如何为先前创建和训练的SentenceTransformer模型(例如
all-mpnet-base-v2
)在STS数据上继续训练。
训练数据¶
在STS中,我们拥有注释了相似度评分的句子对。在原始的STSbenchmark数据集中,评分范围从0到5。我们在`stsb <https://huggingface.co/datasets/sentence-transformers/stsb>`_中将这些评分标准化为0到1的范围,因为这是:class:`~sentence_transformers.losses.CosineSimilarityLoss`所要求的,如您在`损失概览 <../../../docs/sentence_transformer/loss_overview.html>`_中所见。
以下是我们训练数据的简化版本:
from datasets import Dataset
sentence1_list = ["我的第一句话", "另一个句子对"]
sentence2_list = ["我的第二句话", "不相关的句子"]
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': '我的第一句话', 'sentence2': '我的第二句话', 'label': 0.8}
print(train_dataset[1])
# => {'sentence1': '另一个句子对', 'sentence2': '不相关的句子', '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
# })
损失函数¶
我们使用:class:`~sentence_transformers.losses.CosineSimilarityLoss`作为我们的损失函数。
对于每一对句子,我们通过BERT模型传递句子A和句子B,从而得到嵌入u和v。这些嵌入的相似度通过余弦相似度计算,结果与黄金相似度评分进行比较。注意,两个句子通过同一个模型传递,而不是两个不同的模型。特别是,相似文本的余弦相似度被最大化,而不相似文本的余弦相似度被最小化。这使得我们的模型能够微调并识别句子的相似度。
更多详情,请参见Sentence-BERT: 使用Siamese BERT-Networks的句子嵌入。
:class:`~sentence_transformers.losses.CoSENTLoss`和:class:`~sentence_transformers.losses.AnglELoss`是:class:`~sentence_transformers.losses.CosineSimilarityLoss`的更现代变体,它们接受相同的数据格式,即带有相似度评分(范围从0.0到1.0)的句子对。非正式实验表明,这两个损失函数比:class:`~sentence_transformers.losses.CosineSimilarityLoss`产生更强的模型。