最近在用Llama3-8B做领域微调,任务是让它更懂中文客服场景。我准备了大概2万条清洗过的对话数据,用的LoRA,rank=32,学习率2e-4,跑了3个epoch。结果验证集上BLEU和ROUGE都掉了,甚至一些原本能答对的基础中文问题现在也开始胡说八道。查了loss曲线,训练时是下降的,但生成效果就是不对。我怀疑是不是数据里中英混杂太多,还是说微调时把基座模型的通用知识给覆盖了?有没有朋友遇到过类似情况?想听听你们是怎么平衡领域能力和通用能力的,或者有没有什么检查数据质量的经验?谢谢了。
微调Llama3中文能力反而变差了,是数据问题还是我哪里搞错了?
全部回复
共 62 条这问题太典型了,八成不是LoRA参数的事,2万条数据对8B模型来说其实挺容易过拟合的,尤其你学习率还开到了2e-4。我建议你先看看训练集里是不是有大量英文模板或者中英混杂的句式,模型可能把“客服语气”和“乱码式中英混合”绑定了。另外可以试试把验证集分开算一下,只看中文纯文本的生成质量,如果还是掉,那就得考虑冻结更多层或者减小rank,给模型留点通用知识的空间。
我之前调类似任务时,把数据清洗到纯中文口语,并且加了10%的通用中文语料混着训练,效果就稳住了。你也可以查一下loss曲线末尾是不是有突然的尖峰,那通常是模型开始死记硬背训练集的信号。
我之前也踩过类似的坑,LoRA rank开到32在8B上其实风险挺大的,尤其你只跑了3个epoch,大概率是过拟合到客服话术的浅层模式上了,而把基座模型里那些常识性的语义关联给冲淡了。我后来把rank降到16,学习率调到1e-4,然后只训练1.5个epoch,效果反而稳住了。另外你提到中英混杂,这个我建议先拿一个小的通用中文测试集(比如CLUE里抽几百条)在微调前和微调后分别跑一下,如果通用分数掉得厉害,那就是灾难性遗忘太严重了,可以考虑在训练loss里加一个通用语料的正则项,或者用那种混合训练策略,每10条领域数据里混1条通用数据。数据质量上,我碰到的更隐蔽的问题是很多“清洗过”的对话其实带了系统级的噪声,比如用户和客服的角色标签混进了文本,模型学的是“怎么模仿格式”而不是“怎么回答问题”。你可以试着对训练数据做个简单的扰动测试,比如把一些实体替换成同义词,看模型输出是不是也跟着变,如果完全不变,那说明它根本没在学语义。还有个土办法,把训练集里loss最低的几百条拿出来人工看一遍,往往能发现是数据里某些高频无意义回复(比如“亲,稍等哦”)把模型带偏了。