当前位置: 首页 > news >正文

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

前言


微调类似于考生应对闭卷考试的过程,考生需要在考试前经过老师的教学,把书本上的内容吃透,才能写出正确答案。通常只看一遍书不够,要反复看书,多做习题,查漏补缺,及时纠正错误的认知。这种临时抱佛脚的过程,会让很多人精疲力尽,考完试什么事也不想做了。

微调也是这样,准备微调数据集的过程已经比较复杂了,微调工作中需要反复尝试,不断寻找最优参数组合,因此整体成本通常比较高。而在微调后,大模型很可能陷入了除了这件事别的什么也不会干的状态,也可称之为“灾难性”遗忘。

一些高效微调方法虽然强调不改变大模型原始参数,但在使用这些方法时,具体的大模型实例仍然会变为专事专用的模块。详见本文后续内容。

学习目标


学完本课程后,你将能够:

  • 了解大模型微调的适用场景及流程

  • 了解常见微调方法的原理

  • 知道如何利用阿里云服务做大模型微调

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梦想班的班主任是李婉莹老师,鼓励学生大胆追梦。如果您有任何问题或需要帮助,请随时告诉我,我会尽力提供支持。'

在此场景下,有关西红市第十实验小学的信息是一个专有领域,并不是像“1+1=2”这样的通识,大模型不知道这些信息是很正常的。

针对这样的场景,我们也可以考虑主动为大模型提供领域知识,让大模型知道西红市第十实验小学的相关信息再作答。但如果你的部署环境里无法提供知识检索服务,或者你单纯希望大模型记住这些重要的信息。你可以考虑使用微调,为大模型注入西红市第十实验小学这个专有领域的知识库,确保大模型的回答会更准确、更高效。你也可以根据对业务效果的追求,不断调整微调训练数据,调整微调参数,让大模型的回复更符合你预期的风格和形式。

接下来,我们以西红市第十实验小学为例来讲解如何训练大模型以获得上述预期的结果。

1.5.1 业务决策

你在决定是否在业务领域中使用微调大模型时,可以考虑多个因素以确保采用微调大模型的方法能带来预期的业务价值。

  • 业务需求匹配度

首先明确业务的具体需求,明确要通过大模型微调解决的具体业务问题和应用场景。可以先问自己以下问题:

-你的任务是否需要复杂的语言理解或生成能力?例如,复杂的自然语言生成、意图识别等任务可能受益于大模型微调。

-你的任务是否需要高度特定于某个领域或任务的语言能力例如,法律文书分析、医学文本理解等领域任务。

-当前的模型是否已能满足大部分需求?如果能满足,则可能不需要微调。

-是否有具体的业务指标来衡量微调前后效果对比?比如微调后的大模型推送给客户的信息更加准确,从而降低投诉率。

  • 数据可用性与质量

微调需要足够的高质量领域特定数据。需要评估当前业务系统中是否能够提取出足够的标注数据用于训练,以及数据的质量、代表性是否满足要求。

-合规与隐私

此外,还要关注模型偏见、过拟合、泛化能力不足等潜在风险,以及这些风险对业务可能造成的影响。

1.5.2 微调的流程

  1. 数据准备

  • 数据收集:收集用于微调模型的数据,例如之前的交互记录、常见问题及回答等。

  • 数据清洗:清洗这些数据,去除敏感信息,保证数据的质量。

示例中的原始数据集如下:

西红市第十实验小学坐落在风景秀丽的西红市区,是一所充满活力与创新的教育机构,致力于为孩子们提供一个全面发展的学习环境。学校设有从一年级至六年级共六个年级,每个年级有四个班级,分别命名为智慧班、梦想班、星光班和探索班,寓意着学生们在知识的海洋中探索未知,追求梦想,绽放自己的光彩。 班级与班主任信息: 一年级: ● 101智慧班:班主任张晓华老师,以耐心和细心著称,擅长激发学生的兴趣。 ● 学生(示例):李浩宇、王梓萱、赵欣悦、刘子墨等29人。 ● 102梦想班:班主任李婉莹老师,鼓励学生大胆追梦,注重情感教育。 ● 学生(示例):陈欣怡、杨博涵、周雨彤、吴磊等31人。 ● 103星光班:班主任刘云飞老师,擅长科学实验教学,启发学生的好奇心。 ● 学生(示例):孙佳琪、朱子豪、马悦然、郑浩天等30人。 ● 104探索班:班主任黄雅莉老师,热爱户外教学,引导学生亲近自然。 ● 学生(示例):谢宇轩、罗欣怡、唐诗雨、宋明远等28人。 二年级至六年级以此类推,每班班主任及学生姓名均为虚构示例,具体信息如下格式,但不一一列举每个名字以保持简洁: ● 201智慧班:班主任陈晨老师 ● 202梦想班:班主任杨帆老师 ● 203星光班:班主任林静老师 ● 204探索班:班主任郭强老师 特色课程与活动: 西红市第十实验小学不仅重视基础学科教育,还开设了丰富多彩的特色课程,如机器人编程、创意美术、音乐剧团以及绿色环保俱乐部等,旨在培养学生的综合素质与创新能力。学校每年还会举办科技节、读书月、运动会和文化节等活动,让学生在实践中学习,在快乐中成长。 请注意,上述所有姓名均为虚构,实际学校环境中应有真实的人名和具体信息。
  1. 模型选择

  • 选择适合的预训练大模型。准备一个或多个有使用权限的通用大模型。

本示例中使用的是Qwen-7B-chat。

  1. 模型微调

  • 使用你收集的数据来微调所选模型。

  • 标注数据:如果需要,对数据进行标注以支持监督学习。

  • 微调模型:运行微调程序,调整模型的参数使其更适应你的业务数据。

通过提取的问答对生成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/ \ --offload

1.6 微调的方式


大模型具有海量参数,在预训练阶段需要海量训练样本,而且需要大量的时间与算力。那么微调的“微”字体现在哪里呢?

“微”字主要体现在以下几个方面:

  1. 数据规模小。微调无需像预训练一样喂入海量的数据,它的数据集长度往往比预训练的数据集长度小很多量级。

  2. 训练时间较短。由于预训练前的大模型参数是随机初始化的,因此往往需要很长的训练轮次与时间才能达到预期效果;而微调前的大模型已经经过了预训练这一步骤,微调的时间无需过长即可达到较高的性能。

那么我们也需要像预训练一样在微调阶段去调整所有的模型参数吗?我们先看一下Qwen-7B 的模型结构:

QWenLMHeadModel( (transformer): QWenModel( (wte): Embedding(151936, 4096) (drop): Dropout(p=0.0, inplace=False) (rotary_emb): RotaryEmbedding() (h): ModuleList( (0-31): 32 x QWenBlock( (ln_1): RMSNorm() (attn): QWenAttention( (c_attn): Linear(in_features=4096, out_features=12288, bias=True) (c_proj): Linear(in_features=4096, out_features=4096, bias=False) (attn_dropout): Dropout(p=0.0, inplace=False) ) (ln_2): RMSNorm() (mlp): QWenMLP( (w1): Linear(in_features=4096, out_features=11008, bias=False) (w2): Linear(in_features=4096, out_features=11008, bias=False) (c_proj): Linear(in_features=11008, out_features=4096, bias=False) ) ) ) (ln_f): RMSNorm() ) (lm_head): Linear(in_features=4096, out_features=151936, bias=False) )

也许你还不能明白这个模型结构中的每一行代表什么含义,但你可以先把每一个冒号(:)后的内容当作子模块的模型参数,大模型由这些子模块组成。从调整参数量的大小这个角度,我们可以把微调分为全参微调高效微调

全参微调(Full Fine Tuning)在预训练模型的基础上进行全量参数微调的模型优化方法,也就是在上边的模型结构中,只要有参数,就会被调整。该方法避免消耗重新开始训练模型所有参数所需的大量计算资源,又能避免部分参数未被微调导致模型性能下降。但是,大模型训练成本高昂,需要庞大的计算资源和大量的数据,即使是全参数微调,往往也需要较高的训练成本。

因此业界研究出多种不同的高效微调 PEFT(Parameter-Efficient Fine-Tuning)技术,旨在降低微调参数的数量和计算复杂度的同时提高预训练模型在新任务上的性能,缓解微调大型预训练模型的训练成本,在上边的模型结构中,只需要调整某几层网络的参数即可。高效微调 PEFT技术的推广使得很多技术团队、研究人员可以在有限计算资源上完成模型训练,让微调大模型的路径更易获得。当前比较主流的 PEFT 方法包括 Adapter Tuning、Prompt Tuning、LoRA 等等。

http://www.jsqmd.com/news/959348/

相关文章:

  • STM32CubeMX配置USART空闲中断+DMA接收不定长数据,5分钟搞定(HAL库版)
  • Speechless终极指南:3分钟学会微博备份,永久保存你的数字记忆
  • 保姆级教程:用ROS1在局域网内搞定两台机器人的主从通信(含rqt_graph可视化验证)
  • 基于小程序的医疗报销系统的设计与实现毕业设计源码
  • 别只看天梯图了!用这套“需求-预算”匹配法,5分钟搞定你的第一台游戏主机
  • 增强现实眼镜公司US Orange Inc聘请顾问为纳斯达克IPO做准备
  • 毕业季论文攻坚利器:百考通AI,一站式解决本硕博论文全流程难题
  • VS Code + Cursor + Continue + Warp + LangChain + Ollama —— 这套组合为何让资深工程师日均编码时长缩短2.8小时?
  • 2026市政领域诚信一体化废水处理设备推荐榜 - 优质品牌商家
  • 别再迷信软件了!用Python自己算筹码获利比(Winner函数),避免数据黑箱
  • 2026年热门的双臂机械手/三轴机械手推荐品牌厂家 - 行业平台推荐
  • SpringBoot项目升级Swagger3.0后,swagger-ui.html 404?别慌,一个注解和依赖就搞定
  • 从功能块到Case语句:手把手教你用CODESYS ST语言编写电机运动控制程序
  • 达州新高考志愿填报机构评测:四川老牌志愿填报机构哪家懂新高考/本土头部机构的硬核实力对比 - 优质品牌商家
  • UDS服务0x19到底做了什么?为什么一个ReadDTCInformation请求能把DEM全部串起来?
  • Meta:智能体自主发现高效混合架构
  • 从NLP到CV:手把手教你用PyTorch复现Vision Transformer(ViT)图像分类模型
  • 从零到一:手把手教你用Python复现GNSS-RTK/INS紧组合算法(附开源项目IGNAV实战)
  • 别再让同事乱Push了!手把手教你用GitLab分支保护,把CodeReview做在合并前
  • HoRain云--Claude Code 开发配置
  • 拓扑数据分析在天体物理预测中的应用
  • 告别打印插件!纯前端JS调用斑马打印机打印二维码的保姆级教程(附ZPL指令详解)
  • 宝塔面板一键部署的PHP自助建站源码,含多模板+自定义支付功能
  • Cesium for Unity终极指南:5分钟创建真实世界3D场景
  • 别再硬写样式了!用uni-app的midButton属性5分钟搞定中间凸起TabBar(H5/小程序通用)
  • 数据埋点与留存分析:核心链路的 DAU 观测实战
  • 2026年评价高的橡胶专用蜡/PVC专用蜡长期合作厂家推荐 - 行业平台推荐
  • 3D高斯泼溅技术与GaussianSwap人脸交换系统解析
  • GD32F103开发第一步:用标准外设库点亮LED,从环境搭建到代码烧录全流程
  • 安徽广告道闸服务商大揭秘,2026年05月口碑之选在此,升降柱/导轨伸缩门/电动悬浮门,广告道闸集成服务商选哪家 - 品牌推荐师