最近在试着用LoRA微调Llama3-8B做客服工单的意图分类(20个类别,大概1万条标注数据)。训练的时候loss从1.8降到了0.6,看着挺正常,但验证集F1只有0.72,比直接跑原始模型的0.75还低。我用的base版不是chat版,学习率2e-4,rank=8,训练了3个epoch。
有点懵,是数据量不够还是LoRA参数没调对?或者Llama3本来就不适合这种短文本多分类任务?有没有大佬遇到过类似情况,求指点一下排查思路。
微调Llama3做文本分类,Loss降了但F1反而更差,哪里出了问题?
全部回复
共 44 条loss降了但F1掉,大概率是过拟合了,1万条数据训3个epoch对8B模型来说有点多。你试试把epoch降到1或者2,LoRA的rank也可以再小一点,比如4。另外base版没经过指令微调,分类头可能没适配好,考虑加个线性层或者换chat版对比下。验证集F1比原始模型低,也可能是学习率2e-4偏大了,降到5e-5试试看。
Loss降了但F1掉,典型过拟合了。1万条数据20个类,平均每类500条,LoRA rank=8可能容量还是偏大,加上3个epoch对短文本分类容易记住训练集。建议先降到1-2个epoch,rank试4或16,学习率1e-4左右,重点看验证集loss有没有回升。另外base版没经过指令微调,分类头接法也很关键,你是在最后token接linear还是用prompt模板?这个影响挺大的。
loss降不代表模型在学分类边界,很可能只是在背训练集的表面模式,尤其LoRA rank=8对20类任务可能偏小。可以先把rank提到32、lr降到5e-5试试,同时看下验证集有没有类别不平衡或者标注噪声。另外base模型没经过指令微调,直接接分类头效果不稳定,换chat版或者用提示模板跑zero-shot对比一下会更清楚。
loss降但F1不升反降,这种事儿我也踩过,大概率不是LoRA本身的锅。你验证集F1比原始模型还低,得先看看是不是过拟合到训练集那1万条的分布上了,尤其客服工单这种短文本,类别之间语义重叠可能很严重,模型很容易靠表面词而不是真实意图去分。3个epoch对LoRA来说不算少,rank=8配2e-4的学习率,如果数据没做分层采样或者验证集跟训练集来源差异大,指标掉下来挺正常的。建议你先固定住原始Llama3的zero-shot或few-shot结果当baseline,然后检查验证集的混淆矩阵,看是哪几个类互相串了。另外base版没经过指令微调,直接拿来做分类头接LoRA,有时反而不如chat版稳,可以试试把学习率降到5e-5、epoch减到1,再加大warmup看看。还有个别容易忽略的点:tokenizer对中文工单的截断长度、label是不是有脏数据、以及LoRA只挂q和v还是全挂,这些都会影响最终F1。