大模型微调训练FAQ - 训练日志解读

📋 目录


训练日志指标详解

❓ Q: 训练日志中的各个指标分别代表什么含义?

A: 以下是你在train_sft.py中可能遇到的关键指标:

🏃‍♂️ 训练过程指标
{'loss': 0.1435, 'grad_norm': 9.671, 'learning_rate': 2.92e-06, 
 'entropy': 1.843, 'num_tokens': 7233941.0, 
 'mean_token_accuracy': 0.954, 'epoch': 2.07}
指标 数值示例 含义解读 正常范围
loss 0.1435 交叉熵损失,越小越好 0.01-1.0
grad_norm 9.671 梯度范数,反映梯度大小 0.1-10.0
learning_rate 2.92e-06 当前学习率 随训练衰减
entropy 1.843 预测分布熵,反映不确定性 0.5-3.0
num_tokens 7233941.0 累计处理的token数量 持续增长
mean_token_accuracy 0.954 token级预测准确率 0.7-0.98
epoch 2.07 当前训练轮数 0.0-总轮数
🧪 验证过程指标
{'eval_loss': 0.2582, 'eval_runtime': 92.38, 'eval_samples_per_second': 20.415, 
 'eval_steps_per_second': 2.555, 'eval_entropy': 1.832, 
 'eval_num_tokens': 7233941.0, 'eval_mean_token_accuracy': 0.926, 'epoch': 2.07}
指标 数值示例 含义解读 正常范围
eval_loss 0.2582 验证集交叉熵损失 通常 > 训练loss
eval_runtime 92.38 验证总耗时(秒) 取决于数据量
eval_samples_per_second 20.415 验证吞吐量 越高越好
eval_steps_per_second 2.555 验证步频 越高越好
eval_entropy 1.832 验证集预测熵 应与训练entropy接近
eval_num_tokens 7233941.0 验证集token总数 固定值
eval_mean_token_accuracy 0.926 验证集token准确率 通常 < 训练准确率

日志状态评估

❓ Q: 如何判断训练日志中的指标是否正常?

A: 根据你的实际日志,我们来评估训练状态:

📊 你的日志分析

训练指标状态:

{'loss': 0.1435, 'grad_norm': 9.671, 'learning_rate': 2.92e-06, 
 'entropy': 1.843, 'mean_token_accuracy': 0.954, 'epoch': 2.07}

评估结果:

指标 状态评估 说明
loss 0.1435 ✅ 优秀 SFT训练中属于很好的水平
grad_norm 9.671 ⚠️ 略高 建议监控,可能需要调整学习率
learning_rate 2.92e-06 ✅ 正常 符合余弦衰减预期
entropy 1.843 ✅ 合理 预测分布不确定性适中
token_accuracy 95.4% ✅ 优秀 token级别预测效果很好

验证指标状态:

{'eval_loss': 0.2582, 'eval_mean_token_accuracy': 0.926}

对比分析:

对比项 训练值 验证值 差异 评估
Loss 0.144 0.258 +80% ⚠️ 轻微过拟合
Token准确率 95.4% 92.6% -2.8% ✅ 泛化良好
Entropy 1.843 1.832 -0.6% ✅ 一致性很好
🎯 整体训练状态评估

当前状态:轻微过拟合倾向,但整体健康

积极信号:

  • ✅ 训练loss较低且稳定
  • ✅ token准确率达到95%+的优秀水平
  • ✅ 验证集准确率下降幅度很小(仅2.8%)
  • ✅ 训练和验证的entropy基本一致

需要注意:

  • ⚠️ 训练和验证loss差距较大(80%)
  • ⚠️ 梯度范数略高(9.671),可能存在不稳定

常见问题诊断

❓ Q: 训练过程中出现哪些异常信号需要警惕?

A: 以下是常见的异常信号和诊断方法:

🚨 严重问题信号

1. 梯度爆炸

# 异常日志
{'grad_norm': 50.0+, 'loss': nan/inf}

症状:

  • grad_norm > 20
  • loss变成nan或inf
  • 模型输出异常

解决方案:

  • 降低学习率
  • 检查数据预处理
  • 增加梯度裁剪

2. 梯度消失

# 异常日志
{'grad_norm': < 0.01, 'loss': 几乎不下降}

症状:

  • grad_norm接近0
  • loss长时间不下降
  • 模型学习停滞

解决方案:

  • 检查模型初始化
  • 调整学习率(可能太小)
  • 检查数据标签

3. 严重过拟合

# 异常模式
train_loss: 0.01
eval_loss: 1.5+  # 差距巨大

症状:

  • 训练loss很小,验证loss很大
  • 验证准确率开始下降
  • loss差距持续扩大

解决方案:

  • 增加dropout
  • 增加权重衰减
  • 减少模型复杂度
  • 增加训练数据
⚠️ 需要关注的信号

1. 训练不稳定

# 波动较大的日志
step 100: loss 0.5
step 200: loss 0.2
step 300: loss 0.6  # 反弹
step 400: loss 0.3

症状:

  • loss曲线剧烈震荡
  • grad_norm波动大
  • 准确率不稳定

2. 学习率调度问题

# 学习率异常
learning_rate: 3e-6  # 正常
learning_rate: 1e-8  # 可能太小
learning_rate: 1e-3  # 可能太大

3. 内存使用异常

# 相关指标
eval_runtime: 异常增加
eval_samples_per_second: 异常降低

❓ Q: 如何根据日志调整训练策略?

A: 基于日志反馈的调整策略:

📈 Loss相关调整

Case 1: Loss下降缓慢

# 日志表现
epoch 1: loss 1.2
epoch 5: loss 1.1  # 下降很慢

调整策略:

  • 增加学习率(如3e-6 → 5e-6)
  • 检查数据质量
  • 调整LoRA参数(增加r或alpha)

Case 2: Loss震荡剧烈

# 日志表现
step 100: loss 0.3
step 200: loss 0.8  # 大幅反弹
step 300: loss 0.2

调整策略:

  • 降低学习率
  • 增加warmup步数
  • 检查数据分布
🎯 准确率相关调整

Case 1: 准确率提升缓慢

# 日志表现
token_accuracy: 0.850.870.88  # 提升缓慢

调整策略:

  • 增加训练轮数
  • 调整batch_size
  • 检查数据标签质量

Case 2: 过拟合早期信号

# 日志表现
train_accuracy: 0.95
eval_accuracy: 0.92
# 且差距在持续扩大

调整策略:

  • 增加dropout(如0.1 → 0.15)
  • 增加权重衰减(如0.01 → 0.02)
  • 实施早停策略

监控最佳实践

❓ Q: 如何设置有效的监控策略?

A: 建议采用多层次监控策略:

🔄 实时监控(每步/每100步)

关键指标:

training_args = SFTConfig(
    logging_steps=100,      # 每100步记录
    logging_dir="./logs",    # 日志保存路径
)

监控内容:

  • loss变化趋势
  • grad_norm稳定性
  • learning_rate衰减
  • token_accuracy提升
📊 定期评估(每1000步)

验证配置:

training_args = SFTConfig(
    eval_strategy="steps",   # 按步数验证
    eval_steps=1000,       # 每1000步验证
    do_eval=True,           # 启用验证
)

监控内容:

  • 训练vs验证loss差距
  • 训练vs验证准确率差距
  • 过拟合趋势
  • 泛化能力变化
💾 模型检查点管理

保存策略:

training_args = SFTConfig(
    save_strategy="steps",        # 按步数保存
    save_steps=1000,            # 每1000步保存
    save_total_limit=10,         # 最多保留10个检查点
)

选择最佳检查点:

  • 优先选择验证loss最低的点
  • 其次考虑验证准确率最高的点
  • 避免选择训练loss最低但验证loss高的点

❓ Q: 如何建立异常预警机制?

A: 建议设置阈值监控和自动预警:

🚨 阈值设置

训练异常阈值:

# 危险阈值
GRAD_NORM_MAX = 20.0      # 梯度范数上限
LOSS_NAN_THRESHOLD = True   # loss为nan/inf
ACCURACY_DROP_THRESHOLD = 0.1  # 准确率下降阈值

# 警告阈值  
GRAD_NORM_WARN = 10.0     # 梯度范数警告
LOSS_GAP_WARN = 2.0        # 训练验证loss差距警告

实现监控脚本:

def monitor_training_log(log_entry):
    # 梯度爆炸检查
    if log_entry.get('grad_norm', 0) > GRAD_NORM_MAX:
        send_alert("梯度爆炸警告!")
    
    # Loss差距检查
    train_loss = log_entry.get('loss', 0)
    eval_loss = log_entry.get('eval_loss', 0)
    if train_loss > 0 and eval_loss / train_loss > LOSS_GAP_WARN:
        send_alert("可能出现过拟合!")
📈 可视化监控

推荐工具:

  • TensorBoard:自动曲线绘制
  • SwanLab:你的代码中已集成
  • WandB:云端监控

关键图表:

  1. Loss曲线:训练loss vs 验证loss
  2. 准确率曲线:训练准确率 vs 验证准确率
  3. 学习率曲线:学习率衰减情况
  4. 梯度范数曲线:训练稳定性监控

📋 监控检查清单

每100步检查:
  • loss是否正常下降?
  • grad_norm是否在合理范围?
  • learning_rate是否按预期衰减?
  • 有无nan或inf值?
每1000步检查:
  • 训练vs验证loss差距是否合理?
  • 验证准确率是否稳定提升?
  • 是否出现过拟合迹象?
  • entropy是否稳定?
每个epoch检查:
  • 整体训练趋势是否健康?
  • 是否需要调整超参数?
  • 当前最佳检查点是哪个?
  • 是否需要提前停止训练?

📚 相关资源

推荐阅读

实用工具

  • TensorBoard:本地可视化监控
  • SwanLab:云端实验跟踪(你的代码已集成)
  • Weights & Biases:专业ML实验管理
  • MLflow:开源MLOps平台

实践建议

  1. 建立监控习惯:定期查看训练日志和可视化图表
  2. 设置合理阈值:根据任务特点设置预警阈值
  3. 保存关键检查点:不仅保存最佳模型,也要保存关键状态
  4. 文档记录:详细记录异常情况和解决方案

最后更新:2026-01-19
基于实际训练对话整理

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐