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

如何在Hugging Face中计算微调Qwen模型的验证损失并用于评估?

基于Hugging Face Transformers的Qwen模型损失评估与曲线绘制

一、用损失函数评估训练后的模型

你当前的训练配置已经开启了验证损失自动计算(eval_strategy="steps"、metric_for_best_model="eval_loss"),训练后可通过以下方式获取并分析损失:

1. 训练完成后直接评估

训练结束后,调用trainer.evaluate()即可自动在验证集上计算对应损失:

eval_results = trainer.evaluate()
print(f"验证集损失: {eval_results['eval_loss']}")

2. 加载指定Checkpoint评估

若要评估不同训练阶段的模型(比如某一保存的checkpoint),可从输出目录加载对应模型后再执行评估:

from transformers import DPOTrainer

# 替换为你的checkpoint路径
trainer = DPOTrainer.from_pretrained(
    model_name_or_path="./output_dir/checkpoint-25000",
    processing_class=tokenizer,
    args=training_args,
    eval_dataset=dataset['valid']
)

eval_results = trainer.evaluate()
print(f"该Checkpoint验证损失: {eval_results['eval_loss']}")

3. 手动计算细粒度损失

如果需要针对单个样本或小批量计算损失,可手动执行模型前向传播:

import torch

# 取验证集中的一个样本
sample = dataset['valid'][0]
inputs = tokenizer(sample['prompt'], sample['completion'], return_tensors="pt").to(model.device)

# 无梯度计算损失
with torch.no_grad():
    outputs = model(**inputs, labels=inputs['input_ids'])
    loss = outputs.loss.item()

print(f"单样本损失: {loss}")

二、绘制损失曲线筛选最优训练会话

训练过程中,Hugging Face会在输出目录生成trainer_state.json文件,记录每一步的训练损失和验证损失,基于此可绘制曲线并筛选最优会话:

1. 读取训练日志数据

import json

# 加载训练状态文件
with open("./output_dir/trainer_state.json", "r") as f:
    trainer_state = json.load(f)

# 提取训练/验证损失与对应步数
train_losses = []
train_steps = []
eval_losses = []
eval_steps = []

for entry in trainer_state['log_history']:
    if 'loss' in entry:
        train_steps.append(entry['step'])
        train_losses.append(entry['loss'])
    if 'eval_loss' in entry:
        eval_steps.append(entry['step'])
        eval_losses.append(entry['eval_loss'])

2. 绘制损失曲线

使用matplotlib绘制训练/验证损失曲线,若有多个训练会话,可将多个日志数据叠加对比:

import matplotlib.pyplot as plt

plt.figure(figsize=(12, 6))
plt.plot(train_steps, train_losses, label='训练损失', alpha=0.6)
plt.plot(eval_steps, eval_losses, label='验证损失', marker='o', alpha=0.8)

plt.xlabel('训练步数')
plt.ylabel('损失值')
plt.title('训练与验证损失曲线')
plt.legend()
plt.grid(True)
plt.show()

3. 筛选最优训练会话

  • 查看曲线中验证损失最低的点,对应的训练步数即为最优阶段,对应目录下的checkpoint就是最优模型
  • 若存在多个训练会话,对比每个会话的最低验证损失,选择损失最小的会话对应的模型

内容的提问来源于stack exchange,提问作者Kathi Meyer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 10:17:05