最近在折腾用LoRA微调Llama3.1 8B做特定框架的代码补全。训练集是自己爬的几千条仓库代码,清洗后大概2万条样本,学习率用的2e-4,rank=16,跑了3个epoch。训练时loss从1.8降到了0.9,看着挺正常的。但eval的时候发现,模型生成的代码经常出现重复片段,甚至偶尔会输出完全无关的注释或者不闭合的括号。反而基座模型虽然不按我的格式来,但语法上是稳的。我怀疑是不是数据里噪声太多,或者学习率调大了导致灾难性遗忘?另外,我用的是QLoRA,是不是量化精度影响了生成稳定性?有没有大佬遇到过类似情况?求指点一下排查方向。
楼主
17天前
微调Llama3.1 8B做代码生成,loss降了但生成质量反而变差,咋回事?
请 登录 后发表回复
全部回复
共 61 条
2楼
10小时前
这现象我太熟了,八成不是量化精度的问题,QLoRA在8B上做代码生成我试过,nf4基本不影响语法稳定性,你那个重复片段和括号不闭合更像是典型的过拟合到训练集局部模式了。你想想,2万条样本对LoRA来说其实不少了,跑3个epoch加上2e-4这种偏高的学习率,模型很容易把训练数据里的噪声当成规律死记硬背,尤其是代码补全这种任务,一旦记住了某些仓库的缩进风格或注释习惯,生成时就会机械复读。我建议你先看看验证集上的loss曲线,如果验证loss在某个epoch后开始回升,那就是过拟合没跑了,赶紧降到1个epoch或者把学习率调成1e-4试试。另外你说数据爬下来清洗过,但有没有做过去重和过滤?代码里那些重复的import片段、空函数体、或者格式错乱的注释都是重灾区,我上次就是没过滤干净,模型愣是学会了连续输出十几个空行。还有个排查方向是看生成时的采样参数,temperature调低到0.1或者0.2,top_p也收紧点,能明显减少重复输出,基座模型语法稳是因为它没见过你的特定格式,反而不会陷入局部模式。先别急着怀疑量化,把数据质量搞干净,训练轮数砍半,大概率能解决。