这个坑值得记一笔。用 500 条对话数据训练 LoRA,跑了三个 epoch,loss 一直在 2.3 附近小幅波动,生成结果和原模型几乎一样。

刚开始盯着「数据格式与模板不匹配,模型看到的不是对话结构」,折腾了半个多小时,排掉了。

排查方向其实有限,先把可能性排一排。学习率按全参微调的 1e-5 设,对 LoRA 太小;标签掩码没设对,loss 其实在学填充符;梯度累积步数过大,等效 batch 太小导致更新稀疏。

上来先把学习率提到 LoRA 常用区间

python train.py --learning_rate 2e-4 --num_train_epochs 3

随后检查标签里 -100 的比例是否合理

python -c "import torch;print((labels==-100).float().mean())"

然后用单条样本过拟合,验证流程本身是否通

python train.py --overfit_one true --steps 50

等前面都确认过,再打印实际送入模型的文本片段

print(tokenizer.decode(input_ids[0][:200]))

怎么算真的好了,看的是同一批现象。单条过拟合试验里 loss 能降到 0.2 以下,正常训练时 loss 稳步下降,生成风格出现明显变化。

补一句。loss 不动先别调超参,先确认模型真的看到了目标内容,模板拼接错误时 loss 会稳定在一个看似正常的数值上。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189