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

使用Hugging Face Trainer微调QA模型时无验证损失及指标日志求助

微调QA模型无验证日志问题的排查与解决

原因1:训练参数未开启评估策略

如果TrainingArguments里没配置评估相关参数,Trainer不会触发验证环节,自然不会生成验证损失和metrics日志。

  • 解决:必须指定evaluation_strategy(可选steps按步数评估或epoch按轮次评估),同时设置eval_steps和logging_steps控制评估与日志输出频率:
    training_args = TrainingArguments(
        output_dir="./results",
        evaluation_strategy="steps",
        eval_steps=500,  # 每500步执行一次验证
        logging_steps=100,  # 每100步记录一次日志
        logging_dir="./logs",
        # 其他训练参数...
    )
    

原因2:compute_metrics函数错误或未正确传入

QA任务的metrics计算有特殊格式要求,若函数逻辑错误,或Trainer初始化时漏传该参数,日志里不会显示accuracy和f1。

  • 解决:
    1. 确保函数接收EvalPrediction对象,正确处理QA的start/end logits,返回包含accuracy、f1键的字典:
      from datasets import load_metric
      import numpy as np
      
      squad_metric = load_metric("squad")
      
      def compute_metrics(pred):
          # 拆分预测值与标签
          start_logits, end_logits = pred.predictions
          start_labels, end_labels = pred.label_ids
      
          # 将logits转换为预测的span位置
          start_preds = np.argmax(start_logits, axis=1)
          end_preds = np.argmax(end_logits, axis=1)
      
          # 计算准确率:start和end位置都匹配才算正确
          accuracy = np.mean((start_preds == start_labels) & (end_preds == end_labels))
      
          # 用SQuAD官方metric计算F1(需按SQuAD格式构造预测与参考数据)
          squad_results = squad_metric.compute(predictions=your_formatted_preds, references=your_formatted_refs)
          f1_score = squad_results["f1"]
      
          return {"accuracy": accuracy, "f1": f1_score}
      
    2. 初始化Trainer时必须传入compute_metrics=compute_metrics,不可遗漏。

原因3:未传入有效验证数据集

如果eval_dataset为空,或验证集未完成正确预处理(缺少start_positions、end_positions等必要字段),Trainer无法执行验证,自然无日志输出。

  • 解决:确保验证集与训练集做了相同的tokenization预处理,且初始化Trainer时明确指定:
    trainer = Trainer(
        model=model,
        args=training_args,
        train_dataset=processed_train_dataset,
        eval_dataset=processed_eval_dataset,  # 传入预处理完成的验证集
        compute_metrics=compute_metrics,
        # 其他参数...
    )
    

原因4:日志等级过高导致日志被过滤

若logger等级设置为WARNING或ERROR,INFO级别的验证日志会被屏蔽。

  • 解决:将日志等级调整为INFO:
    import logging
    logging.basicConfig(level=logging.INFO)
    
    # 也可单独设置Transformers库的日志等级
    from transformers import logging as hf_logging
    hf_logging.set_verbosity_info()
    

原因5:未触发评估流程

调用trainer.train()后,可能因训练提前终止或参数问题未执行评估步骤。可手动调用trainer.evaluate()触发一次验证:

  • 如果手动调用能输出metrics,说明是训练时的日志触发时机问题;
  • 如果手动调用也无输出,说明评估逻辑本身存在错误,需重新检查数据集或compute_metrics函数。

内容的提问来源于stack exchange,提问作者Leran Zhang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 18:17:29