最近在尝试用LoRA微调Llama3-8B,想让它在中文法律问答上更专业一点。我准备了大概2万条QA数据,格式是alpaca那种的(instruction/input/output),用transformers+peft跑的。训练loss降到0.8左右,但推理时发现模型中文流畅度明显下降,甚至有时会蹦英文,而且原本会的通用知识也变差了。我怀疑是不是数据里中文占比太高,或者学习率设太大了(用的2e-4)。有没有大佬遇到过类似情况?是继续加大数据量还是调整超参数?或者应该用中文基座模型(比如Qwen)而不是硬啃Llama?求指点,卡里预算不多了。
微调Llama3中文能力反而变差了,是我数据格式错了吗?
全部回复
共 84 条你这个现象我调小模型时也撞见过,loss看着挺正常但生成质量崩了,大概率不是数据格式的问题。alpaca模板本身没毛病,但2万条中文法律QA对Llama3这种英文占比极高的基座来说,微调时会把它的英文语义空间“带偏”,尤其你学习率2e-4对LoRA来说偏激进,很容易破坏原生的通用表征。我建议你先降到5e-5试跑几百步看生成效果,同时把训练数据里中文比例控制在30%以下,混合一些通用中文语料做缓冲,别全喂垂直领域。另外你说的“蹦英文”很可能是tokenizer里中文词表覆盖不足,Llama3的中文能力本来就靠英文token拼凑,你强行用中文微调等于在它不擅长的区域硬改权重,不如换个思路:用Qwen或Yi这类原生中文基座,哪怕参数小一号,法律问答的流畅度和知识保留都会好很多。预算有限的话,优先考虑Qwen1.5-7B加LoRA,数据量可以砍到1万条,学习率用1e-4,效果大概率比你现在硬啃Llama3强。还有个细节,你检查下input字段是不是很多空值,有时候空输入会导致模型学到“忽略用户问题”的模式,这也会让通用能力退化。
说实话2e-4对LoRA微调中文任务确实偏激进了,我试过类似参数,模型直接开始中英混杂。建议先降到1e-4或者5e-5跑个几百步看看loss走势,另外alpaca格式里input留空和填真实上下文效果差挺多的,你检查下数据里是不是有大量空input导致学习偏差。
数据量我倒觉得2万条不算少,但中文法律语料本身跟Llama预训练分布差太远,只靠LoRA很难彻底迁移。你要是不执着于跟Llama死磕,换个思路用Qwen或者Yi这种原生中文模型做基座,同样预算下效果会稳很多,我身边好几个做法律问答的都这么转了,省时省力。
不过通用知识变差这个点,很可能是灾难性遗忘,可以在训练时混入5%-10%的通用中文数据做正则,能缓解不少。卡不够的话先用小batch加梯度累积,别急着砍数据量,先调超参试试。
说实话你这情况太典型了,LoRA微调中文数据比例一高,模型确实容易“忘本”,2e-4的学习率对8B来说偏激进,建议降到5e-5左右试试。另外alpaca格式本身没问题,但法律问答这种专业领域,input和output的区分度不够,模型容易把指令和内容搞混,可以试试纯指令+回答的格式。预算有限的话别硬啃Llama,Qwen-7B或14B基座对中文和法律的先验知识好很多,LoRA效果立竿见影,省下的调参时间都够你跑好几轮了。我上次用1万条医疗数据微调Llama也崩过,换成中文基座后loss降到0.5就稳了。
说实话2e-4对LoRA确实偏高了,中文数据占比大不是问题,但学习率太大会把原模型权重冲垮,建议先降到5e-5试试,同时把LoRA的r值调小到8或16。另外你检查下数据里有没有混入英文标点或半角符号,我上次就是清洗没做干净导致模型输出中英混杂。如果调完还不行,直接换Qwen吧,硬啃Llama的话数据量得翻倍才有效果,你这预算撑不住。