训练概述
为什么要进行微调?
微调 Sentence Transformer 模型通常能大幅提升模型在您用例中的性能,因为每个任务对相似度的定义不同。例如,给定新闻文章:
“苹果发布新款 iPad”
“NVIDIA 正在为下一代 GPU 做准备”
在以下用例中,我们可能对相似度有不同的概念:
一个用于分类新闻文章(经济、体育、科技、政治等)的模型,应该为这些文本生成相似的嵌入。
一个用于语义文本相似度的模型,应该为这些文本生成不相似的嵌入,因为它们意义不同。
一个用于语义搜索的模型不需要文档间的相似度概念,因为它只需要比较查询和文档。
另请参阅训练示例,其中包含您可以采用的许多用于常见实际应用的训练脚本。
训练组件
训练 Sentence Transformer 模型涉及 4 到 6 个组件:
模型
Sentence Transformer 模型由一系列模块或自定义模块组成,这提供了很大的灵活性。如果您想进一步微调 SentenceTransformer 模型(例如,它有一个modules.json 文件),那么您不必担心使用了哪些模块。
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
但如果您想从另一个检查点或从头开始训练,那么这些是最常用的架构:
大多数 Sentence Transformer 模型使用Transformer
和Pooling
模块。前者加载一个预训练的 Transformer 模型(例如BERT、RoBERTa、DistilBERT、ModernBERT等),后者将 Transformer 的输出进行池化,为每个输入句子生成一个单一的向量表示。
from sentence_transformers import models, SentenceTransformer
transformer = models.Transformer("google-bert/bert-base-uncased")
pooling = models.Pooling(transformer.get_word_embedding_dimension(), pooling_mode="mean")
model = SentenceTransformer(modules=[transformer, pooling])
这是 Sentence Transformers 中的默认选项,因此使用快捷方式更容易:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("google-bert/bert-base-uncased")
提示
最强大的基础模型通常是“编码器模型”,即训练用于为输入生成有意义的 token 嵌入的模型。您可以在这里找到强大的候选模型:
fill-mask 模型 - 训练用于 token 嵌入
sentence similarity 模型 - 训练用于文本嵌入
feature-extraction 模型 - 训练用于文本嵌入
考虑寻找专为您的语言和/或感兴趣领域设计的基础模型。例如,FacebookAI/xlm-roberta-base 在土耳其语上的表现会比google-bert/bert-base-uncased更好。
静态嵌入模型(博客文章)使用StaticEmbedding
模块,它们是不使用缓慢的 Transformer 或注意力机制的编码器模型。对于这些模型,计算嵌入非常简单:给定输入 token,返回预计算的 token 嵌入。这些模型速度快好几个数量级,但由于 token 嵌入是独立于上下文计算的,因此无法捕捉复杂的语义。
from sentence_transformers import models, SentenceTransformer
from tokenizers import Tokenizer
# Load any Tokenizer from Hugging Face
tokenizer = Tokenizer.from_pretrained("google-bert/bert-base-uncased")
# The `embedding_dim` is the dimensionality (size) of the token embeddings
static_embedding = StaticEmbedding(tokenizer, embedding_dim=512)
model = SentenceTransformer(modules=[static_embedding])
数据集
SentenceTransformerTrainer
使用datasets.Dataset
(一个数据集)或datasets.DatasetDict
实例(多个数据集,另请参见多数据集训练)进行训练和评估。
如果您想从Hugging Face 数据集加载数据,那么您应该使用datasets.load_dataset()
from datasets import load_dataset
train_dataset = load_dataset("sentence-transformers/all-nli", "pair-class", split="train")
eval_dataset = load_dataset("sentence-transformers/all-nli", "pair-class", split="dev")
print(train_dataset)
"""
Dataset({
features: ['premise', 'hypothesis', 'label'],
num_rows: 942069
})
"""
一些数据集(包括sentence-transformers/all-nli)要求您在数据集名称旁边提供一个“子集”。sentence-transformers/all-nli
有 4 个子集,每个子集都有不同的数据格式:pair、pair-class、pair-score、triplet。
注意
许多与 Sentence Transformers 无缝协作的 Hugging Face 数据集已被标记为sentence-transformers
,您可以通过浏览https://huggingface.co/datasets?other=sentence-transformers轻松找到它们。我们强烈建议您浏览这些数据集,以找到可能对您的任务有用的训练数据集。
如果您有常见文件格式的本地数据,那么您可以使用datasets.load_dataset()
轻松加载这些数据
from datasets import load_dataset
dataset = load_dataset("csv", data_files="my_file.csv")
或
from datasets import load_dataset
dataset = load_dataset("json", data_files="my_file.json")
如果您有需要额外预处理的本地数据,我建议您使用datasets.Dataset.from_dict()
和字典列表初始化数据集,如下所示:
from datasets import Dataset
anchors = []
positives = []
# Open a file, do preprocessing, filtering, cleaning, etc.
# and append to the lists
dataset = Dataset.from_dict({
"anchor": anchors,
"positive": positives,
})
字典中的每个键都将成为结果数据集中的一个列。
数据集格式
您的数据集格式与损失函数(或您选择的损失函数与数据集格式)匹配非常重要。验证数据集格式是否适用于损失函数涉及两个步骤:
如果您的损失函数根据损失概述表需要一个标签,那么您的数据集必须有一个名为“label”或“score”的列。此列将自动作为标签。
所有未命名为“label”或“score”的列都被视为根据损失概述表的输入。剩余列的数量必须与您所选损失的有效输入数量匹配。这些列的名称不重要,只有顺序重要。
例如,给定一个包含列["text1", "text2", "label"]
的数据集,其中“label”列的浮点相似度分数在 0 到 1 之间,我们可以将其与CoSENTLoss
、AnglELoss
和CosineSimilarityLoss
一起使用,因为它
有一个“label”列,这是这些损失函数所必需的。
有 2 个非标签列,恰好是这些损失函数所需的数量。
如果您的列顺序不正确,请务必使用Dataset.select_columns
重新排列数据集列的顺序。例如,如果您的数据集有["good_answer", "bad_answer", "question"]
作为列,那么这个数据集技术上可以与需要(锚点、正样本、负样本)三元组的损失一起使用,但good_answer
列将被视为锚点,bad_answer
视为正样本,question
视为负样本。
此外,如果您的数据集有多余的列(例如 sample_id、metadata、source、type),您应该使用Dataset.remove_columns
将其删除,否则它们将被用作输入。您也可以使用Dataset.select_columns
只保留所需的列。
损失函数
损失函数量化了模型在给定批量数据上的表现,使得优化器可以更新模型权重以产生更优(即更低)的损失值。这是训练过程的核心。
遗憾的是,没有一个损失函数适用于所有用例。相反,使用哪个损失函数很大程度上取决于您可用的数据和目标任务。请参阅数据集格式以了解哪些数据集适用于哪些损失函数。此外,损失概述将是您了解选项的最佳帮手。
大多数损失函数只需使用您正在训练的SentenceTransformer
以及一些可选参数即可初始化,例如:
from datasets import load_dataset
from sentence_transformers import SentenceTransformer
from sentence_transformers.losses import CoSENTLoss
# Load a model to train/finetune
model = SentenceTransformer("xlm-roberta-base")
# Initialize the CoSENTLoss
# This loss requires pairs of text and a float similarity score as a label
loss = CoSENTLoss(model)
# Load an example training dataset that works with our loss function:
train_dataset = load_dataset("sentence-transformers/all-nli", "pair-score", split="train")
"""
Dataset({
features: ['sentence1', 'sentence2', 'label'],
num_rows: 942069
})
"""
训练参数
SentenceTransformerTrainingArguments
类可用于指定影响训练性能以及定义跟踪/调试参数的参数。尽管它是可选的,但强烈建议尝试各种有用的参数。
learning_rate
lr_scheduler_type
warmup_ratio
num_train_epochs
max_steps
per_device_train_batch_size
per_device_eval_batch_size
auto_find_batch_size
fp16
bf16
load_best_model_at_end
metric_for_best_model
gradient_accumulation_steps
gradient_checkpointing
eval_accumulation_steps
optim
batch_sampler
multi_dataset_batch_sampler
prompts
router_mapping
learning_rate_mapping
以下是SentenceTransformerTrainingArguments
如何初始化的示例:
args = SentenceTransformerTrainingArguments(
# Required parameter:
output_dir="models/mpnet-base-all-nli-triplet",
# Optional training parameters:
num_train_epochs=1,
per_device_train_batch_size=16,
per_device_eval_batch_size=16,
learning_rate=2e-5,
warmup_ratio=0.1,
fp16=True, # Set to False if you get an error that your GPU can't run on FP16
bf16=False, # Set to True if you have a GPU that supports BF16
batch_sampler=BatchSamplers.NO_DUPLICATES, # losses that use "in-batch negatives" benefit from no duplicates
# Optional tracking/debugging parameters:
eval_strategy="steps",
eval_steps=100,
save_strategy="steps",
save_steps=100,
save_total_limit=2,
logging_steps=100,
run_name="mpnet-base-all-nli-triplet", # Will be used in W&B if `wandb` is installed
)
评估器
您可以为SentenceTransformerTrainer
提供一个eval_dataset
以在训练期间获取评估损失,但在训练期间获取更具体的指标可能也很有用。为此,您可以使用评估器在训练前、训练期间或训练后评估模型的性能并获取有用的指标。您可以同时使用eval_dataset
和评估器,或其中一个,或两者都不用。它们根据eval_strategy
和eval_steps
训练参数进行评估。
以下是 Sentence Transformers 附带的已实现的评估器:
评估器 |
所需数据 |
---|---|
带类别标签的配对。 |
|
带相似度分数的配对。 |
|
查询(qid => 问题),语料库(cid => 文档),以及相关文档(qid => set[cid])。 |
|
不需要数据。 |
|
用于使用教师模型嵌入的源句子和用于学生模型嵌入的目标句子。可以是相同的文本。 |
|
ID 到句子的映射 & 带有重复句子 ID 的对。 |
|
|
|
两种不同语言的句子对。 |
|
(锚点、正样本、负样本)对。 |
此外,SequentialEvaluator
应用于将多个评估器组合成一个评估器,该评估器可以传递给SentenceTransformerTrainer
。
有时您没有所需的评估数据来独立准备这些评估器,但您仍然想跟踪模型在某些常见基准上的表现。在这种情况下,您可以使用这些评估器与来自 Hugging Face 的数据。
from datasets import load_dataset
from sentence_transformers.evaluation import EmbeddingSimilarityEvaluator, SimilarityFunction
# Load the STSB dataset (https://huggingface.co/datasets/sentence-transformers/stsb)
eval_dataset = load_dataset("sentence-transformers/stsb", split="validation")
# Initialize the evaluator
dev_evaluator = EmbeddingSimilarityEvaluator(
sentences1=eval_dataset["sentence1"],
sentences2=eval_dataset["sentence2"],
scores=eval_dataset["score"],
main_similarity=SimilarityFunction.COSINE,
name="sts-dev",
)
# You can run evaluation like so:
# results = dev_evaluator(model)
from datasets import load_dataset
from sentence_transformers.evaluation import TripletEvaluator, SimilarityFunction
# Load triplets from the AllNLI dataset (https://huggingface.co/datasets/sentence-transformers/all-nli)
max_samples = 1000
eval_dataset = load_dataset("sentence-transformers/all-nli", "triplet", split=f"dev[:{max_samples}]")
# Initialize the evaluator
dev_evaluator = TripletEvaluator(
anchors=eval_dataset["anchor"],
positives=eval_dataset["positive"],
negatives=eval_dataset["negative"],
main_distance_function=SimilarityFunction.COSINE,
name="all-nli-dev",
)
# You can run evaluation like so:
# results = dev_evaluator(model)
from sentence_transformers.evaluation import NanoBEIREvaluator
# Initialize the evaluator. Unlike most other evaluators, this one loads the relevant datasets
# directly from Hugging Face, so there's no mandatory arguments
dev_evaluator = NanoBEIREvaluator()
# You can run evaluation like so:
# results = dev_evaluator(model)
提示
当在训练期间频繁使用较小的eval_steps
进行评估时,请考虑使用一个微型eval_dataset
以最小化评估开销。如果您担心评估集大小,90-1-9 的训练-评估-测试划分可以提供一个平衡,为最终评估保留一个合理大小的测试集。训练结束后,您可以使用trainer.evaluate(test_dataset)
评估模型的测试损失,或使用test_evaluator(model)
初始化一个测试评估器以获取详细的测试指标。
如果您在训练后但在保存模型之前进行评估,则自动生成的模型卡仍将包含测试结果。
警告
使用分布式训练时,评估器仅在第一个设备上运行,而训练和评估数据集则在所有设备上共享。
训练器
SentenceTransformerTrainer
是所有先前组件汇集的地方。我们只需要指定模型、训练参数(可选)、训练数据集、评估数据集(可选)、损失函数、评估器(可选)即可开始训练。让我们看看所有这些组件如何协同工作的脚本:
from datasets import load_dataset
from sentence_transformers import (
SentenceTransformer,
SentenceTransformerTrainer,
SentenceTransformerTrainingArguments,
SentenceTransformerModelCardData,
)
from sentence_transformers.losses import MultipleNegativesRankingLoss
from sentence_transformers.training_args import BatchSamplers
from sentence_transformers.evaluation import TripletEvaluator
# 1. Load a model to finetune with 2. (Optional) model card data
model = SentenceTransformer(
"microsoft/mpnet-base",
model_card_data=SentenceTransformerModelCardData(
language="en",
license="apache-2.0",
model_name="MPNet base trained on AllNLI triplets",
)
)
# 3. Load a dataset to finetune on
dataset = load_dataset("sentence-transformers/all-nli", "triplet")
train_dataset = dataset["train"].select(range(100_000))
eval_dataset = dataset["dev"]
test_dataset = dataset["test"]
# 4. Define a loss function
loss = MultipleNegativesRankingLoss(model)
# 5. (Optional) Specify training arguments
args = SentenceTransformerTrainingArguments(
# Required parameter:
output_dir="models/mpnet-base-all-nli-triplet",
# Optional training parameters:
num_train_epochs=1,
per_device_train_batch_size=16,
per_device_eval_batch_size=16,
learning_rate=2e-5,
warmup_ratio=0.1,
fp16=True, # Set to False if you get an error that your GPU can't run on FP16
bf16=False, # Set to True if you have a GPU that supports BF16
batch_sampler=BatchSamplers.NO_DUPLICATES, # MultipleNegativesRankingLoss benefits from no duplicate samples in a batch
# Optional tracking/debugging parameters:
eval_strategy="steps",
eval_steps=100,
save_strategy="steps",
save_steps=100,
save_total_limit=2,
logging_steps=100,
run_name="mpnet-base-all-nli-triplet", # Will be used in W&B if `wandb` is installed
)
# 6. (Optional) Create an evaluator & evaluate the base model
dev_evaluator = TripletEvaluator(
anchors=eval_dataset["anchor"],
positives=eval_dataset["positive"],
negatives=eval_dataset["negative"],
name="all-nli-dev",
)
dev_evaluator(model)
# 7. Create a trainer & train
trainer = SentenceTransformerTrainer(
model=model,
args=args,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
loss=loss,
evaluator=dev_evaluator,
)
trainer.train()
# (Optional) Evaluate the trained model on the test set
test_evaluator = TripletEvaluator(
anchors=test_dataset["anchor"],
positives=test_dataset["positive"],
negatives=test_dataset["negative"],
name="all-nli-test",
)
test_evaluator(model)
# 8. Save the trained model
model.save_pretrained("models/mpnet-base-all-nli-triplet/final")
# 9. (Optional) Push it to the Hugging Face Hub
model.push_to_hub("mpnet-base-all-nli-triplet")
回调
这个 Sentence Transformers 训练器集成了对各种transformers.TrainerCallback
子类的支持,例如:
WandbCallback
:如果安装了wandb
,则自动将训练指标记录到 W&B。TensorBoardCallback
:如果可以访问tensorboard
,则将训练指标记录到 TensorBoard。CodeCarbonCallback
:如果安装了codecarbon
,则跟踪模型在训练期间的碳排放。注意:这些碳排放将包含在自动生成的模型卡中。
有关集成回调以及如何编写自己的回调的更多信息,请参阅 Transformers 回调文档。
多数据集训练
性能最佳的模型是同时使用许多数据集进行训练的。通常,这相当棘手,因为每个数据集都有不同的格式。然而,sentence_transformers.trainer.SentenceTransformerTrainer
可以训练多个数据集,而无需将每个数据集转换为相同的格式。它甚至可以对每个数据集应用不同的损失函数。使用多个数据集进行训练的步骤是:
使用
Dataset
实例的字典(或DatasetDict
)作为train_dataset
(可选地,也可以作为eval_dataset
)。(可选)使用损失函数字典,将数据集名称映射到损失。仅当您希望对不同数据集使用不同的损失函数时才需要。
每个训练/评估批次将只包含来自一个数据集的样本。从多个数据集采样批次的顺序由MultiDatasetBatchSamplers
枚举定义,该枚举可以通过multi_dataset_batch_sampler
传递给SentenceTransformerTrainingArguments
。有效选项包括:
MultiDatasetBatchSamplers.ROUND_ROBIN
: 轮流从每个数据集中采样,直到其中一个耗尽。使用此策略,每个数据集中的所有样本不太可能被使用,但每个数据集都被同等采样。MultiDatasetBatchSamplers.PROPORTIONAL
(默认): 根据每个数据集的大小按比例采样。使用此策略,每个数据集中的所有样本都将被使用,并且较大的数据集会更频繁地被采样。
这种多任务训练已被证明非常有效,例如 Huang et al. 采用了MultipleNegativesRankingLoss
、CoSENTLoss
,以及一个不带批内负样本且仅包含困难负样本的MultipleNegativesRankingLoss
变体,从而在中文任务上达到了最先进的性能。他们甚至应用了MatryoshkaLoss
,以使模型能够生成Matryoshka Embeddings。
在多个数据集上进行训练看起来像这样:
from datasets import load_dataset
from sentence_transformers import SentenceTransformer, SentenceTransformerTrainer
from sentence_transformers.losses import CoSENTLoss, MultipleNegativesRankingLoss, SoftmaxLoss
# 1. Load a model to finetune
model = SentenceTransformer("bert-base-uncased")
# 2. Load several Datasets to train with
# (anchor, positive)
all_nli_pair_train = load_dataset("sentence-transformers/all-nli", "pair", split="train[:10000]")
# (premise, hypothesis) + label
all_nli_pair_class_train = load_dataset("sentence-transformers/all-nli", "pair-class", split="train[:10000]")
# (sentence1, sentence2) + score
all_nli_pair_score_train = load_dataset("sentence-transformers/all-nli", "pair-score", split="train[:10000]")
# (anchor, positive, negative)
all_nli_triplet_train = load_dataset("sentence-transformers/all-nli", "triplet", split="train[:10000]")
# (sentence1, sentence2) + score
stsb_pair_score_train = load_dataset("sentence-transformers/stsb", split="train[:10000]")
# (anchor, positive)
quora_pair_train = load_dataset("sentence-transformers/quora-duplicates", "pair", split="train[:10000]")
# (query, answer)
natural_questions_train = load_dataset("sentence-transformers/natural-questions", split="train[:10000]")
# We can combine all datasets into a dictionary with dataset names to datasets
train_dataset = {
"all-nli-pair": all_nli_pair_train,
"all-nli-pair-class": all_nli_pair_class_train,
"all-nli-pair-score": all_nli_pair_score_train,
"all-nli-triplet": all_nli_triplet_train,
"stsb": stsb_pair_score_train,
"quora": quora_pair_train,
"natural-questions": natural_questions_train,
}
# 3. Load several Datasets to evaluate with
# (anchor, positive, negative)
all_nli_triplet_dev = load_dataset("sentence-transformers/all-nli", "triplet", split="dev")
# (sentence1, sentence2, score)
stsb_pair_score_dev = load_dataset("sentence-transformers/stsb", split="validation")
# (anchor, positive)
quora_pair_dev = load_dataset("sentence-transformers/quora-duplicates", "pair", split="train[10000:11000]")
# (query, answer)
natural_questions_dev = load_dataset("sentence-transformers/natural-questions", split="train[10000:11000]")
# We can use a dictionary for the evaluation dataset too, but we don't have to. We could also just use
# no evaluation dataset, or one dataset.
eval_dataset = {
"all-nli-triplet": all_nli_triplet_dev,
"stsb": stsb_pair_score_dev,
"quora": quora_pair_dev,
"natural-questions": natural_questions_dev,
}
# 4. Load several loss functions to train with
# (anchor, positive), (anchor, positive, negative)
mnrl_loss = MultipleNegativesRankingLoss(model)
# (sentence_A, sentence_B) + class
softmax_loss = SoftmaxLoss(model, model.get_sentence_embedding_dimension(), 3)
# (sentence_A, sentence_B) + score
cosent_loss = CoSENTLoss(model)
# Create a mapping with dataset names to loss functions, so the trainer knows which loss to apply where.
# Note that you can also just use one loss if all of your training/evaluation datasets use the same loss
losses = {
"all-nli-pair": mnrl_loss,
"all-nli-pair-class": softmax_loss,
"all-nli-pair-score": cosent_loss,
"all-nli-triplet": mnrl_loss,
"stsb": cosent_loss,
"quora": mnrl_loss,
"natural-questions": mnrl_loss,
}
# 5. Define a simple trainer, although it's recommended to use one with args & evaluators
trainer = SentenceTransformerTrainer(
model=model,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
loss=losses,
)
trainer.train()
# 6. save the trained model and optionally push it to the Hugging Face Hub
model.save_pretrained("bert-base-all-nli-stsb-quora-nq")
model.push_to_hub("bert-base-all-nli-stsb-quora-nq")
已弃用的训练
在 Sentence Transformers v3.0 发布之前,模型使用SentenceTransformer.fit()
方法和InputExample
的DataLoader
进行训练,其形式大致如下:
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/distilbert-base-uncased")
# 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)
自 v3.0 发布以来,使用SentenceTransformer.fit()
仍然可行,但它会在幕后初始化一个SentenceTransformerTrainer
。建议直接使用 Trainer,因为您可以通过SentenceTransformerTrainingArguments
获得更多控制权,但依赖SentenceTransformer.fit()
的现有训练脚本应该仍然有效。
如果更新的SentenceTransformer.fit()
出现问题,您也可以通过调用SentenceTransformer.old_fit()
来获得完全相同的旧行为,但此方法计划在未来完全弃用。
最佳基础嵌入模型
您的文本嵌入模型的质量取决于您选择的 Transformer 模型。遗憾的是,我们无法从 GLUE 或 SuperGLUE 基准测试中更好的性能推断出该模型也将产生更好的表示。
为了测试 Transformer 模型的适用性,我使用training_nli_v2.py脚本,并在 560k (anchor, positive, negative)-三元组上训练 1 个 epoch,批量大小为 64。然后我在 14 个来自不同领域的各种文本相似性任务(聚类、语义搜索、重复检测等)上进行评估。
下表显示了不同模型及其在此基准上的性能
模型 | 性能 (14 个句子相似度任务) |
---|---|
microsoft/mpnet-base | 60.99 |
nghuyong/ernie-2.0-en | 60.73 |
microsoft/deberta-base | 60.21 |
roberta-base | 59.63 |
t5-base | 59.21 |
bert-base-uncased | 59.17 |
distilbert-base-uncased | 59.03 |
nreimers/TinyBERT_L-6_H-768_v2 | 58.27 |
google/t5-v1_1-base | 57.63 |
nreimers/MiniLMv2-L6-H768-distilled-from-BERT-Large | 57.31 |
albert-base-v2 | 57.14 |
microsoft/MiniLM-L12-H384-uncased | 56.79 |
microsoft/deberta-v3-base | 54.46 |
与 CrossEncoder 训练的比较
训练SentenceTransformer
模型与训练CrossEncoder
模型非常相似,但存在一些关键差异:
不再将
score
、scores
、label
和labels
列视为“标签列”,而只将score
和label
视为标签列。如您在损失概述文档中看到的,某些损失需要这些名称之一的列中包含特定的标签/分数。对于
CrossEncoder
训练,您可以在一列中使用(大小可变的)文本列表。在SentenceTransformer
训练中,您不能在训练/评估数据集的列中使用输入列表(例如文本)。简而言之:不支持使用可变数量的负样本进行训练。
有关训练CrossEncoder
模型的更多详细信息,请参阅Cross Encoder > 训练概述文档。