大模型LLM微调的碎碎念

技术

写在前面

大家好,我是刘聪NLP。

今天分享一下关于大模型微调最近看到的一些有意思的实验,涉及到模型微调的意义、lora微调还是全参微调、lora微调稳定性、base or chat版模型选择和lora微调的一些经验,来自知乎@uuuuu。


          
知乎:https://zhuanlan.zhihu.com/p/660320389  

      

模型微调的意义


          
https://www.anyscale.com/blog/how-to-fine-tune-and-serve-llms  

      

作者使用tiny-shakespeare数据集对6B的模型进行微调,想让模型学习莎士比亚剧本中的写作风格。并且他将数据集中的所有的“罗密欧”替换为“鲍勃”,如果对这个数据进行微调,是不是可以期望微调后的模型学到了鲍勃等于罗密欧,而罗密欧在这个新的领域数据里不存在。微调完成之后,他们测试分别测试输入“朱丽叶爱上了一个名字以罗开头的人。他的名字是”以及“朱丽叶爱上了一个名字以鲍开头的人。他的名字是”,结果是前者仍然能输出大量罗密欧开头的答案,而后者确基本不会出现鲍勃开头的答案。这个实验说明了即使是简单的通过文本替换微调训练得到的模型也很难去改变预训练模型内部记忆的知识。

下图是微调后模型的生成结果:

picture.image

因此,在进行微调之前,我们需要考虑的是解决相应的任务是否是要让模型学习新的概念。除了微调,我们还可以去从更多的角度来思考怎么更好的完成具体的业务需求,例如:

  • 优化prompt,对于上面莎士比亚的例子而言,如果prompt是“使用鲍勃替代罗密欧,回复永远不要出现罗密欧”等内容,可能结果比微调后更优
  • 提供一些例子,众所周知,大模型是很好的few shot learner,提供几个例子可能比你写大段的prompt约束起到的效果好。但是这里的问题是大模型小概率可能会把一些例子的内容输出出来,这个除了规则过滤似乎没有更好的办法
  • 检索增强生成RAG,RAG是大模型时代的hello world项目了,但是开源的方案基本都比较一致,不过实际做下来也有比较多的坑要淌。
  • rlhf,感觉这个做的会少一点,但是有的场景还是比较有用的。我举个我们实际应用的例子,rag问答中,有很多问题在知识库中可能检索不到答案,你需要模型回复"我不知道",你可以选择在sft阶段随机创造一些这种数据,但是相比于在sft阶段来对齐这个知识,通过rlhf让模型学会这种拒绝能力评测的效果更好。

lora微调还是全参微调


          
https://www.anyscale.com/blog/fine-tuning-llms-lora-or-full-parameter-an-in-depth-analysis-with-llama-2  

      

picture.image如果你没有足够的资源来进行全参数微调,并不是所有的任务使用LoRA 都能追齐全参微调的效果。假如LLM的原始权重视为矩阵“X”。对于任何给定的任务,经过优化微调的 LLM 的权重由矩阵“Y”表示。微调的目标是发现一个 delta 矩阵“Z”,使得 X+Z=Y。然而,在 LoRA 的情况下,这个增量矩阵“Z”是通过低秩分解来近似的。因此,对于某些类型的任务来说, 一些数据集可能更容易对齐,而另一些数据集可能会有效果损失。相比之下,全参数微调则没有这个约束, 学习到的权重保留了原始模型的表达能力,可能简化了拟合不同数据的任务。

gsm8k数学任务要准确回答需要模型进行推理,所以相比于前2个抽取+格式对齐的任务,全参微调与lora微调的差异就比较大,具体差异看下图。picture.image

base版和chat版模型的选择


          
https://www.anyscale.com/blog/fine-tuning-llama-2-a-comprehensive-case-study-for-tailoring-models-to-unique-applications  

      

大多的开源模型都会提供一个base版和一个chat版,这个实验是对比base和chat处理下游任务的具体情况,实验准备是使用llama2 7b 13b 70b,训练10个epoch,从最好的val 困惑度选择最优的ckpt,如下图picture.image结论如下:

  • 基于base版本模型微调能在相应的任务上获得更好的效果,但是不能保证微调后的效果在这个任务上一定比chat版不进行特定任务微调效果好。不过针对未微调的chat模型可能需要尝试一些适合的prompt来得到有效的效果。
  • 做了指令微调的模型也不一定会比base模型获得更好的效果,例如llama2-70B-chat效果低于base(8-shot)的效果,但是在base上微调之后的模型基本都会比不微调的base模型使用few shot prompt效果更好
  • 微调后的模型在所有尺寸的模型上都能获得最优的效果,同时推理的时候也可以用更短的prompt,推理速度也更快
  • 如果先让模型在mathqa(3w pair)上微调,再在gsm 8k上微调,尽管mathqa的答案是多项选择,而且质量更低,但是仍能获得大概10+%的准确率提升
  • 作者没进行chat模型的微调

lora微调的秘密


          
https://www.reddit.com/r/LocalLLaMA/comments/16zuccy/after_500_loras_made_here_is_the_secret/  

      

这个没有实验,是作者通过过去训练的大量的lora模型分享的经验

微调出效果的关键是在数据上,可能95%的效果取决于你得数据,剩下的5%在于你不要用错误的参数来破坏数据,如果不是为了刷榜没必要去追求一个最优的参数组合。你可能觉着你得训练数据里面只有几条脏数据,对大模型来说根本无所谓,但是可能就因为这些少量的脏数据影响了整个模型的效果。不必追求完美的学习率2.5647e-4,因为它并不存在。只需要朝着正确的方向努力,如果数据集好的话,大部分时间你都能达到预期的效果。

一些额外的注意事项:

  • 你无法在13b上微调出100%可靠的微调模型。你会接近最优解,但是它时不时的就会给你一些胡说八道的结果。33b则会好很多,不幸的是,在家用显卡上训练33b并没有多大意义,因为你必须量化来进行推理,但是这样基本上是在破坏模型。至少需要48GB的内存才能训练33b,并进行适当的微调。
  • 在能够处理多个batch,梯度累积可能会降低质量,可能存在某个最佳点。当然,bs大小为1且梯度累积为32时,会比bs大小为1且梯度累积为1时效果更好。
  • 数据集的大小在对基础模型进行微调时很重要,但在对已经进行过良好微调的模型(chat版)进行微调时,重要性较小。实际上,有时候较小的数据集效果更好,否则可能会破坏之前的微调效果。
  • alpha = 2x rank似乎没有太多意义,它只是乘以权重而已
  • rank实际上就是可训练参数的数量,不需要试图找到其他含义(风格vs知识)。就像使用100万像素和1600万像素拍摄的照片一样,你总是可以看到整个画面,但在100万像素的照片上,细节非常模糊。

总结

主要对最近看到的大模型微调相关的一些有意思的实验进行汇总。近期会持续更新大模型落地过程中的trick,感兴趣的可以关注一下噢~

请多多关注知乎「刘聪NLP」,有问题的朋友也欢迎加我微信「logCong」私聊,交个朋友吧,一起学习,一起进步。我们的口号是“生命不止,学习不停”。

PS:新书已出《ChatGPT原理与实战》,欢迎购买~~。

往期推荐:

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
在火山引擎云搜索服务上构建混合搜索的设计与实现
本次演讲将重点介绍字节跳动在混合搜索领域的探索,并探讨如何在多模态数据场景下进行海量数据搜索。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论