use*_*622 3 python nlp sentence sentence-similarity huggingface-transformers
我正在探索句子转换器并发现了此页面。它展示了如何训练我们的自定义数据。但我不确定如何预测。如果有两个新句子,例如 1)这是第三个示例,2)这是第三个示例。我怎样才能预测这些句子的相似程度?
from sentence_transformers import SentenceTransformer, InputExample, losses
from torch.utils.data import DataLoader
#Define the model. Either from scratch of by loading a pre-trained model
model = SentenceTransformer('distilbert-base-nli-mean-tokens')
#Define your train examples. You need more than just two examples...
train_examples = [InputExample(texts=['My first sentence', 'My second sentence'], label=0.8),
InputExample(texts=['Another pair', 'Unrelated sentence'], label=0.3)]
#Define your train dataset, the dataloader and the train loss
train_dataloader = DataLoader(train_examples, shuffle=True, batch_size=16)
train_loss = losses.CosineSimilarityLoss(model)
#Tune the model
model.fit(train_objectives=[(train_dataloader, train_loss)], epochs=1, warmup_steps=100)
Run Code Online (Sandbox Code Playgroud)
----------------------------更新1
我更新了代码如下
from sentence_transformers import SentenceTransformer, InputExample, losses
from torch.utils.data import DataLoader
#Define the model. Either from scratch of by loading a pre-trained model
model = SentenceTransformer('distilbert-base-nli-mean-tokens')
#Define your train examples. You need more than just two examples...
train_examples = [InputExample(texts=['My first sentence', 'My second sentence'], label=0.8),
InputExample(texts=['Another pair', 'Unrelated sentence'], label=0.3)]
#Define your train dataset, the dataloader and the train loss
train_dataloader = DataLoader(train_examples, shuffle=True, batch_size=16)
train_loss = losses.CosineSimilarityLoss(model)
Run Code Online (Sandbox Code Playgroud)
保存模型...与旧代码相比的主要变化
model_save_path2 = '/content/gdrive/MyDrive/folderName1/folderName2/model_try-'+datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
#Tune the model and save it too
model.fit(train_objectives=[(train_dataloader, train_loss)], epochs=1, warmup_steps=100,output_path=model_save_path2)
Run Code Online (Sandbox Code Playgroud)
不确定以下步骤
#loading the new model
model_new = SentenceTransformer(model_save_path)
#predicting
sentences = ["This is an example sentence", "Each sentence is converted"]
model_new.encode(sentences)
Run Code Online (Sandbox Code Playgroud)
问题1)
这是在训练旧模型并创建新模型后获得句子嵌入的正确方法吗?我很困惑,因为在拟合过程中,我们输入了两个句子以及相似性度量。对于输出,我们一次输入一个句子,并为每个句子获取一个句子嵌入。
问题2)
如果我想获得两个句子的相似度分数,唯一的选择是从该模型的输出中获取句子嵌入,然后使用余弦相似度?
Q1)句子转换器创建句子嵌入/向量,你给它一个句子,它输出该句子的数字表示(例如向量)。在训练期间一次输入两个句子的原因是因为模型正在被优化,以便为相似或不相似的句子对输出相似或不相似的向量。
在训练过程中,模型实际上一次处理一个句子,因此您一个接一个地输入句子,产生两个嵌入。计算两个嵌入之间的余弦相似度,并根据预测相似度(输出但余弦相似度函数)与真实相似度(来自数据的标签特征)之间的差异计算损失。
因此,在训练期间,当您优化时,包括计算余弦相似度的最后一步CosineSimilarityLoss
Q2)当使用句子转换器时,这是正确的过程。您也可以使用直接输出相似性分数的交叉编码器模型,但这会抵消句子编码器的优势,因为您可以创建句子嵌入,然后将它们存储在向量数据库中以供以后使用。
如果您需要计算一个新句子与数千个先前编码的句子之间的相似度,则使用句子嵌入,您只需计算所有对之间的余弦相似度。使用交叉编码器,您需要将每一对输入交叉编码器并执行完整的 BERT(如果使用 bert 交叉编码器)推理步骤,这比余弦相似度计算需要更长的时间。
| 归档时间: |
|
| 查看次数: |
2579 次 |
| 最近记录: |