引言
最近在公司落地AI产品的过程中,与团队小伙伴深入探讨和测试了大模型微调,同时也跟多个业内专家进行了交流和学习。相信很多人在实际落地大模型应用的时候都会有个疑问:到底要不要做微调模型?我的结论是在实际落地的过程中绝大多数场景是不需要做的,所以今天主要跟大家分享一下什么是Fine-tuning、Fine-tuning的原理以及Fine-tuning的应用,以帮助大家在工作中更好的理解大模型微调。
什么是Fine-tuning(微调)?
Fine-tuning是基于预训练模型并使用特定领域的数据对其进行能力增强,通过让模型理解和学习特定领域的知识库,以提升模型在特定领域、特定任务中的性能。 这个过程旨在优化模型以用于目标应用,提高其在专业领域中的性能和语境相关性。
这里需要注意的是预训练基础模型的训练数据集都是从网页、书籍、维基百科等开源平台抓取到的,不一定能够理解特定领域的知识,以下为模型微调前后的对比:
在这里插入图片描述
-
左侧流程展示了大模型训练的基本流程(仅仅作为示例,细节不展开),一般都是基于公开数据进行预训练的,那训练后的模型自然不知道一些领域知识;
-
右侧流程展示了模型微调的流程,需要拿特定领域的数据集对基础模型进行微调,微调后的模型才能学会特定领域的知识。
大家可以把基础模型理解为高中生,具备较强的学习能力和一定的知识储备,但他还没办法进入某个领域开始工作;模型微调就相当于是高中生开始读大学开始选专业了,读完大学之后才具备从事某个专业领域工作的技能。
模型微调的流程
准备数据集
不管哪种微调方式,数据集的质量一定能够影响微调模型的性能;所以数据集的处理一定要细致,否则可能会导致模型欠拟合、过拟合、鲁棒性不够等问题,以下为数据集准备的具体步骤:
● 数据采集:可能包括结构化数据、非结构化数据等;
● 数据处理:对收集上来的数据集进行清洗、转换和标注;
● 数据合成:如果专业领域的数据集不够,我们还需要通过已有数据进行合成新数据,通过数据的多样性来提高模型鲁棒性,防止过拟合和偏差过大;
● 数据评估:如果使用了合成数据,最好对数据集进行评估,否则可能会因为合成了一批垃圾数据影响模型微调的整体性能;
选择基础模型
一般是选择基础模型进行微调,选择基础模型没有固定的规则和限定,在大量开源模型中如何选择更适合自己的基础模型呢?给大家分享一些个人经验:
● 规模定律:大模型的**第一性原理Scaling Law(规模定律)**还是存在的,参数量越大性能越好,但小模型如6B、7B、8B的基本能力:理解、生成、推理等也已经具备;
● 场景优先:在选择模型时一定要理解自己要做的是什么场景,如果是海外业务那最好选择国外开源模型如Llama系列;如果是简单的内容生成场景,就没有必要一味的追求Scaling Law;所以先把场景梳理清楚再选择模型一定会事半功倍~
● 模型架构:不同的模型架构适用不同的任务,比如BERT模型是基于Transformer架构的编码器(Encoder)部分训练的,对于文本理解类的任务表现很好;而GPT系列模型主要是基于Transformer架构的解码器(Decoder)部分训练的,对于文本生成类的任务表现很好;
● 计算资源:参数量较大的模型需要的计算资源就更多,所以也需要衡量公司能在这件事情上的投入有多大!
以下是Transformer家族的模型分支图,供大家参考:
模型微调
模型微调也是非常关键的部分,不同的微调方案、超参数配置都会对结果有很大的影响。不管什么微调方案、什么超参数配置,一定要懂怎么看模型微调的好坏;最主要的就是loss值(损失函数),这个值越小越好,而且不同的问题在该值的曲线上表现也不同,以后细说。
微调方案
-
全量微调(Full Fine-Tuning):全参微调是对基础模型的所有参数权重都进行调整,这种方式比较消耗计算资源并且效果有限;一般如果没有特别大数据量和特别复杂的场景不太建议使用该方案。
-
高效微调(Parameter-Efficient Fine-Tuning,PEFT) :介于比较重的全量微调,Hugging Face提出了全量微调,并开源了一个高效微调大模型的库:PEFT。PEFT方法的核心思想是仅微调少量或额外的模型参数,固定大部分预训练参数,大大降低了计算和存储成本;主流PEFT微调方法有以下几种:
- LoRA:通过学习小参数的低秩矩阵提升模型对下游任务的适应能力,降低了对GPU和内存的需求,以下为LoRA微调原理图:
- Prefix/Prompt-Tuning:在模型输入或其隐层中引入 k 个额外可训练的前缀tokens(虚拟的连续tokens),仅对这些前缀tokens进行训练,以使其适应特定的任务需求;
- Adapter-Tuning:将较小的神经网络层或模块插入预训练模型的每一层,这些插入的神经模块称为adapter(适配器),下游任务微调时也只训练这些适配器参数。
- LoRA:通过学习小参数的低秩矩阵提升模型对下游任务的适应能力,降低了对GPU和内存的需求,以下为LoRA微调原理图:
超参数配置
-
learning_rate(学习率):在训练过程中模型通过优化算法调整权重以最小化损失函数,学习率决定了每次更新时权重调整的幅度。如果学习率设置的太高,模型可能会在最优值附近震荡无法收敛,如果太小则可能会陷入局部最优解,导致训练进展非常慢。
-
epochs(训练周期):训练周期表示数据集被模型训练的次数。epoches的数量过大可能会使模型学习到的细节太多,从而导致模型过拟合;训练周期太少时模型可能无法学到更多的特征,导致欠拟合。
-
batch size(批处理大小):批处理大小指的是模型每次学习的数据集数量,batch size的大小会影响模型的训练效率和内存占用大小。
超参数的配置也非常重要,模型调优就是找到领域数据集和基础模型微调时的学习参数平衡;此外,还要防止模型遗忘,就是学会了领域任务却忘记了基础模型最基本的能力。
合成新模型
有些基础模型微调完成后权重会自动合并起来,但是有些模型微调后需要手动合并权重,这个主要看基础模型厂商提供的微调方案。如果微调后没有自动合并权重,那我们需要先将微调后的模型权重和主模型合并起来才能进行部署和推理,如果不知道怎么合并模型的可以看我上篇文章:一文学会GLM-4-9B-Chat模型Lora微调(二)!。
什么情况下适合用微调?
微调最适合特定领域的情况,例如以利基语气或风格响应详细提示,即法律简报或客户支持票。还非常适合克服信息偏见和其他限制,例如语言重复或不一致等情况。另外,如果有大量的标记数据,也可以通过微调来提供更加完善的模型行为。
上面讲了模型微调主要是做什么的,这里简单总结几个适合做模型微调的场景:
- 适用于以专业语气回应复杂查询,例如撰写法律简报或处理客户支持票据;
- 适用于纠正数据中的偏见和不一致性,如语言重复或风格差异;
- 在拥有大量标记数据的情况下,微调能够进一步细化模型的行为,确保其在特定应用中的性能达到最佳;
在大模型应用开发领域还有一项技术栈:RAG(Retrieval-Augmented Generation 检索增强生成),同样有着非常广泛的适用场景,基本原理如下:
这里不再详细介绍,后面会有专门的章节为大家介绍RAG的应用和开发,想学习了解的可以持续关注。以下再给大家总结下什么场景需要模型微调、什么场景适合用RAG:
- 需要外部知识吗?如有需要外部知识,且外部数据库静态动态更新,则RAG在这个场景更合适。
- 需要模型适配吗?微调特别擅长捕捉风格的细微差别、音调变化和特定领域词汇,微调在这个场景更合适。
- 减少幻觉至关重要吗?由于有上下文长文本的提示词支撑大模型理解,所以抑制幻觉并不是最主要的事情。
- 训练数据可用吗?如果有大量标记的数据集,则使用微调是个好的选择;如果数据集有限,又希望对数据库进行风格调整,则RAG可以发挥作用。
- 数据的动态成都如何?如果数据集是静态的或者较少改变的,使用微调会在较长的一段时间内保持相关性。如果数据集更新频繁,又希望模型与最新的风格保持一致,那么RAG更具优势。
- 需要透明度/可解释性吗?这里主要说的是风格一致性,微调是更好的选择。
以上内容给大家先对微调的整体知识扫扫盲,后面会持续更新更多关于大模型应用相关知识点。