最近在调一个中文法律问答的LoRA,基座用的Qwen2.5-7B。训练集是自己爬的裁判文书+法条问答,大概2万条,清洗得还算干净。跑完3个epoch后,测试集上法律问题回答得挺像样,但一聊日常话题就崩,比如问“今天天气怎么样”它会一本正经引用法条。我试过把学习率从2e-4降到1e-4,情况好一点但依然存在,又不敢再降怕欠拟合。想问问有经验的朋友,这种局部能力增强但全局退化的情况,一般先调什么?是数据配比的问题,还是应该加一些通用语料混合训练?另外我看有人说用AdamW比Adam稳定,真的差很多吗?求指点。
LoRA微调后灾难性遗忘严重,是学习率太高还是数据集太杂?
全部回复
共 65 条这就是典型的灾难性遗忘,跟学习率关系真不大,降lr只是缓解表象。你2万条全是法律垂直语料,模型在这方向过拟合了,通用能力被挤掉很正常。我建议你在训练集里混10%到20%的通用中文指令数据,比如alpaca中文或者自家积累的日常对话,比例可以一点点试。数据配比这块比调lr重要得多,光降lr只会让法律能力也学不透。另外LoRA本身秩和target modules也有影响,r设太大、qkv全挂上更容易覆盖原能力,可以试试只挂q_proj和v_proj,r降到8或者16。AdamW和Adam比,主要是权重衰减解耦后对LoRA这种小参数量更稳,但差距没你想的那么大,别指望换个优化器就解决遗忘。还有个偏方是训练完把LoRA权重和基座做插值,或者用少一点epoch、早点停,你3个epoch可能已经过头了。
法律数据太垂直了,2万条全是同一领域,模型很容易把整个输出空间都往法条那边拉,日常对话崩掉不奇怪。建议掺10%-20%的通用指令数据进去一起训,比一味降学习率管用。另外LoRA只动低秩部分,遗忘一般没全参那么狠,可以试试把rank调小一点或者只挂q、v投影。AdamW和Adam在LoRA场景差别没那么玄学,权重衰减确实能稍微压一下漂移,但别指望靠它解决数据配比的问题。
这个现象挺典型的,2万条全是法律垂直数据,模型基本被你拽到法律分布里去了,日常能力不掉才怪。降学习率只能缓解,治不了根,因为问题出在数据分布上而不是优化器。我自己做过类似的医疗LoRA,后来掺了大概15%的通用指令数据进去,遗忘立马好转很多,你可以先从10%到20%这个比例试。另外3个epoch对LoRA来说其实偏多了,1到2个epoch往往就够,跑太多容易把小模型往窄路上带。AdamW和Adam的差别没你想的那么大,权重衰减对LoRA这种低秩矩阵影响本来就有限,别在这上面花太多精力。倒是可以看看你的target modules是不是只挂了q和v,如果mlp层也加上,容量大了反而更容易过拟合窄领域。法律问答这种任务,其实还可以考虑在推理时用system prompt约束一下场景,让它别到处引法条。
2万条全是法律语料,3个epoch确实容易把模型带偏。我一般会在LoRA训练里掺10%-20%的通用指令数据,哪怕就几千条,对保住日常对话能力效果挺明显。学习率降到1e-4还崩的话,先别急着怀疑优化器,数据配比的问题更大一些。AdamW和Adam区别没传说中那么神,权重衰减方式不同而已,你这情况换优化器大概率治标不治本。
混点通用语料再跑吧,纯法律数据训3轮不崩才怪。