最近用Lora微调llama3-8b做中文法律问答,训练集是自己清洗的2w条问答对,alpaca格式。跑了3个epoch,loss降到0.8左右,但推理时回答经常出现重复句子,甚至偶尔蹦出英文。我用了中文指令数据做sft,也加了template,但感觉模型根本没学会中文表达。想问问有经验的大佬,这种情况一般是基础模型选错了(应该用qwen或yi)?还是我的数据预处理有问题?另外,lora的rank和alpha设置成8和16会不会太小了?求指点,调了一个月快崩溃了。
微调Llama3中文效果差到离谱,是数据问题还是我姿势不对?
全部回复
共 3 条说实话你这情况我太熟了,之前用llama2做中文领域模型也这德行,重复句子和蹦英文基本就是模型对中文语义空间没建立好,加上lora本身能调整的参数量有限,中文这种跟英文语系差太远的语言,8b底座那点中文能力根本不够你折腾的。我觉得问题大概率不在你那2w条数据,这个量级做领域适配够用了,但关键是你得先确认基座模型本身的中文底子,llama3的中文tokenizer效率特别低,词表里中文覆盖也一般,你不如直接换个中文预训练过的基座,比如qwen或者yi,哪怕小一点的7b版本效果都会好很多。另外你说loss到0.8,这个数值看着降下来了但可能过拟合了,你试试把epoch降到1或者1.5,加上early stopping,然后推理时把temperature调低到0.1,repeat_penalty开到1.2以上,重复句子问题能缓解不少。至于rank和alpha,8和16不算小,但如果你用的是peft默认的lora配置,建议把target_modules里全加进去,特别是q_proj和k_proj,别只动o_proj和gate_proj。最后你检查下alpaca格式的instruction和input字段是不是都填对了,有些问答对如果input为空但模型期待输入,它就会瞎编,甚至混英文出来。
同款遭遇,之前用llama2微调法律问答也是这德行,重复生成和蹦英文大概率是基座模型对中文语义空间拟合不够,llama系列中文token效率本来就低,你换qwen试试会明显感觉“通人性”很多。另外loss到0.8不代表学好了,检查下训练集里有没有大量模板化回答,那种会让模型学成复读机,建议混入一些单轮对话和多样性表述。lora rank 8确实偏小,法律这种专业领域知识压缩不够,我试过32效果明显改善,但也要配合更高alpha比如32或64,不然容易欠拟合。数据预处理看看有没有特殊符号没清洗干净,比如英文标点或者html残留,这些小细节很影响生成质量。
同款经历,之前用llama2做医疗问答也这样,重复生成和蹦英文多半是中文语料在base模型里占比太低,lora那点参数量掰不回来。你这数据量其实够了,但建议先拿几十条数据做下overfit测试,如果还复读,那基本就是基座选型问题,换qwen或yi立竿见影。另外rank 8确实偏小,我后来用到32-64才感觉指令遵循有改善,alpha跟着翻倍就行。模板那块也检查下chat template是不是和训练格式完全一致,不一致会导致推理时上下文错乱。