【问题标题】:sentence transformer how to predict new example句子转换器如何预测新示例
【发布时间】:2022-01-04 18:08:45
【问题描述】:

我正在探索句子转换器并遇到了这个page。 它展示了如何训练我们的自定义数据。但我不确定如何预测。如果有两个新句子,例如 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)

----------------更新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)

保存模型...与旧代码相比的主要变化

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)

不确定以下步骤

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

问题 1)

这是在训练旧模型并创建新模型后获取句子嵌入的正确方法吗?我很困惑,因为在拟合过程中,我们提供了两个句子以及相似性度量。而对于输出,我们一次输入一个句子并为每个句子获取一个句子嵌入。

问题 2)

如果我想获得两个句子的相似度分数,唯一的选择是从该模型的输出中获取句子嵌入,然后使用余弦相似度吗?

【问题讨论】:

  • 你见过this page吗?
  • 谢谢。我已经更新了这个问题。请回答

标签: python nlp huggingface-transformers sentence sentence-similarity


【解决方案1】:

Q1) 句子转换器创建句子嵌入/向量,您给它一个句子,它会输出该句子的数字表示(例如向量)。您在训练期间一次输入两个句子的原因是因为模型正在优化,可以为相似或不相似的句子对输出相似或不相似的向量。

在训练过程中,模型实际上是一次处理一个句子,所以你一个接一个地输入一个句子,产生两个嵌入。计算两个嵌入之间的余弦相似度,并根据预测相似度(输出但余弦相似度函数)与真实相似度(来自数据的标签特征)之间的差异计算损失。

因此,在训练期间,当您在 CosineSimilarityLoss 上进行优化时,包括计算余弦相似度的最后一步

Q2) 使用句子转换器时是正确的过程。您也可以使用直接输出相似度分数的交叉编码器模型,但这会抵消句子编码器的优势,因为您可以创建句子嵌入,然后将它们存储在向量数据库中以供以后使用。

如果您随后需要计算一个新句子与数千个先前编码的句子之间的相似度,那么您只需计算所有对之间的余弦相似度即可。使用交叉编码器,您需要将每一对输入交叉编码器并执行完整的 BERT(如果使用 bert 交叉编码器)推理步骤,这比余弦相似度计算花费的时间要长得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 2020-07-06
    • 2019-01-28
    • 2016-02-10
    • 2021-03-16
    • 2021-04-01
    • 1970-01-01
    • 2020-09-03
    相关资源
    最近更新 更多