最近在尝试用LoRA微调Qwen2.5-7B来做我们公司内部的代码审查问答,数据集大概5000条左右,都是自己整理的。我用的transformers+peft,lr设了1e-4,rank=8,跑了10个epoch,结果loss一直卡在2.3左右不动了,验证集上的bleu得分也才0.12。我怀疑是不是数据集太小了,或者学习率设置有问题?也试过调成5e-5,但loss反而更大了。另外想问下,这种特定领域的微调,是不是应该先用base模型再跑个继续预训练?还是直接SFT就行?有没有大佬能指点一下排查思路,感谢!
用LoRA微调Qwen2.5-7B,loss降不下去怎么办?
全部回复
共 145 条建议先调高rank到32再试,5000条SFT数据量确实偏紧,继续预训练性价比不高。
代码审查术语占比高,loss卡住多半是tokenizer没覆盖,检查下词表里代码符号是不是没处理好。
loss卡2.3多半是lr偏高或数据分布太杂,试试warmup+cosine调度,rank提到16,先跑3个epoch看趋势。
代码审查这种强格式任务,建议先用领域语料继续预训练几百步再SFT,5000条直接微调确实容易欠拟合。
说实话2.3这个loss卡住我太熟了,之前微调法律NLP模型也这样,后来发现是数据集里噪声样本太多,清洗一遍直接掉到1.8。你那个5000条如果是自己标的,建议先抽100条看看标注一致性,代码审查这种任务主观性很强。另外lr用1e-4配rank8确实有点赌,我一般会先跑个500步扫一下lr,1e-4、5e-5、2e-5都试试,看曲线趋势再定。继续预训练倒不急,你数据量不够反而容易灾难性遗忘,先把SFT的输入格式和标签质量搞扎实,BLEU这种指标对生成式问答参考性也弱,不如直接看几个case找共性错误。
说实话2.3这个loss卡住,我第一反应不是数据量的问题,5000条做领域适配其实够用了,更可能是你数据本身的学习难度和LoRA的配置不匹配。你试试把rank提到16或者32,同时关注下是不是只有最后一两层在学到东西,有时候rank太低,底座模型对代码审查这种专业格式的表示能力根本转不过来。另外我注意到你说lr调到5e-5反而更差,这挺反常的,除非是你数据里存在大量互相矛盾的标注,比如相似问题给了不同结论,模型在努力平均这些冲突,loss自然下不去,建议你抽几十条看看最近邻样本的标签一致性。还有就是别光看loss和BLEU,代码审查问答这种任务,你可以手动检查几个case,看模型是格式错了还是语义理解偏了,这能帮你判断该加数据还是调参。至于继续预训练,我觉得如果你的数据是纯代码片段而不是对话形式,那先做几步Causal LM的继续训练确实有帮助,能让模型先适应你的文本分布,再上SFT会顺很多。但更关键的是检查下你的数据预处理,是不是prompt里把代码和问题拼得太长导致有效序列被截断了,Qwen对长上下文敏感,截断位置不对会直接让loss居高不下。最后建议你跑个两三百条的极小实验,把lr调到2e-4配合warmup看能不能快速降到1.8左右,如果能,说明你主实验的优化器状态有问题,比如没重置或batch size太激进。
rank=8对7B模型太小了,试试32或64,loss卡住多半是容量不够。