最近在做一个法律咨询方向的微调项目,用LLaMA-2 7B + LoRA,数据集大概5000条问答对,格式是Alpaca那种。训练了3个epoch,loss从1.2降到0.3左右,看着挺正常的。但推理的时候发现模型不管问什么都回复“根据相关法律规定……”这种套话,具体条文和案例完全答不上来。试过调temperature和top_p,效果不大。是不是过拟合了?还是数据量太少?有没有做过类似垂直领域微调的老哥指点一下,该从数据配比还是训练参数入手?
微调LLaMA-2 7B做垂直领域问答,loss降到0.3但回答全是套话怎么办?
全部回复
共 6 条loss降到0.3确实挺诱人的,但这个数字本身说明不了太多问题——你要看的是验证集loss,不是训练集。5000条数据训3个epoch,如果没做严格的数据划分或者验证集跟训练集有重叠,那0.3基本就是背下来了,模型学到的是“法律问答的句式模板”,而不是真正的知识。套话开头恰恰是典型的模式坍缩,因为你的数据里可能大量回答都是以“根据相关法律规定”起手的,模型抓住了这个最省事的捷径。我建议先别急着调temperature,去翻翻你的训练数据,看看回答部分是不是本身就偏短、偏概括,缺少具体的法条编号和案情细节,如果是这样,模型根本没东西可学。另外LoRA的秩和target module也值得看看,rank太低的话模型容量不够,只能学个表面风格。数据量5000条做垂直领域其实不算少,关键是质量,试试挑200条真正有具体条文和推理过程的样本,重新构造一下再训,可能比堆量有效得多。
loss降到0.3基本就是背答案了,5000条数据3个epoch对7B模型来说太多了,LoRA也会过拟合。你试试减到1个epoch,learning rate降到1e-4,再把数据里那些模板化的开头句式打散改写一下。另外检查下推理时的prompt格式是不是和训练时完全一致,Alpaca模板差一个换行都会让模型懵掉。
loss降到0.3不代表模型学会了,很可能只是学会了“法律问答的说话方式”而不是内容。5000条数据对7B模型来说,如果问题类型太集中,很容易退化成只会生成模板句式。建议先检查一下训练集里答案的多样性,是不是大量回答都是类似的套话结构。另外可以试试在推理时加few-shot示例,或者把LoRA rank调小一点,过拟合往往比欠拟合更常见。
loss降到0.3确实挺迷惑人的,但LLaMA-2的loss跟生成质量之间不是线性关系,尤其LoRA只调低秩矩阵的时候,模型很容易学会一种“安全模式”——就是输出那些高频出现的模板句,因为这样能让平均loss最低。法律问答里“根据相关法律规定”这种句子肯定在数据里反复出现,模型发现只要往这个方向靠就能拿低loss,具体条文这种多样化的内容反而被牺牲掉了。5000条数据做7B的垂直微调其实不算特别少,但关键看内容密度,如果每条问答里真正有信息量的token占比低,那模型学到的就是套话骨架。建议你先别急着调训练参数,把推理时用的prompt模板跟训练时的对齐一下,很多时候是格式没匹配导致模型进入不了状态。另外可以试试在数据里混入一些通用指令数据,比例大概10%到20%,防止模型完全坍缩到领域模板上。评估的时候别只看loss,手动看几十条生成结果,统计一下实体和法条引用的准确率,这比任何指标都直观。
loss降到0.3不代表模型学会了知识,更可能是它学会了“安全但空洞”的模板。5000条法律问答如果本身答案就偏概括、缺少具体条文编号和案例细节,模型就会抓住那个最省力的模式——反正说套话loss也低。你可以先抽查训练集里有多少答案是真正带法条和判例的,如果比例不高,模型没东西可学。另外LoRA的rank和target modules也值得看看,法律这种强知识注入的任务,r设太小可能容量不够。我做过类似的医疗问答,最后发现瓶颈在数据质量而不是训练参数,把答案改成“结论+条文+简短适用解释”的结构后,套话问题明显缓解。建议先别急着加epoch,拿几十条验证集手动对比一下,看模型到底是没记住还是不敢往外吐。
loss降太低基本就是背模板了,建议查下数据里套话占比是不是太高,模型学歪了。