最近用Lora微调llama3-8b做中文法律问答,训练集是自己清洗的2w条问答对,alpaca格式。跑了3个epoch,loss降到0.8左右,但推理时回答经常出现重复句子,甚至偶尔蹦出英文。我用了中文指令数据做sft,也加了template,但感觉模型根本没学会中文表达。想问问有经验的大佬,这种情况一般是基础模型选错了(应该用qwen或yi)?还是我的数据预处理有问题?另外,lora的rank和alpha设置成8和16会不会太小了?求指点,调了一个月快崩溃了。
微调Llama3中文效果差到离谱,是数据问题还是我姿势不对?
全部回复
共 11 条说实话你这情况我太熟了,之前用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是不是和训练格式完全一致,不一致会导致推理时上下文错乱。
说实话你这个情况我太懂了,llama3基座的中文能力本来就不行,尤其法律这种术语密集的领域,它内部表征里就没存够对应的中文语义映射,lora再调也是隔靴搔痒。我建议你先别纠结rank和alpha,8和16对于2w条数据其实够用,问题大概率出在基座模型选择上,可以试试qwen2.5或者yi-1.5,中文语料预训练占比高很多。另外你检查过tokenizer分词效果没,llama3的tokenizer对中文很不友好,经常把一个词拆得稀碎,这会导致模型学的是碎片拼接而不是语义关联,重复句子很可能就是注意力被拆散的词带偏了。还有个坑是alpaca格式里的instruction和input字段,如果你法律问答的上下文都塞在instruction里,而input留空,模型可能根本没学会把问题跟答案对齐。建议你拿几条训练样本单独做一次推理,看看loss降下来之后生成的开头几个token是不是已经在胡说,如果是,那就是数据格式里隐含的指令跟随信号太弱了。最后,2w条对法律领域来说真的不算多,你可以考虑混合一些通用中文sft数据进去,保持比例在1比3左右,防止模型灾难性遗忘原有的中文表达能力。别崩溃,这玩意调一个月太正常了,换模型重跑一遍可能三天就出效果。
说实话你这情况我当初调中文SFT也遇到过,八成不是rank的问题,8和16够用了。核心还是基础模型选型,llama3词表里中文token占比本来就不高,你硬让它学法律问答等于让老外背法条,输出肯定容易崩。建议直接换Qwen或者Yi系列,中文语料底子好,省一大半调参时间。另外你那2w条数据清洗时注意下有没有重复片段或英文残留,loss到0.8但生成重复句子,也可能是数据里本身就有大量模板化句子导致模型学坏了。
同款痛苦面具,我之前用llama3微调法律咨询也这样,重复和蹦英文大概率是数据里混了太多英文模板词,清洗时没删干净。建议换个思路,直接把基座换成qwen2.5或chatglm3,中文语义空间本来就更友好,省下的调参时间够你刷三遍数据了。rank16/alpha32起步试下,但别指望这个解决根本问题,重点看数据里有没有大量“问题-答案”格式不统一或者答案带特殊符号的情况。另外可以试试把epoch降到1-2,loss太低反而容易过拟合到训练集的噪音上。
loss 0.8对生成任务来说其实不算低,而且重复输出+蹦英文更像是数据格式或template没对齐导致的。llama3中文底子确实弱,法律领域术语又多,换qwen或yi会省不少事。rank 8偏小,法律问答这种专业场景可以试试32或64,alpha跟着rank一半到一倍调。另外检查下你的template是不是跟训练时用的完全一致,推理时差一个token都可能让模型懵掉。
rank 8确实偏小,中文任务建议试试32或64,数据质量比模型选择更关键。
Llama3原版中文底子本来就一般,SFT只能激活它已有的能力,你拿它硬做中文法律问答,重复和蹦英文太正常了。rank=8确实偏小,中文任务我一般16起步,alpha给32,效果会稳不少。不过你loss能到0.8反而要警惕,法律问答这种任务这么低很容易过拟合,重复句子就是典型症状。建议先换qwen或yi-base试一版,同样的数据大概率直接起飞,别在llama3上死磕了。
Llama3中文本来就不行,换qwen或yi吧,我试过效果差挺多。rank8确实小了点,中文任务可以试试32。
重复句子和蹦英文这两个症状,八成是数据格式或者template没对齐导致的。llama3本身中文能力就不太行,用中文sft想把它掰过来,2w条其实有点悬,模型很容易在生成时退回到预训练里的英文分布。loss降到0.8不代表模型学会了,可能只是记住了训练集的模板套路。你检查下alpaca格式里的instruction和output是不是被正确拼接了,llama3的chat template有它自己的一套特殊token,如果你手动拼的格式跟它预训练时不一致,模型会懵。rank和alpha倒不是主要问题,8和16做法律问答勉强够用,但可以试试rank设到32看看有没有改善。说真的,做中文任务直接上qwen或者yi会省心很多,llama3的中文底子就那样,硬调性价比不高。