微调时Loss突然爆炸?老司机带你拆解典型故障
昨天深夜收到同事一条消息:“模型训到第三个epoch,loss突然从0.8飙升到nan,学习率已经调到1e-5了,怎么办?” 这场景太熟悉了——每个做过微调的人,大概都在凌晨两点见过类似的恐怖画面。今天我们就来拆解这些典型故障,把踩过的坑填平。
梯度爆炸:不只是学习率的问题
看到loss爆炸,第一反应往往是调小学习率。这没错,但治标不治本。上周我调试一个7B模型时发现,即使学习率降到1e-6,第10个batch还是会出现梯度范数突然增大三个数量级的情况。
关键线索在权重分布上。用这个简单脚本快速检查:
# 训练循环里插一段诊断代码forname,paraminmodel.named_parameters():ifparam.gradisnotNone:grad_norm=param.grad.norm().item()ifgrad_norm>1000:# 经验阈值,超过这个要警惕p