0. 系列闭环

本篇位置 上游 本篇产出 下游
第 7/10 篇 第 06 篇训练完成 指标解读、是否收敛的判断 第 08 篇定性验证 · 决定是否加 epoch

本篇只解读已有日志,不编造曲线。所有数字可 grep all_logs.log 复核。


1. 要解决的实际问题

训练跑完后常见疑问:

  • loss 2.8 → 0.13,算好吗?
  • 为什么平均 train_loss 0.26 比最后一步 0.13 大很多?
  • 最后几步 loss 反弹(0.094 → 0.129)是不是训坏了?
  • 没有 eval_loss 怎么判断过拟合?

2. 实现位置

文件 内容
LoRA_Demo/all_logs.log 1548 行,含逐步 Callback + 汇总
output/lora_elderly_single/checkpoint-*/trainer_state.json 结构化 log_history
LoRA_Demo/verify_lora.pyprint_training_metrics() 快速打印首尾 loss
1
python verify_lora.py --metrics

3. 四个里程碑(日志原文)

Step Epoch loss mean_token_accuracy 来源
1 0.00 2.8099 0.436 log 第 42 行
250 1.00 0.2402 0.957 log 第 540 行
500 2.00 0.1443 0.967 log 第 1040 行
750 3.00 0.1286 0.963 log 第 1540 行

汇总行(log 第 1542 行):

1
2
{"train_runtime": "2484", "train_samples_per_second": "1.208",
"train_steps_per_second": "0.302", "train_loss": "0.2587", "epoch": "3"}

3.1 三阶段解读

Phase A(Step 1–250):快速下降
loss 2.81 → 0.24。模型学会:

  • Qwen chat 模板下的 token 排列
  • assistant 回复的共情句式高频模式

Phase B(250–500):放缓
0.24 → 0.14。开始拟合更细的用词差异。

Phase C(500–750):边际递减
0.14 → 0.13。继续训有收益但不大;若加第 4 epoch,需警惕对 1000 条样本过拟合。

3.2 train_loss 0.2587 vs 最终 0.1286

train_loss750 步算术平均。前几步 loss≈2.8 拉高均值。
不能用 0.26 判断「最终效果差」;看 Epoch 3 附近 loss 平台(0.09–0.13 波动)。

3.3 逐步波动是否正常

log 末尾:

1
2
3
Step 748: loss=0.0940
Step 749: loss=0.1099
Step 750: loss=0.1286

单步 loss 受 当前 batch 两条样本 影响。750 略升不是训崩,看 700–750 均值即可。


4. token 准确率

Transformers 日志字段 mean_token_accuracy

Step 准确率
1 43.6%
250 95.7%
750 96.3%

在 SFT 上,这接近「下一个 token 是否猜对标注」。96%+ 说明模型已能复现训练集 assistant 用词;仍需第 08 篇看泛化,因为准确率不衡量「是否说教」。


5. 学习率调度

Step lr
1 2.0e-4
250 1.34e-4
500 6.69e-5
750 2.67e-7

默认线性 decay。LoRA 常用恒定 lr 或 cosine;本项目 linear 已收敛,无需事后改调度重训。


6. 吞吐与成本

指标
train_runtime 2484 s ≈ 41 分 23 秒
s/it ~3.31 s(tqdm)
samples/s 1.208

估算云成本:按 V100 小时价 × 0.69h。个人实验可接受。


7. 没有 eval_loss 时如何判断

本项目 train_dataset = 全部 1000 条,无 hold-out。

手段 做法
定性 verify_lora.py 默认 3 题 + 自定义 user
定量(未做) 切 100 条验证集,eval_strategy="steps"
过拟合信号 训练 loss 继续降但验证回复复读训练句

当前 loss 平台 + 验证样例(Mac MPS 实测三条自定义 user)显示风格达标,但未做严格 held-out 指标——写论文或产品报告时需补验证集。


8. checkpoint 选择

目录 适用
final_lora 默认部署/验证
checkpoint-700 若 750 生成质量异常可 A/B
checkpoint-500 loss 已较低,想减过拟合风险可试

本项目 750 步表现正常,无需回退。


9. 踩坑

坑 1:只看 tqdm loss 不看 Callback
两者应一致;若 Callback 无输出,检查是否删掉 TrainingProgressCallback

坑 2:把 grad_norm 单步 spike 当失败
Step 750 grad_norm=1.14 略高于常见 0.6–0.9,单步可接受。

坑 3:期望 loss → 0
SFT loss 是交叉熵,标注有随机性(同义不同句),0.1 附近平台正常。

坑 4:用旧版 log 对比新参数训练
改 batch/epochs 后 step 总数变,曲线不可横向比。


10. 小结

  1. 2.81 → 0.13,主要增益在第 1 epoch。
  2. train_loss 0.2587 是全程均值,不等于最终质量。
  3. token 准确率 96% 只说明拟合标注,需推理验证语义。
  4. 41 分钟 / 750 step 为 V100 实测基准。
  5. 无 eval 集时,verify_lora.py 是必要补充。

附录:print_training_metrics 逻辑

1
2
3
4
5
6
7
8
# LoRA_Demo/verify_lora.py 第 60-94 行

logs = [x for x in state["log_history"] if "loss" in x]
first, last = logs[0], logs[-1]
print(f" 起始 loss: {first['loss']:.4f} (step {first['step']})")
print(f" 最终 loss: {last['loss']:.4f} (step {last['step']})")
if "mean_token_accuracy" in last:
print(f" 最终 token 准确率: {last['mean_token_accuracy']:.1%}")

系列导航

篇目 链接
上一篇 06 · SFT 实战(下)
下一篇 08 · 效果验证
索引 README

← 返回 LoRA 老年陪伴专题