You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 06:30:32