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.py → print_training_metrics() |
快速打印首尾 loss |
1 | |
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 | |
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_loss 是 750 步算术平均。前几步 loss≈2.8 拉高均值。
不能用 0.26 判断「最终效果差」;看 Epoch 3 附近 loss 平台(0.09–0.13 波动)。
3.3 逐步波动是否正常
log 末尾:
1 | |
单步 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. 小结
- 2.81 → 0.13,主要增益在第 1 epoch。
- train_loss 0.2587 是全程均值,不等于最终质量。
- token 准确率 96% 只说明拟合标注,需推理验证语义。
- 41 分钟 / 750 step 为 V100 实测基准。
- 无 eval 集时,verify_lora.py 是必要补充。
附录:print_training_metrics 逻辑
1 | |
系列导航
| 篇目 | 链接 |
|---|---|
| 上一篇 | 06 · SFT 实战(下) |
| 下一篇 | 08 · 效果验证 |
| 索引 | README |