句子变压器训练和验证损失

问题描述 投票:0回答:2

我正在使用句子转换器模型在与语义文本相似度 (STS) 数据集相同的自定义数据集上对其进行微调(使用 PyTorch)。

我无法在训练期间获取(或打印)训练或验证错误。我正在尝试寻找如何在训练期间或之后监视这些错误,探索不同的文档,并尝试解决方案,但仍然无法监视这些错误。

下面是代码的训练部分。如何知道 SBERT 训练过程中的训练误差和验证误差?

train_loss = losses.MultipleNegativesRankingLoss(model)
evaluator = EmbeddingSimilarityEvaluator.from_input_examples(val_set, name='sts-dev')
num_epochs = 20
warmup_steps = int(len(train_dataloader) * num_epochs * 0.1)

model.fit(train_objectives=[(train_dataloader, train_loss)],
          evaluator=evaluator,
          epochs=num_epochs,
          evaluation_steps=1000,
          warmup_steps=warmup_steps,
          show_progress_bar=True)

You can see the progress bar of training for reference

deep-learning pytorch nlp bert-language-model sentence-transformers
2个回答
2
投票

此时,SentenceTransformers GitHub 存储库上似乎存在问题 #336#510#1021 请求此功能。这些线程上的一些评论提供了一些中间解决方案,同时拉取请求#1606正在努力提供用于损失跟踪的通用框架。

一般来说,临时解决方案建议要么通过损失函数传入修改SentenceTransformers.py中的fit()函数的行为以显示损失,或者基于SentenceEvaluator实现自定义评估器 提供与具体评估器之一(例如 EmbeddingSimilarityEvaluator)相同的功能,但也显示/记录损失。


0
投票

您可以安装一个开发版本来解决这个问题,

pip 安装https://github.com/jdixosnd/sentence-transformers/archive/refs/heads/generic-logging.zip

您可以编写自定义回调函数来打印您的指标,

loss_names = ["megabatchmargin"]
def log_callback_st(train_idx, epoch, training_steps, lr, loss):
    print({f"train/{loss_names[train_idx]}_loss": loss,
             f"train/{loss_names[train_idx]}_lr": lr,
            "train/steps": training_steps})

最后使用

log_steps
log_callback
参数调用 fit 方法,

model.fit(train_objectives=[(train_dataloader, train_loss)],log_steps=16,log_callback=log_callback_st, epochs=10) 
© www.soinside.com 2019 - 2024. All rights reserved.