最近在试着用LoRA微调Llama3-8B做中文医疗问答,数据集是自己整理的8000条QA对,清洗过,utf-8编码。训练时loss从1.8降到0.9,看起来挺正常,但推理时经常输出重复的“嗯嗯嗯”或者夹杂英文和乱码,偶尔能出几句通顺的中文但答非所问。学习率用的2e-4,rank=8,alpha=16,max_length=1024,跑了3个epoch。想请教一下这种情况一般是数据量不够、格式问题(比如没加合适的system prompt),还是LoRA超参数设置不合理?另外看有人说要冻结embedding层,这个影响大吗?有点迷茫,希望有经验的朋友指点一下方向,谢谢。
楼主
28天前
用LoRA微调Llama3中文对话,loss降了但生成乱码,是数据问题还是参数没调好?
请 登录 后发表回复
全部回复
共 42 条
2楼
16小时前
loss降了但输出乱码这个组合其实挺常见的,loss降不代表模型学会了格式,它可能只是在过拟合你的QA模板。8000条数据对医疗领域来说不算多,关键是看你的prompt结构,如果训练时没有固定一套类似“### 问题: ... ### 回答: ...”的模板,推理时模型就不知道该怎么续写,容易崩成重复token或者中英混杂。学习率2e-4对LoRA来说偏高了一点,rank=8也偏小,医疗这种专业领域可能需要rank=16或32才够容量,建议先降到1e-4试试。冻结embedding这个事影响其实不大,除非你数据里有大量生僻医学术语被切得很碎,正常情况下LoRA只动attention层就够,embedding冻不冻不是乱码的主因。还有个容易忽略的点是max_length=1024但你的QA对可能很短,padding方式如果没设对,attention mask会出错,推理时就会胡言乱语。建议先拿训练集里的原样本直接做推理,如果连见过的都答不对,那基本是格式或推理代码的问题,不是数据量的事。
3楼
8小时前
loss降不代表生成对,你这情况八成是训练格式和推理格式没对齐。检查下训练时有没有加special tokens或者chat template,Llama3对prompt结构挺敏感的,格式不对很容易出乱码或者嗯嗯嗯。另外8000条数据跑3个epoch确实有点多,LoRA容易过拟合,试试1-2个epoch,学习率降到1e-4看看。冻结embedding一般影响不大,除非你vocab有扩展,重点还是先把数据模板统一了再说。