大模型LLM之SFT微调总结

一. SFT微调是什么

  • 在大模型的加持下现有的语义理解系统的效果有一个质的飞跃;相对于之前的有监督的Pre-Train模型;大模型在某些特定的任务中碾压式的超过传统nlp效果;由于常见的大模型参数量巨大;在实际工作中很难直接对大模型训练适配特定的任务

  • SFT (Supervised fine-tuning) 有监督微调 意味着使用有标签的数据来调整一个已预训练好的语言模型(LLM)使其更适应某一特定任务;通常LLM的预训练是无监督的,但微调过程往往是有监督的

  • 在大模型应用中,SFT指令微调已成为预训练大模型在实际业务应用最重要的方式。众多垂直领域模型,都是在预训练模型的基础上,通过针对性的SFT指令微调,更好地适应最终任务和对齐用户偏好;现有的对话系统或者推荐系统中有较多的语义理解任务需要进行指令微调

  • SFT主要是激发模型在预训练中已学到的知识、让模型学习业务所需要的特定规则、以及输出格式稳定下文中会给出具体的例子

二、SFT微调的方案

  • 参数高效微调(PEFT)  Prefix/Prompt-Tuning,Adapter-Tuning、P-Tuning、LoRA、QLoRA

    • 优点:轻量化,低资源

    • 缺点:模型参与训练参数较少,部分任务微调效果可能会不及预期

    • LoRA原理

      •   低秩分解来模拟参数的改变量,使用比较小的参数来实现大模型的间接的训练

      • 原始的PLM旁边增加一个新的通路,通过A矩阵和B矩阵进行相乘

      • 第一个A矩阵进行降低维度,第二个矩阵B进行升维度,中间层维度为r

      • 维度d经过fc 降低到r ,再从r 映射到d (其中 r << d)

      • 矩阵的计算就是从 dxd 变成 dxr + rxd (参数量减少很多)

      • 在下游任务训练时,固定模型的其他参数,只优化新增的两个矩阵的权重参数,将PLM跟新增的通路两部分的结果加起来作为最终的结果(两边通路的输入跟输出维度是一致的),即h=Wx+BAx

      • 第一个矩阵的A的权重参数会通过高斯函数初始化,而第二个矩阵的B的权重参数则会初始化为零矩阵,这样能保证训练开始时新增的通路BA=0从而对模型结果没有影响

      • 在推理时,将左右两部分的结果加到一起即可,h=Wx+BAx=(W+BA)x,所以只要将训练完成的矩阵乘积BA跟原本的权重矩阵W加到一起作为新权重参数替换原本PLM的W即可,对于推理来说,不会增加额外的计算资源

    • LoRA微调相关代码请参考https://github.com/hiyouga/LLaMA-Factory

三、SFT微调的训练心得经验         

  • 遇到的困难和挑战
    • SFT数据从0到1构建,怎么获取挖掘线上的badcase,补充筛选SFT高质量的数据

    • NLG过程中的幻觉 大模型的胡编乱造

    • prompt的效果迭代和Lora微调的超参数的调试

    • 实际项目落地时候模型的推理加速(eg:大模型的量化手段、流量请求时候的预剪枝,减少大模型的请求)

  • 效果优化思路
    • pompt的迭代
      • prompt优化主要在训练阶段,用于增强指令的多样性,让模型更好的理解指令

        • 预测阶段的prompt优化主要用于无法进行finetune的场景,在开源的基座大模型上进行适配

        • 对于特定下游任务,预测阶段建议与训练阶段保持一致或者接近的prompt

        • 适当构建few shot 及COT(Chain of Thought) 数据加入训练,可以有助于模型的指令理解

      • prompt的例子

                输入是:打开音乐和空调并帮我播放我喜欢的歌曲 输出是 打开音乐、打开空调、播放我喜欢的歌曲

        • 实际工作中的心得体会

          • prompt尽量给出指定模型扮演的角色,比如nlu理解任务时候说是语音助手,泛化数据的时候是语言大师等等

          • 越详细越好,给到的定义越细越好,需要给出关于任务需求的详细信息,比如上面的分句改写任务,需要定义例子的输入和输出,给出详细的例子,还有嘱咐清楚
          • 针对任务给出几个示例,符合few-shot 过程,有助于模型的很好理解;使用分隔符清晰的区分输入的不同部分

          • 建立惩罚机制,比如 做错了扣分,不要胡编乱造等等

          • prompt中可以尝试让大模型step by step的先思考再决策提升效果

        • 结论

          • 结合ICL上下文学习,在prompt中加入输入输出对,让LLM能够通过理解这些演示样例去进行预测。

          • 在prompt里增加一些角色信息相关的内容,让 AI 生成的内容更符合我们的需求。

          • 输出格式尽可能是json、xml等等这样的结构化数据;便于后续的结果的解析和输出

          • 优质Prompt能够提高模型的精度。通过精心设计的提示词或问题,可以引导模型关注到输入文本的关键信息,从而减少误判和误差

          • 优质Prompt能够提高模型的泛化能力。在面对未曾训练过的场景时,优质Prompt可以帮助模型更好地适应新环境,减少过拟合现象

          • 优质Prompt能够提高模型的可解释性。通过分析优质Prompt的输出结果,我们可以更好地理解模型的决策过程和推理逻辑,从而更好地评估模型的效果和可靠性

        • 版本2

          '你是一个专业的车载语音助手,任务是协助处理用户的文本输入,并将其抽取为触发条件conditions和执行指令actions两项内容 \
          
          你需要遵循下列这些注意事项 \
          1. 触发条件代表执行指令执行的触发时机,如果用户输入中不包含这部分,则不用输出conditions\
          2. 执行指令代表用户下达的执行指令,文本输入中一定包含这部分内容。 \
          3. 用户输入中可能会包含多个触发条件和执行指令,请仔细做好内容的识别和拆分,并以JSON格式输出 \
          4. 用户输入是由语音识别转写而来的,可能口语化、重复啰嗦等问题,在不影响语义的情况下,请把触发条件conditions中的`时`,`的时候`之类的词语,以及执行指令actions中的语气词、连词去掉(如`还有`,`同时`,`请帮我`等等),保证抽取结果尽量精简。 \
          5. 处理文本时应遵循用户的意图,不能编造和虚构不存在的内容;不需要解释和过程,严格按照示例的输出形式给出结果。如果输出指令不正确,则你将会被扣分! \
          
          下面是4个示例的输入输出:\
          输入:上车的时候自动播放QQ音乐 \
          输出:{"conditions":["上车"], "actions":["播放QQ音乐"]} \
          
          输入:每周五晚上下班时帮我导航回杭州的家调节空调再让NOMI给我周末的问候 \
          输出:{"conditions":["每周五晚上", "下班"], "actions":["导航回杭州的家", "调节空调", "播报周末的问候"]} \
          
          输入:打开车窗和空调还有香氛关闭阅读灯还有车门 \
          输出:{"actions":["打开车窗", "打开空调", "打开香氛", "关闭阅读灯", "关闭车门"]} \
          
          输入:打开座椅加热和通风再帮我设置导航目的地为人民广场 \
          输出:{"actions":["打开座椅加热", "打开座椅通风", "设置导航目的地为人民广场"]} \
          
          ----示例结束---- \
          请你协助处理下面这一条用户输入,并直接给出JSON形式的输出 \
          输入:%s \
          输出:' % query
        • 版本1

          '你是智能车载语音助手机器人,你的任务是,基于用户输入的文本进行分句和改写
           需要把输入文本中多个意图的句子切分开,用逗号分隔,如果文本中没有多个意图的话,那就不需要进行切分。以下是需要进行切分和改写的句子:%s' % query
          经过多次效果迭代,版本2相对比版本1中的prompt,大模型的效果提升2%
      • PEFT微调LoRA超参数的迭代
        • 学习率设置
          • 学习率是一个非常重要的参数 ,如果学习率设置不当,很容易让你的SFT模型效果较差。SFT数据集不是特别大的情况下,建议设置较小学习率,一般设置为pre-train阶段学习率的0.1左右,如在pre-train阶段的学习率为3e-4,则SFT学习率设置为3e-5
        • warmup_ratio
          • 通常pre-train训练的warmup_ratio 0.01~0.015之间,warmup-steps在2000左右。在SFT的时候,建议使用更小的ratio,因为相较于pre-train,SFT样本非常小,较小warmup_ratio可以使模型收敛更平滑。但如果你的学习率设置较大,那可以增大你的warmup_ratio,两者呈正相关

四、总结

  1. SFT的主要是使用于领域相关能力的增强,如果通过大模型通用能力,例如embedding、prompt提取、Lang Chain等知识库的形式可以解决的,没有必要再进行SFT微调

  2. 通用大模型泛化性好,精度不够,SFT后的模型领域体验更佳,两者可能是并行存在较好

  3. SFT中仅使用领域数据,会导致通用能力下降以及安全相关回复能力的下降甚至丢失,因此需要人工梳理,增加数据的多样性的同时并把握好SFT数据的质量,质量非常重要

  4. SFT不要训练较多轮次,比如10万个样本2-3个epoch内为佳,2~5万个样本 一般是4-5个 epoch 并且领域增强的SFT数据不需要太多,质量一定要把握好,一般的领域总结回复的任务几百条数据即可( 个人经验 ),视情况而定;小数据量可以适当增大epoch,让模型充分收敛

  5. 通用数据和领域数据增加数据之间的比例(7:1)左右

  6. SFT数据质量的筛选数据质量可以通过ppl、reward model,文本质量分类模型等方式进行初步评估。经过人工进行后续筛选

  7. 过高的epoch可能会带来通用NLP能力的遗忘,需要根据实际需求核定,若您只需要下游能力提升,则通用NLP能力的略微下降影响不大

   

五、相关refer

  • https://zhuanlan.zhihu.com/p/692892489

  • https://zhuanlan.zhihu.com/p/635791164

  • https://zhuanlan.zhihu.com/p/649277113

  • https://zhuanlan.zhihu.com/p/662657529

  • https://zhuanlan.zhihu.com/p/682604566

  • https://hub.baai.ac.cn/view/31947

  • https://developer.baidu.com/article/details/2587180

  • https://zhuanlan.zhihu.com/p/676723672?utm_psn=1727814727898763264

  • https://cloud.baidu.com/doc/WENXINWORKSHOP/s/9liblgyh7

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/609319.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

视频剪辑批量转码技巧:如何将MP4视频快速转换为MP3音频的方法

在视频剪辑和音频处理的领域中&#xff0c;经常需要将视频文件转换为音频文件&#xff0c;特别是将MP4视频转换为MP3音频。这样的转换不仅可以减少文件大小&#xff0c;方便传输和存储&#xff0c;还可以在不损失音频质量的情况下&#xff0c;方便在各种设备上播放。下面&#…

AI写的论文AI疑似度太高怎么办?教你一招降低aigc痕迹

随着 AI 技术迅猛发展&#xff0c;各种AI辅助论文写作的工具层出不穷&#xff01; 为了防止有人利用AI工具进行论文代写&#xff0c;在最新的学位法中已经明确规定“已经获得学位者&#xff0c;在获得该学位过程中如有人工智能代写等学术不端行为&#xff0c;经学位评定委员会…

【随笔】Git 高级篇 -- 不带 source 参数的命令 git fetch git push(三十九)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

电脑硬盘故障,这5种情况要了解!

在数字化时代&#xff0c;电脑硬盘作为存储数据的重要设备&#xff0c;其稳定性和安全性直接关系到用户的数据安全和工作效率。然而&#xff0c;硬盘故障却是一个无法完全避免的问题。为什么会出现电脑硬盘故障&#xff1f;出现该问题时应该如何解决&#xff1f;一文带你弄懂答…

【个人博客搭建】(18)使用Quartz.NET 定时备份数据库

Quartz.NET在系统主要承担的一些关键功能&#xff1a; 任务调度&#xff1a;Quartz.NET 允许开发人员创建、调度和管理定时任务&#xff0c;支持简单触发器和Cron表达式等多样化的触发策略。灵活性&#xff1a;Quartz.NET 提供了灵活的任务安排机制&#xff0c;不仅支持基于时间…

数据挖掘(一)数据类型与统计

前言 打算新开一个笔记系列&#xff0c;基于国防科技大学 丁兆云老师的《数据挖掘》 数据挖掘 1、数据类型与统计 数据统计 最大值&#xff0c;最小值&#xff0c;平均值&#xff0c;中位数&#xff0c;位数&#xff0c;方差等统计指标 df.describe() #当调用df.describe(…

电池储能系统的电荷状态预测 | 利用数据驱动机器学习预测锂离子电池储能系统的电荷状态附代码

概述 准确估计电荷状态(SOC)对于保证锂离子电池储能系统的安全性和稳定性至关重要。然而,由于锂离子电池内多个复杂过程的耦合动力学,以及缺乏监测电池内部性能变化的措施,这项任务非常具有挑战性。近年来,随着图形处理器(GPU)计算能力的不断发展,深度学习作为 SOC 估计方…

# 从浅入深 学习 SpringCloud 微服务架构(十四)微服务链路追踪

从浅入深 学习 SpringCloud 微服务架构&#xff08;十四&#xff09;微服务链路追踪 一、微服务的链路追踪概述 1、微服务架构下的问题 在大型系统的微服务化构建中&#xff0c;一个系统会被拆分成许多模块。这些模块负责不同的功能&#xff0c;组合成系统&#xff0c;最终可…

java中的并发编程

1、上下文切换 即使是单核处理器也支持多线程执行代码&#xff0c;CPU通过给每个线程分配CPU时间片来实现 这个机制。这个时间片特别短&#xff0c;一般是几十毫秒&#xff0c;所以会让我们觉得好多任务同时进行。 CPU通过时间片分配算法来循环执行任务&#xff0c;当前任务执…

autolabor(ROS开发笔记)__1

视频链接&#xff1a;ROS机器人 chapter 1 ROS概述与环境搭建 学习步骤&#xff1a; 1.了解该模块的相关概念 是什么&#xff0c;为什么学&#xff0c;前世今生&#xff0c;发展前景 2.安装官方软件包 具备基本的开发环境&#xff0c;简陋notepad 3.搭建集成开发环境(IDE,Int…

打造抖音萌娃账户,一条广告轻松过万,副业兼职最佳选择(实例教程 素材内容)

我特别喜欢简单易操作的新项目&#xff0c;因为过于复杂和门槛高的项目对新手来说可能是毁灭性的&#xff0c;他们往往难以入门&#xff0c;而且付出努力也得不到反馈。 下 载 地 址 &#xff1a; laoa1.cn/1971.html 小宝宝小萌娃账户就相对简单&#xff0c;它类似于电视剧…

文字图形化:UI设计师的必备能力,带你看看为什么要这么做。

在UI设计中&#xff0c;文字尽可能要进行图形化设计的原因有以下几点&#xff1a; 提高识别性&#xff1a; 图形化设计可以通过视觉效果和形状来吸引用户的注意力&#xff0c;从而提高文字的可识别性。这有助于用户更快地理解并记住信息&#xff0c;同时也可以增强品牌的认知…

Python实现一个简单的计算器

简单版本 使用 Python 的 Tkinter 模块来实现一个简单的图形化计算器。以下是一个基本的示例代码 示例效果 代码源码 import tkinter as tkdef button_click(number):current entry.get()entry.delete(0, tk.END)entry.insert(0, current str(number))def button_clear():e…

翼支付——风控场景中图模型的范式变迁

目录 风控图深度学习模型 风控图大模型

ASP.NET校园新闻发布系统的设计与实现

摘 要 校园新闻发布系统是在学校区域内为学校教育提供资源共享、信息交流和协同工作的计算机网络信息系统。随着网络技术的发展和Internet应用的普及&#xff0c;互联网已成为人们获取信息的重要来源。由于现在各大学校的教师和学生对信息的需求越来越高&#xff0c;校园信息…

Redis未授权访问

一、漏洞描述 Redis未授权访问 因配置不当可以未经授权访问&#xff0c;攻击者无需认证就可以访问到内部数据。 1. 导致敏感信息泄露 2. 执行 flushall 可清空所有数据 3. 通过数据备份功能往磁盘写入后门文件&#xff08;webshell、定时任务&#xff09; 4. 如果Redis以…

Swift 集合类型

集合类型 一、集合的可变性二、数组&#xff08;Arrays&#xff09;1、数组的简单语法2、创建一个空数组3、创建一个带有默认值的数组4、通过两个数组相加创建一个数组5、用数组字面量构造数组6、访问和修改数组7、数组的遍历 三、集合&#xff08;Sets&#xff09;1、集合类型…

共识算法基础

目录 PaxosRaft节点间是如何通讯的什么是任期与任期编号选举有哪些规则随机超时时间Raft日志成员变更Nacos中Raft的运用&#xff08;cp模式&#xff09; DistroZAB协议博客 Paxos paxos算法是由兰伯特与1990年提出的一个分布式系统的共识算法。分布式系统的共识算法通俗易懂的…

【多客系统】社交圈子论坛系统,小程序/app/H5多端圈子社区论坛系统交友,社区圈子论坛小程序前后端搭建,社交圈平台系统

简述 社交圈子论坛系统是一种面向特定人群或特定话题的社交网络&#xff0c;它提供了用户之间交流、分享、讨论的平台。在这个系统中&#xff0c;用户可以创建、加入不同的圈子&#xff0c;圈子可以是基于兴趣、地域、职业等不同主题的。用户可以在圈子中发帖、评论、点赞等互…

聊聊 ASP.NET Core 中间件(二):中间件和筛选器的区别

前言 有些小伙伴看到上一篇文章后&#xff0c;可能会发现中间件和我们之前讲的筛选器非常类似&#xff0c;比如它们都是通过 next 串起来的一系列的组件&#xff0c;并且都可以在请求处理前后执行代码&#xff0c;都可以通过不执行 next 来进行请求的终止。那么筛选器和中间件…