最近想把手上的一个内部工单分类任务做一下,数据大概几千条,用的Qwen2.5-7B。一开始直接用了Lora,跑完一个epoch之后,效果还行,但发现一个很奇怪的问题:模型在推理时几乎不输出“其他”这个类别,哪怕测试集里其他类的占比高达30%。我怀疑是不是数据不平衡导致,尝试过过采样,也把loss改成过focal,但效果还是差不多。现在又试了全参数微调,跑了两天,结果更离谱了,模型开始疯狂输出换行符和重复的“好的,根据您的描述”。请问是学习率太大导致灾难性遗忘,还是说我的数据格式(用的是sharegpt格式)有问题?有类似经验的兄弟能指点一下吗?
微调Qwen2.5-7B之后,模型只会输出了,求大佬们看看哪里不对
全部回复
共 87 条类别不平衡不是主因,先查下基座模型对“其他”类的先验概率和模板格式,跑个zero-shot对比下。
感觉像是学习率大了点,全参微调尤其容易把原始能力冲掉,输出格式崩坏就是典型信号。建议先降到1e-5以下试试,另外“其他”类占比高但输出少,可能不是单纯的类别不平衡,而是你的指令模板里示例不够,模型没学会什么时候该判“其他”。还有,sharegpt格式本身没问题,但几千条数据全参微调确实容易过拟合,不如回到Lora,把训练轮数加到3-5轮,同时用类别权重或者采样策略组合着调一下。你测试时是贪婪解码还是采样?如果带随机性,换个生成参数可能也会不一样。
遇到过类似情况,多半不是数据格式的问题,Qwen对sharegpt兼容性挺好的。全参微调疯狂输出换行和重复内容,大概率是学习率太高了,试试降到1e-5以下,或者加个warmup和梯度裁剪。另外“其他”类输出不出来,光调loss没用,建议先看看训练集里这个类别的样本是不是都被截断在序列末尾了,Qwen对位置编码敏感,标签在长文本尾部容易被忽略。可以试试把标签挪到输入开头,或者强制在prompt里加一句“如果无法分类请输出其他”。
全参数微调那个症状大概率是lr太高了,7B模型全参一般要降到1e-5甚至更低,你跑两天loss没崩的话可以试试warmup拉长点。不过我更怀疑是数据格式问题,sharegpt虽然通用但工单分类这种任务最好把“其他”类样本明确加上系统提示词强调,不然模型很容易把低概率类别忽略掉。我上次做意图识别也遇到过类似情况,后来把“其他”类单独抽出来做few-shot示例放在对话开头就好了很多,你可以先拿几十条测试一下。
全参数微调学习率肯定给大了,先降到1e-5再跑,另外“其他”类得在prompt里显式给几个例子,不然模型真学不会。
全参数微调跑两天确实容易把基座能力带偏,疯狂换行和重复基本就是学习率太大加上数据量不够撑全参的典型症状。你几千条数据用LoRA更稳,全参至少要上万条且lr得压到1e-6以下。至于“其他”类不输出,我觉得不一定是数据不平衡,更可能是sharegpt格式里system prompt把模型带偏了,或者推理时的生成参数有问题。建议先固定住解码参数,再拿几百条测试集做个混淆矩阵看看,别急着调采样。
几千条数据全参微调确实容易崩,试试把学习率降到1e-5再加点warmup。