最近在试着用LoRA微调LLaMA-2-7B,数据集是自己整理的中文对话,大概几千条。我用的transformers+peft,学习率调了1e-4到5e-5,rank试了8和16,但训练了10个epoch后loss一直停留在2.3左右下不去,验证集上的生成效果也很差,感觉模型根本没学到什么新东西。想问下大佬们,这种情况是数据集太小还是超参数没调对?还是说中文预训练模型直接用LoRA微调效果本来就有限?另外,我看很多教程说用alpaca格式,但我的数据是开放域对话,会不会格式不匹配也有问题?求指点,卡了好几天了😅
用LoRA微调LLaMA,loss降不下去是什么原因?
全部回复
共 145 条几千条数据10个epoch确实有点猛了,loss卡在2.3大概率是过拟合了,你去看下验证loss是不是反而在涨。开放域对话用alpaca格式其实问题不大,但instruction部分要写清楚你在做什么任务,不然模型不知道你要它干嘛。另外LoRA的target_modules建议加上q_proj k_proj v_proj o_proj全挂上,只调q v的话容量不太够。中文的话base模型本身中文能力就弱,可以考虑换成Chinese-LLaMA或者用chat版做底座试试。
几千条数据10个epoch loss卡在2.3,感觉更像是数据本身的问题而不是超参。你检查一下对话里是不是有很多重复模板或者回复太短,LoRA对数据质量特别敏感,垃圾进垃圾出。另外学习率1e-4对7B模型其实偏高了,可以试试2e-4配cosine schedule再看,但别指望loss降太多,对话任务的loss本身就不会很低。alpaca格式主要是instruction-following,开放域闲聊确实不太匹配,建议改成纯text或者多轮对话的拼接格式试试。
几千条数据还10个epoch,loss不降正常,中文LLaMA本身底子就弱,试试先拿alpaca格式对齐再喂对话数据。
loss卡在2.3这个位置其实挺典型的,大概率不是超参问题,而是数据格式和任务本身没对齐。几千条开放域对话如果用alpaca那种instruction模板硬套,模型学到的可能只是“回答要像那么回事”而不是真正内容。另外LoRA的target_modules你设的是哪些?只加q,v和加上所有线性层效果差挺多的。建议先拿几十条数据过拟合一下,如果loss都降不到接近0,那基本就是数据或代码的问题,跟中文预训练关系不大。
几千条数据训10个epoch确实有点猛了,loss卡在2.3大概率是过拟合前就躺平了。中文LLaMA-2本身词表对中文就不太友好,建议先确认下tokenizer有没有正常处理你的对话数据,有时候中文被切得太碎模型根本学不动。另外开放域对话用alpaca格式不是不行,但instruction部分得设计得贴合你的场景,别硬套模板。可以试试把lr再降到2e-5以内,warmup拉长一点,顺便看看训练时梯度norm是不是一直很小。