最近在跟一个教程用LoRA微调Llama-3-8B,做中文法律问答。数据集是网上爬的几千条问答对,清洗过,长度都在512以内。用的transformers+peft,LoRA rank=8,alpha=16,学习率设了2e-4,跑了3个epoch。结果训练loss降到1.2左右,但推理时模型输出全是重复的“嗯嗯嗯”或者乱码,偶尔蹦出几个英文单词。我把学习率降到5e-5重新跑,loss降到0.9,可输出还是不对劲,像在背训练集里的片段拼凑。我怀疑是不是中文分词没处理好,或者是base model本身英文占比太高?有没有大佬遇到过类似情况,一般先排查数据还是调参?
用LoRA微调LLaMA-3后输出全是乱码,是学习率太高还是数据问题?
全部回复
共 27 条loss降到1.2但输出崩了,大概率不是学习率的事,更像是数据格式或者target模块没设对。你检查下训练时labels是不是只对答案部分算loss?如果连问题带答案一起算,模型学出来的就是拼接逻辑,推理时自然乱。另外几千条数据3个epoch可能过拟合了,loss低不代表生成质量好。建议先拿20条训练样本做推理对比,看是不是在复读训练集,如果是就减epoch或者加dropout。
重复“嗯嗯嗯”这种一般是训练数据里有大量类似短回复,模型学到了复制模式。先别急着调参,拿几条训练样本手动推理看看,排除下tokenizer是不是把中文切碎了。另外LoRA的target_modules确认下有没有覆盖到q_proj和v_proj,只挂部分层的话中文能力基本激活不起来。我上次用alpaca格式模板,中文任务不加eos token就老出这毛病。
loss降到1.2还输出乱码,大概率不是学习率的问题了,更像数据本身有毛病。你爬的问答对里是不是混了不少重复样本或者格式残缺的?模型可能学会了“只要输出类似训练集里的片段就能降loss”,所以推理时就在那儿拼凑。建议先抽几十条训练数据肉眼过一遍,重点看问答边界是不是清晰、有没有奇怪的符号。另外中文法律领域LLaMA-3本身底子就弱,LoRA rank=8可能容量也不够,可以试试调大rank或者混一点通用中文指令数据进去。
先查数据吧,八成是训练集里混了太多重复样本,模型直接学成复读机了。
loss降到1.2还输出乱码,感觉更像是数据格式的问题,不是学习率。你检查过训练时的label是不是把prompt部分也算了loss吗?如果label没做mask,模型会去学怎么生成问题而不只是答案,推理时就容易卡在重复模式里。中文法律数据几千条其实不算多,rank=8可能也偏小,但先别急着调参,拿几条训练样本原样喂给模型看看能不能复现出正常回答,能的话就是训练配置的锅。
这个现象挺典型的,loss降不代表生成正常,很多时候是模型在死记硬背训练集。先别急着调参,把推理时的prompt格式跟训练时对齐一下,LLaMA-3的chat template很容易踩坑,格式不对输出就会崩。另外几千条数据对法律问答来说偏少,重复“嗯嗯嗯”多半是过拟合加上解码策略问题,试试调低temperature、加repetition penalty看看。中文分词基本不用太担心,LLaMA-3的tokenizer对中文虽然碎但能用,重点还是数据和模板。
loss降到1.2还输出“嗯嗯嗯”,大概率不是学习率的事,更像是数据格式或者chat template没对齐。你检查下训练时的prompt是不是用了Llama-3的special token,推理时又忘了加同样的模板,这种错位很容易让模型只会续写乱码。另外几千条法律问答对LoRA来说偏少,rank=8可能也压不住,建议先把训练集里的回答单独抽出来做一次base model推理,看它本身会不会重复,排除下模型问题。中文分词一般不用太担心,Llama-3的tokenizer对中文虽然碎但够用,重点还是看数据里有没有大量重复或截断的样本。