基于PyTorch微调SBERT时,如何监控训练与验证损失?
在SBERT训练中监控训练与验证损失的解决方案
一、显示训练损失
默认情况下,MultipleNegativesRankingLoss的训练损失不会直接在进度条中显示,可通过以下两种方式获取:
1. 启用日志记录
在代码开头添加日志配置,训练过程中的每步损失会自动打印到控制台:
import logging logging.basicConfig(format='%(asctime)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S', level=logging.INFO)
2. 自定义回调函数
如果需要更灵活的打印频率,可自定义回调类,在指定步数后打印训练损失:
from sentence_transformers.callbacks import Callback class LossLoggingCallback(Callback): def __init__(self, print_steps=100): self.print_steps = print_steps self.step_count = 0 def on_step_end(self, model, loss: float, **kwargs): self.step_count += 1 if self.step_count % self.print_steps == 0: print(f"训练步数 {self.step_count},训练损失: {loss:.4f}")
然后在model.fit()中添加回调参数:
model.fit(train_objectives=[(train_dataloader, train_loss)], evaluator=evaluator, epochs=num_epochs, evaluation_steps=1000, warmup_steps=warmup_steps, show_progress_bar=True, callbacks=[LossLoggingCallback(print_steps=100)])
二、获取验证损失
你当前使用的EmbeddingSimilarityEvaluator仅输出相似度相关系数(如Pearson),而非损失值。要获取验证损失,需自定义评估器,用训练时的损失函数在验证集上计算:
1. 自定义验证损失评估器
from sentence_transformers.evaluation import SentenceEvaluator import torch class ValidationLossEvaluator(SentenceEvaluator): def __init__(self, val_dataloader, loss_function): self.val_dataloader = val_dataloader self.loss_function = loss_function def __call__(self, model, output_path=None, epoch=None, steps=None): model.eval() total_loss = 0.0 with torch.no_grad(): for batch in self.val_dataloader: features, _ = batch # MultipleNegativesRankingLoss不需要labels loss = self.loss_function(features) total_loss += loss.item() avg_loss = total_loss / len(self.val_dataloader) print(f"验证损失: {avg_loss:.4f}") return {"validation_loss": avg_loss}
2. 准备验证集数据加载器
将你的val_set转换为DataLoader(与训练集一致的批次大小):
from torch.utils.data import DataLoader val_dataloader = DataLoader(val_set, batch_size=train_dataloader.batch_size)
3. 替换或组合评估器
如果需要同时保留相似度评估和损失评估,使用SequentialEvaluator:
from sentence_transformers.evaluation import SequentialEvaluator # 原相似度评估器 similarity_evaluator = EmbeddingSimilarityEvaluator.from_input_examples(val_set, name='sts-dev') # 损失评估器 loss_evaluator = ValidationLossEvaluator(val_dataloader, train_loss) # 组合评估器 evaluator = SequentialEvaluator([loss_evaluator, similarity_evaluator])
之后在model.fit()中使用这个组合评估器,每到evaluation_steps时会同时输出验证损失和相似度指标。
内容的提问来源于stack exchange,提问作者Abhas kumar
相关产品推荐
相关产品推荐

