大语言模型微调的基本概念介绍
大型语言模型(LLMs)正在以惊人的速度发展,LLM微调的潜力更是如此。大型语言模型的生命周期有几个关键步骤,今天我们将要介绍这个周期中最丰富、最耗时的一部分——LLM微调过程。
大语言模型的生命周期
在深入了解大型语言模型(LLM)微调之前,了解LLM的生命周期及其运行方式是很重要的。
-
愿景与范围:首先,应该定义项目的愿景。确定你的大型语言模型(LLM)是作为一个更普遍的工具,还是针对特定任务,如命名实体识别。明确的目标可以节省时间和资源。
-
模型选择:选择从头开始训练一个模型或者修改现有的模型。在许多情况下,调整一个已有的模型是高效的,但在某些情况下,可能需要通过一个新模型来进行微调。
-
模型性能和调整:准备好你的模型后,你需要评估其性能。如果效果不佳,尝试提示工程或进一步微调。我们将重点关注这部分。确保模型的输出与人类的偏好一致。
-
评估与迭代:定期使用指标和基准进行评估。在提示工程、微调和LLM评估之间进行迭代,直到达到预期的结果。
-
部署:一旦模型表现达到预期,便可进行部署。在此阶段,优化计算效率和用户体验。
什么是LLM微调
大型语言模型(LLM)微调是指在预训练模型的基础上,进一步使用较小且特定的数据集进行训练,以提升模型在特定任务或领域的能力和性能。微调的目的在于将通用模型转变为专业化模型。它弥合了通用预训练模型与具体应用独特需求之间的差距,确保语言模型更好地符合人类的期望。以OpenAI的GPT-3为例,这是一种设计用于广泛自然语言处理(NLP)任务的先进大型语言模型。假设某家医疗机构希望使用GPT-3帮助医生从文字记录中生成病人报告。虽然GPT-3能够理解和创建一般文本,但它可能未针对复杂的医学术语和特定的医疗术语进行优化。
为了增强其在这一专业领域的表现,该机构将GPT-3在充满医疗报告和病人记录的数据集上进行微调。通过这一过程,模型对医学术语、临床语言的细微差别以及典型报告结构变得更加熟悉。经过微调后,GPT-3具备了辅助医生生成准确且连贯的病人报告的能力,展示了其在特定任务中的适应性。
微调的局限性
微调虽然可以提升模型在特定任务上的性能,但可能会导致模型在其他未微调的任务上性能下降。这是因为微调可能会使模型过度适应特定领域的数据,从而失去一些通用性。
何时使用微调
我们的文章关于大型语言模型,涉及了上下文学习以及零/单/少样本推理等主题。以下是一个简要回顾:
上下文学习是一种通过在提示中提供特定任务示例来改进提示的方法,为大型语言模型提供了完成任务的蓝图。
零样本推理在提示中仅包含您的输入数据而不添加额外的例子。如果零样本推理没有达到预期效果,可以使用“单样本”或“少样本推理”。这些策略涉及在提示中添加一个或多个完成的示例,帮助较小的大型语言模型表现更好。

这些是直接在用户提示中使用的技术,旨在优化模型的输出并更好地符合用户的偏好。问题是它们并不总是有效,特别是对于较小的语言模型来说。
除此之外,你在提示中包含的任何示例都会占用上下文窗口中宝贵的空间,从而减少你用于包含其他有用信息的空间。在这里,微调技术终于登场。与使用大量非结构化文本数据的预训练阶段不同,微调是一个监督学习过程。这意味着你使用一个标记示例的数据集来更新大型语言模型的权重。这些标记示例通常是提示-响应对,从而更好地完成特定任务。
监督微调 (SFT)
监督微调是指使用标注数据来更新预训练语言模型以执行特定任务。这些使用的数据已经事先经过检查。这与未经过数据检查的无监督方法不同。通常,语言模型的初始训练是无监督的,但微调是有监督的。
微调是如何进行的?
让我们深入了解大型语言模型中的微调细节。在准备训练数据时,有许多开源数据集可以提供关于用户行为和偏好的洞察,即使它们不是直接以指令数据的格式存在的。例如,我们可以将产品评论的大型数据集转换为用于微调的指令提示数据集。提示模板库包含许多适用于不同任务和不同数据集的模板。
一旦指令数据集准备就绪,就像标准的监督学习一样,您将数据集划分为训练、验证和测试集。在微调期间,您从训练数据集中选择提示并传递给大型语言模型(LLM),然后生成补全。
在微调阶段,当模型接触到针对目标任务的新标记数据集时,它会计算其预测与实际标签之间的误差或差异。模型随后使用此误差来调整其权重,通常通过梯度下降等优化算法进行。权重调整的幅度和方向取决于梯度,梯度表明每个权重对误差的贡献程度。对误差负责较多的权重会被调整得更多,而对误差负责较少的权重则调整得较少。
在多次迭代(或称为训练轮次)中,模型不断调整其权重,逐步达到能够将误差降到最低的配置。目标是将先前学到的一般知识适应于新数据集中存在的细微差别和特定模式,从而使模型在特定任务上变得更加专业和有效。
在此过程中,模型通过标记数据进行更新。它根据自己的预测与实际答案之间的差异进行变化。这有助于模型学习标记数据中的细节。通过这样做,模型在它被微调的任务上得以改进。
让我们来举个例子来更好地说明这一点:如果你问一个预训练模型“为什么天空是蓝的?”,它可能会回答“因为大气散射阳光的方式。”这个答案简单直接。然而,对于一个科学教育平台的聊天机器人来说,这个答案可能过于简略。根据你的指导原则,它可能需要更多的科学细节或背景。在这种情况下,监督微调就派上用场了。

经过微调后,模型可以对科学问题给出更深入的回答。例如,当被问到“为什么天空是蓝色的?”时,模型可能提供如下更详细的解释:
“天空看起来是蓝色的,是由于一种叫做瑞利散射的现象。阳光进入地球大气层时,由不同颜色组成,每种颜色都有各自的波长。蓝光的波长较短,被大气中的气体和微粒向各个方向散射。这种散射导致直接的阳光看起来是白色的,但天空本身则呈现出蓝色的色调。” 这种丰富的回答既全面又适合用在科学教育平台上。
微调大型语言模型的方法
LLM微调是一种监督学习过程,其中使用标注示例的数据集来更新LLM的权重,从而提高模型针对特定任务的能力。让我们来探讨一些用于微调LLM和LLM Agent的显著方法。
指令微调
提升模型在各种任务上的性能的一种策略是指令微调。这意味着使用示例来训练机器学习模型,这些示例展示了模型应如何响应查询。用于微调整大型语言模型的数据集必须符合你的指令目的。例如,假设你微调模型以提高其总结能力,那么你应该构建一个数据集,其中的示例以“总结”指令开头,后面跟随文本或类似短语。在翻译任务中,你应该包含如“翻译这段文字”这样的指令。这些提示完成对可以让你的模型以新的特定方式“思考”,并执行给定的具体任务。

指令微调(Instruction Fine-Tuning,简称IFT)可以被视为监督式微调(Supervised Fine-Tuning,简称SFT)的一种形式。它通过准备特定的输入和输出对,让模型学习其中的规律,从而提升模型在特定任务上的表现。
完全微调
指令微调(Instruction fine-tuning),即更新模型的所有权重,被称为完全微调(full fine-tuning)。这个过程会产生一个具有更新权重的新版本模型。需要注意的是,与预训练类似,完全微调也需要足够的内存和计算资源来存储和处理在训练过程中更新的所有梯度、优化器和其他组件。
参数高效微调
训练语言模型是一项计算密集型任务。进行完整的大型语言模型(LLM)微调时,不仅需要内存来存储模型,还需要用于训练过程的参数。你的计算机可能能够处理模型权重,但在训练过程中,为优化状态、梯度和前向激活分配内存是一个具有挑战性的任务。简单的硬件无法应对如此大的困难。在这种情况下, PEFT(参数高效微调)是至关重要的。虽然完整的LLM微调会在监督学习过程中更新每一个模型权重,但PEFT方法只更新一小部分参数。这种迁移学习技术选择特定的模型组件并“冻结”其余的参数。结果是需要调整的参数数量比原始模型少得多(在某些情况下,仅为原始权重的15-20%;LoRA可以将可训练参数的数量减少到原来的1万分之一)。这使得内存需求更易于管理。不仅如此,PEFT还可以解决灾难性遗忘的问题。由于它不会改变原有的大型语言模型,模型不会忘记先前学习到的信息。完整的微调会为每个训练的任务生成模型的新版本。每一个模型的大小都与原始模型相同,因此如果对多个任务进行微调,可能会造成昂贵的存储问题。
其他类型的微调
迁移学习:迁移学习是指从在通用大型数据集上学习的模型出发,并在特定任务的数据上进行训练。这些数据集可能包括与该领域相关的标注示例。迁移学习用于数据不足或缺乏时间进行训练的情况下,其主要优势是提供更高的学习率和准确性。你可以使用已经在大量数据上预训练的大型语言模型(LLM),如GPT-3/4和BERT,并根据自己的用例进行定制。
任务特定微调:任务特定微调是一种方法,即在特定任务或领域上使用为该领域设计的数据集对预训练模型进行微调。这种方法比迁移学习需要更多的数据和时间,但可以在特定任务上获得更高的性能。
例如,使用该任务的示例数据集进行翻译。有趣的是,使用相对较少的示例也可以获得良好的结果。通常,只需几百或几千个示例就可以获得良好的性能,而模型在预训练阶段看到的是数十亿条文本。然而,在单一任务上进行微调可能会导致一个潜在的缺点,即灾难性遗忘。
灾难性遗忘发生在完整的微调过程中修改了原始大型语言模型的权重。虽然这在单一微调任务上表现出色,但可能会降低在其他任务上的性能。例如,微调可以提高模型执行某些自然语言处理(NLP)任务(如情感分析)的能力,并导致高质量的完成,但模型可能会忘记如何执行其他任务。在微调前,模型能够正确识别命名实体。
多任务学习:多任务微调是单任务微调的扩展,其中训练数据集包含多个任务的输入和输出示例。在这里,数据集包含指导模型执行各种任务的示例,包括摘要、评论评级、代码翻译和实体识别。通过在这个混合数据集上训练模型,可以提高模型在所有任务上的性能,从而避免灾难性遗忘的问题。经过多次训练迭代,计算出的损失用于更新模型的权重,结果是一个微调后的模型,能够同时在多种不同任务上表现良好。多任务微调模型的一个缺点是需要大量的数据。你可能需要多达5万到10万个示例在你的训练集中。然而,收集这些数据是非常值得的,结果往往是非常有能力且适合在需要多任务良好性能的情况下使用的模型。
顺序微调:顺序微调是指在几个相关任务上依次适应预训练模型。在转移到通用领域后,LLM可以在更具体的子集上进行微调。例如,它可以从一般语言微调到医学语言,然后从医学语言微调到小儿心脏病学。
请注意,还有其他微调示例——自适应、行为和指令、强化微调大型语言模型。这些涵盖了训练语言模型的一些重要具体情况。
微调方法现在也被广泛应用于小型语言模型(SLM),这已成为2024年最大的生成式AI趋势之一。微调小型语言模型实际上更加方便且易于实现,特别是如果你是一家小企业或开发人员,想要提高模型的性能。
检索增强生成(RAG)
检索增强生成(RAG)是一种广为人知的微调替代方法,它结合了自然语言生成和信息检索。RAG 确保语言模型以外部最新的知识来源/相关文档为基础,并提供信息来源。
RAG相比于微调的一个优点是信息管理。传统的微调将数据嵌入到模型的架构中,从而“固化”了知识,导致难以进行修改。而RAG允许训练数据的持续更新,并能够删除或修订数据,确保模型保持最新和准确。
在语言模型的背景下,RAG和微调通常被视为竞争方法。然而,将二者结合使用可以显著提升性能。特别是,可以对RAG系统进行微调,以识别和改进其较弱的部分,帮助它们在特定的大型语言模型任务中表现出色。
为什么需要微调?什么时候需要一个微调模型?
我们知道,Chat GPT和其他语言模型能够回答大量的问题。但问题在于,个人和公司希望拥有自己的大语言模型接口,以便处理他们的私人和专有数据。这是技术领域新热门话题——面向企业的大语言模型。
下面是需要对大语言模型(LLM)进行微调的一些原因:
-
特殊性和相关性:尽管LLM在大量数据上进行了训练,它们可能不了解与特定业务或行业相关的专门术语、细微差别或上下文。微调可以确保模型理解并生成高度相关的业务内容。
-
提高准确性:对于关键的业务功能,错误的容忍度很低。对特定业务数据进行微调可以帮助实现更高的准确性水平,确保模型的输出与预期密切一致。
-
定制化互动:如果您将LLM用于客户互动,例如聊天机器人,微调可以帮助调整响应以符合您品牌的声音、语调和指导原则,从而确保一致且拥有品牌特色的用户体验。
-
数据隐私和安全:通用的LLM可能会基于公开可用的数据生成输出。微调允许企业控制模型接触的数据,确保生成的内容不会无意中泄露敏感信息。
-
应对罕见场景:每个企业都会遇到特定领域中的罕见但重要的场景。一般的LLM可能无法最佳地处理这些情况。微调可以确保有效满足这些特殊情况。
虽然LLM提供了广泛的能力,微调可以使这些能力更加符合企业的独特需求,确保最佳性能和结果。
相关文章:
大语言模型微调的基本概念介绍
大型语言模型(LLMs)正在以惊人的速度发展,LLM微调的潜力更是如此。大型语言模型的生命周期有几个关键步骤,今天我们将要介绍这个周期中最丰富、最耗时的一部分——LLM微调过程。 大语言模型的生命周期 在深入了解大型语言模型&a…...
实例分割 | yolov11训练自己的数据集
前言 因工作要求使用的都是yolov5系列的模型,今天学习一下最先进的yolov11,记录一下环境配置及训练过程。 1.项目下载及环境安装 源码位置:yolov11 可以看到,这里要求python版本大于等于3.8,我这里安装python3.10.…...
vue3:四嵌套路由的实现
一、前言 1、嵌套路由的含义 嵌套路由的核心思想是:在某个路由的组件内部,可以定义子路由,这些子路由会渲染在父路由组件的特定位置(通常是 <router-view> 标签所在的位置)。通过嵌套路由,你可以实…...
AIGC和搜索引擎的异同
AIGC(生成式人工智能)与搜索引擎的核心差异体现在信息处理方式和输出形态上,我们可以从以下维度对比: 一、工作原理的本质差异 信息检索机制 搜索引擎:基于关键词匹配(如"中暑怎么办"→返回相关…...
ES批量查询
在 Elasticsearch 中,multi_search(也称为 msearch)是一种允许你在单个请求中执行多个搜索操作的 API。它可以显著减少网络开销,尤其是在需要执行多个查询时。multi_search 会将多个查询打包成一个请求发送给 Elasticsearch&#…...
Vue2学习
一、Vue3 基础 监视属性 天气案例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>天气案例</…...
PySide(PyQT)重新定义contextMenuEvent()实现鼠标右键弹出菜单
在 PySide中,contextMenuEvent() 是 QWidget 类(以及继承自它的所有子类)的一个事件处理方法,主要用于处理上下文菜单事件,也就是当用户在控件上右键点击时触发的事件。 • 通过重新定义contextMenuEvent()来实现自定…...
Storm实时流式计算系统(全解)——下
storm编程案例-网站访问来源实时统计-需求 storm编程-网站访问来源实时统计-代码实现 根据以上条件可以只写一个类,我们只需要写2个方法和一个main(),一个读取/发射(spout)。 一个拿到数据统计后发到redis…...
配置Nginx日志url encode问题
文章目录 配置Nginx日志url encode问题方法1-lua方法2-set-misc-nginx-module 配置Nginx日志url encode问题 问题描述: 当自定义日志输出格式,需要输出http请求中url参数时,如果参数中包含中文,是会进行url encode的,…...
JAVA SE 包装类和泛型
文章目录 📕1. 包装类✏️1.1 基本数据类型和对应的包装类✏️1.2 装箱和拆箱✏️1.3 自动装箱和自动拆箱 📕2. 泛型✏️2.1 泛型的语法✏️2.2 泛型类的使用✏️2.3 裸类型(Raw Type)✏️2.4 擦除机制✏️2.5 泛型的上界✏️2.6 泛型方法✏️2.7 通配符…...
基于Linux系统的物联网智能终端
背景 产品研发和项目研发有什么区别?一个令人发指的问题,刚开始工作时项目开发居多,认为项目开发和产品开发区别不大,待后来随着自身能力的提升,逐步感到要开发一个好产品还是比较难的,我认为项目开发的目的…...
从零开始开发纯血鸿蒙应用之语音朗读
从零开始开发纯血鸿蒙应用 〇、前言一、API 选型1、基本情况2、认识TextToSpeechEngine 二、功能集成实践1、改造右上角菜单2、实现语音播报功能2.1、语音引擎的获取和关闭2.2、设置待播报文本2.3、speak 目标文本2.4、设置语音回调 三、总结 〇、前言 中华汉字洋洋洒洒何其多…...
物联网小范围高精度GPS使用
在园区内实现小范围高精度GPS(全球定位系统)定位,通常需要结合多种技术来弥补传统GPS在精度和覆盖范围上的不足。以下是实现小范围高精度GPS定位的解决方案,包括技术选择、系统设计和应用场景。 一、技术选择 在园区内实现高精度…...
一次有趣的前后端跨越排查
进行前后端代码联调的时候,使用axios调用后端请求,因为都是本地进行联调,所以没有考虑跨域的问题,写了一个get的请求接口,请求后端时,突然跳出下面的问题: 错误的信息一看很像就是跨域的问题&…...
大语言模型(LLM)如何赋能时间序列分析?
引言 近年来,大语言模型(LLM)在文本生成、推理和跨模态任务中展现了惊人能力。与此同时,时间序列分析作为工业、金融、物联网等领域的核心技术,长期依赖传统统计模型(如ARIMA)或深度学习模型&a…...
Kubernetes (K8S) 核心原理深度剖析:从架构设计到运行机制
Kubernetes(K8S)作为容器编排领域的“操作系统”,其设计和实现原理是开发者进阶的必修课。本文将从架构设计、核心组件协作、关键机制实现三个维度,结合源码逻辑与实战场景,分享 K8S 的底层运行原理。 一、Kubernetes 架构设计 1. 声明式 API 与控制器模式 K8S 的核心设…...
Excel 豆知识 - XLOOKUP 为啥会出 #N/A 错误
XLOOKUP有的时候会出 #VALUE! 这个错误。 因为这个XLOOUP有个参数叫 找不到时的返回值,那么为啥还会返回 #VALUE! 呢? 可能还有别的原因,但是主要原因应该就是 检索范围 和 返回范围 不同。 比如这里检索范围在 B列,是 4-21&…...
【深度学习】Hopfield网络:模拟联想记忆
Hopfield网络是一种经典的循环神经网络,由物理学家John Hopfield在1982年提出。它的核心功能是模拟联想记忆,类似于人类大脑通过部分信息回忆完整记忆的能力。以下是通俗易懂的解释: 1. 核心思想 想象你看到一张模糊的老照片,虽然…...
Python可视化大框架的研究与应用
## 摘要 随着数据科学和人工智能的快速发展,数据可视化成为了数据分析中不可或缺的一部分。Python作为一种功能强大且易于学习的编程语言,提供了多种可视化工具和库。本文旨在探讨Python可视化的主要框架,分析其特点、应用场景以及未来发展趋…...
Java 泛型(Generics)详解与使用
一、什么是 Java 泛型? 泛型(Generics)是 Java 1.5 引入的一项重要特性,主要用于 类型参数化,允许在类、接口和方法定义时使用 类型参数(Type Parameter),从而提高代码的复用性、类…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
