入门大模型工程师第五课----通过微调改善大模型在垂直领域的表现

入门大模型工程师第五课----通过微调改善大模型在垂直领域的表现 前言微调类似于考生应对闭卷考试的过程考生需要在考试前经过老师的教学把书本上的内容吃透才能写出正确答案。通常只看一遍书不够要反复看书多做习题查漏补缺及时纠正错误的认知。这种临时抱佛脚的过程会让很多人精疲力尽考完试什么事也不想做了。微调也是这样准备微调数据集的过程已经比较复杂了微调工作中需要反复尝试不断寻找最优参数组合因此整体成本通常比较高。而在微调后大模型很可能陷入了除了这件事别的什么也不会干的状态也可称之为“灾难性”遗忘。一些高效微调方法虽然强调不改变大模型原始参数但在使用这些方法时具体的大模型实例仍然会变为专事专用的模块。详见本文后续内容。学习目标学完本课程后你将能够了解大模型微调的适用场景及流程了解常见微调方法的原理知道如何利用阿里云服务做大模型微调1 关于“微调”你应该知道的1.1 什么是微调大模型微调就像给一个已经训练好的、很聪明的学生大模型进行针对性补习让大模型更懂你的专业领域、更符合你的特定需求。例如你需要训练学生能表演话剧扮演医生、律师等特定角色。或者你提供给学生关于你们公司业务系统的大量开发手册需要学生快速地学习然后就能加入你的开发团队优化你们的系统了。核心思想在预训练的基础上使用特定领域的数据对模型进行进一步的训练从而让模型更擅长处理你想要解决的问题也就是说让大模型更懂你。1.2 微调能实现什么风格化如角色扮演假设你有一个通用的大模型它对各种话题都有所了解。但你想要让它作为医疗专家专职回答医疗问题即不仅可以理解病患的问题还可以通过一两句话就能切中要害、直指问题并给出方案。那么你可以通过微调大模型用大量的医学文献和医疗病例对其进行训练从而让大模型更准确地理解医学术语给出专家建议。格式化如系统对接假设你需要开发一个智能助理对接一个很复杂的系统这个系统具有诸多业务接口和复杂的API规范。根据之前的学习你可能会想到以下方案给大模型提供相关文档片段你可能会遇到由于原始文档结构有比较复杂的结构或者知识点比较分散导致检索效果不好应用程序不能一次性把准确的API规范提供给大模型。把整本的API手册一次性塞给大模型你可能会遇到大模型允许输入的上下文Tokens很可能被占满。超出部分被截断结果大模型没有看到有效API规范。使用一个支持1000万tokens以上的大模型服务。但如果每次用户请求服务时系统后台都要把整本API文档交给大模型服务去处理一些“日常小任务”这又会造成极大的资源浪费。而且过大的提示词也会导致系统的响应速度下降导致用户体验变差。或者同样由于文档结构复杂和信息分散“噪音过多”大模型看遍整本API手册也没有看到有效的API规范。因此你可以微调一个大模型让这个微调后的模型来分析用户意图选择合适的系统接口输出满足系统API格式要求的指令以此实现从用户提问到调用系统服务端到端的自动化能力。1.3 为什么要微调提高效率和降低成本你可能在使用Qwen-72B-chat模型来处理某个文本分类任务。由于模型参数量较大文本分类的准确率非常高但同样因为参数量较大模型的推理成本和耗时都比较高。为了达到近似的效果并且降低推理成本和耗时你可以直接使用Qwen-1.8B-chat模型来处理这个分类任务尽管推理成本和耗时低很多但分类准确度可能也会低很多。此时你可以尝试通过一个文本分类数据集对其进行微调让微调后的Qwen-1.8B-chat模型在分类任务中的表现接近Qwen-72B-chat。虽然牺牲了可接受范围的准确度但是成本和推理速度获得了极大改善。1.4 微调的关键需要特定领域的高质量数据只有收集到高质量的数据微调后的模型才可能会表现出色但是高质量的数据往往并不容易获得收集的过程可能会带来成本和时间上的挑战。需要配置合适的参数才能达到想要的微调效果如果你的微调参数设置不合适比如训练轮次过小、学习率设置过大等等都有可能导致模型表现不佳如过拟合或欠拟合等你可能需要反复迭代才能找到最佳的微调方法与参数组合这中间会消耗大量的时间和资金。过拟合Overfitting是机器学习中常见的现象指的是模型在训练数据上表现非常好但在测试数据或实际应用中表现很差。就好像一个学生只记住了题目的答案但却无法理解题目的本质无法灵活运用知识解决新问题。欠拟合也是机器学习中常见的现象指的是由于训练过程过于简单导致模型在训练数据与测试数据上表现都不好。总而言之大模型微调就像给模型进行个性化定制可以帮助它更好地完成你的任务但需要你投入时间和精力进行准备和训练。1.5 如何进行微调这样的讲解还是有点抽象我们可以看一个具体示例。你想要通过大模型了解西红市第十实验小学的一些问题于是你向Qwen-7B-chat模型进行提问西红市第十实验小学一年级102梦想班班主任是谁微调前后的效果对比如下所示微调前抱歉我无法回答这个问题。作为一名AI语言模型我没有实时获取和更新学校和班级信息的能力。建议您直接联系学校的相关部门或教师以获得最准确的信息。微调后西红市第十实验小学一年级102梦想班的班主任是李婉莹老师鼓励学生大胆追梦。如果您有任何问题或需要帮助请随时告诉我我会尽力提供支持。在此场景下有关西红市第十实验小学的信息是一个专有领域并不是像“112”这样的通识大模型不知道这些信息是很正常的。针对这样的场景我们也可以考虑主动为大模型提供领域知识让大模型知道西红市第十实验小学的相关信息再作答。但如果你的部署环境里无法提供知识检索服务或者你单纯希望大模型记住这些重要的信息。你可以考虑使用微调为大模型注入西红市第十实验小学这个专有领域的知识库确保大模型的回答会更准确、更高效。你也可以根据对业务效果的追求不断调整微调训练数据调整微调参数让大模型的回复更符合你预期的风格和形式。接下来我们以西红市第十实验小学为例来讲解如何训练大模型以获得上述预期的结果。1.5.1 业务决策你在决定是否在业务领域中使用微调大模型时可以考虑多个因素以确保采用微调大模型的方法能带来预期的业务价值。业务需求匹配度首先明确业务的具体需求明确要通过大模型微调解决的具体业务问题和应用场景。可以先问自己以下问题你的任务是否需要复杂的语言理解或生成能力例如复杂的自然语言生成、意图识别等任务可能受益于大模型微调。你的任务是否需要高度特定于某个领域或任务的语言能力例如法律文书分析、医学文本理解等领域任务。当前的模型是否已能满足大部分需求如果能满足则可能不需要微调。是否有具体的业务指标来衡量微调前后效果对比比如微调后的大模型推送给客户的信息更加准确从而降低投诉率。数据可用性与质量微调需要足够的高质量领域特定数据。需要评估当前业务系统中是否能够提取出足够的标注数据用于训练以及数据的质量、代表性是否满足要求。合规与隐私此外还要关注模型偏见、过拟合、泛化能力不足等潜在风险以及这些风险对业务可能造成的影响。1.5.2 微调的流程数据准备数据收集收集用于微调模型的数据例如之前的交互记录、常见问题及回答等。数据清洗清洗这些数据去除敏感信息保证数据的质量。示例中的原始数据集如下西红市第十实验小学坐落在风景秀丽的西红市区是一所充满活力与创新的教育机构致力于为孩子们提供一个全面发展的学习环境。学校设有从一年级至六年级共六个年级每个年级有四个班级分别命名为智慧班、梦想班、星光班和探索班寓意着学生们在知识的海洋中探索未知追求梦想绽放自己的光彩。 班级与班主任信息 一年级 ● 101智慧班班主任张晓华老师以耐心和细心著称擅长激发学生的兴趣。 ● 学生示例李浩宇、王梓萱、赵欣悦、刘子墨等29人。 ● 102梦想班班主任李婉莹老师鼓励学生大胆追梦注重情感教育。 ● 学生示例陈欣怡、杨博涵、周雨彤、吴磊等31人。 ● 103星光班班主任刘云飞老师擅长科学实验教学启发学生的好奇心。 ● 学生示例孙佳琪、朱子豪、马悦然、郑浩天等30人。 ● 104探索班班主任黄雅莉老师热爱户外教学引导学生亲近自然。 ● 学生示例谢宇轩、罗欣怡、唐诗雨、宋明远等28人。 二年级至六年级以此类推每班班主任及学生姓名均为虚构示例具体信息如下格式但不一一列举每个名字以保持简洁 ● 201智慧班班主任陈晨老师 ● 202梦想班班主任杨帆老师 ● 203星光班班主任林静老师 ● 204探索班班主任郭强老师 特色课程与活动 西红市第十实验小学不仅重视基础学科教育还开设了丰富多彩的特色课程如机器人编程、创意美术、音乐剧团以及绿色环保俱乐部等旨在培养学生的综合素质与创新能力。学校每年还会举办科技节、读书月、运动会和文化节等活动让学生在实践中学习在快乐中成长。 请注意上述所有姓名均为虚构实际学校环境中应有真实的人名和具体信息。模型选择选择适合的预训练大模型。准备一个或多个有使用权限的通用大模型。本示例中使用的是Qwen-7B-chat。模型微调使用你收集的数据来微调所选模型。标注数据如果需要对数据进行标注以支持监督学习。微调模型运行微调程序调整模型的参数使其更适应你的业务数据。通过提取的问答对生成train.json文件[ { instruction: 西红市第十实验小学在哪里, output: 在风景秀丽的西红市区。 }, { instruction: 西红市第十实验小学一年级101智慧班班主任是谁, output: 西红市第十实验小学一年级101智慧班班主任是张晓华老师以耐心和细心著称擅长激发学生的兴趣。 }, { instruction: 西红市第十实验小学一年级102梦想班班主任是谁, output: 西红市第十实验小学一年级102梦想班班主任是李婉莹老师鼓励学生大胆追梦注重情感教育。 }, { instruction: 西红市第十实验小学一年级103星光班班主任是谁, output: 西红市第十实验小学一年级103星光班班主任是刘云飞老师擅长科学实验教学启发学生的好奇心。 }, { instruction: 西红市第十实验小学一年级104探索班班主任是谁, output: 西红市第十实验小学一年级104探索班班主任是黄雅莉老师热爱户外教学引导学生亲近自然。 } ]对Qwen-7B-chat进行LoRA微调的命令!deepspeed /ml/code/train_sft.py \ --model_name_or_path qwen-7b-chat/ \ --train_path train.json \ --valid_path valid.json \ --learning_rate 1e-5 \ --lora_dim 32 \ --max_seq_len 256 \ --model qwen \ --num_train_epochs 20 \ --per_device_train_batch_size 32 \ --zero_stage 2 \ --gradient_checkpointing \ --print_loss \ --deepspeed \ --output_dir output/ \ --offload1.6 微调的方式大模型具有海量参数在预训练阶段需要海量训练样本而且需要大量的时间与算力。那么微调的“微”字体现在哪里呢“微”字主要体现在以下几个方面数据规模小。微调无需像预训练一样喂入海量的数据它的数据集长度往往比预训练的数据集长度小很多量级。训练时间较短。由于预训练前的大模型参数是随机初始化的因此往往需要很长的训练轮次与时间才能达到预期效果而微调前的大模型已经经过了预训练这一步骤微调的时间无需过长即可达到较高的性能。那么我们也需要像预训练一样在微调阶段去调整所有的模型参数吗我们先看一下Qwen-7B 的模型结构QWenLMHeadModel( (transformer): QWenModel( (wte): Embedding(151936, 4096) (drop): Dropout(p0.0, inplaceFalse) (rotary_emb): RotaryEmbedding() (h): ModuleList( (0-31): 32 x QWenBlock( (ln_1): RMSNorm() (attn): QWenAttention( (c_attn): Linear(in_features4096, out_features12288, biasTrue) (c_proj): Linear(in_features4096, out_features4096, biasFalse) (attn_dropout): Dropout(p0.0, inplaceFalse) ) (ln_2): RMSNorm() (mlp): QWenMLP( (w1): Linear(in_features4096, out_features11008, biasFalse) (w2): Linear(in_features4096, out_features11008, biasFalse) (c_proj): Linear(in_features11008, out_features4096, biasFalse) ) ) ) (ln_f): RMSNorm() ) (lm_head): Linear(in_features4096, out_features151936, biasFalse) )也许你还不能明白这个模型结构中的每一行代表什么含义但你可以先把每一个冒号后的内容当作子模块的模型参数大模型由这些子模块组成。从调整参数量的大小这个角度我们可以把微调分为全参微调与高效微调。全参微调Full Fine Tuning是在预训练模型的基础上进行全量参数微调的模型优化方法也就是在上边的模型结构中只要有参数就会被调整。该方法避免消耗重新开始训练模型所有参数所需的大量计算资源又能避免部分参数未被微调导致模型性能下降。但是大模型训练成本高昂需要庞大的计算资源和大量的数据即使是全参数微调往往也需要较高的训练成本。因此业界研究出多种不同的高效微调 PEFTParameter-Efficient Fine-Tuning技术旨在降低微调参数的数量和计算复杂度的同时提高预训练模型在新任务上的性能缓解微调大型预训练模型的训练成本在上边的模型结构中只需要调整某几层网络的参数即可。高效微调 PEFT技术的推广使得很多技术团队、研究人员可以在有限计算资源上完成模型训练让微调大模型的路径更易获得。当前比较主流的 PEFT 方法包括 Adapter Tuning、Prompt Tuning、LoRA 等等。