跳到主要内容大模型微调方法总结:从全量到参数高效微调 | 极客日志PythonAI算法
大模型微调方法总结:从全量到参数高效微调
大模型微调旨在解决提示词工程成本过高、效果受限及数据隐私问题。主要分为全量微调(FFT)与参数高效微调(PEFT)。PEFT 包括增加式(如 Adapter、Prefix Tuning、Prompt Tuning)、选择式(BitFit)和重新参数化(LoRA、AdaLoRA)三类。此外还有监督微调(SFT)、人类反馈强化学习(RLHF)及 AI 反馈强化学习(RLAIF)等训练方式。选择合适的微调方案可在可控成本下提升模型在特定领域的能力。实际选型需综合考虑资源、性能和部署环境,LoRA 因实现简单且推理无延迟成为当前最流行选择。
大模型已成为 AI 时代的基础设施。作为像水、电一样的基础设施,预训练大模型这样的艰巨任务,只会有少数技术实力强、财力雄厚的公司去做。绝大多数人是大模型的应用者。对这部分人来说,掌握如何用好大模型的技术更加重要。
用好大模型的第一个层次是掌握提示词工程(Prompt Engineering)。
用好大模型的第二个层次是大模型的微调(Fine Tuning),这也是本文的主题。
为什么要对大模型进行微调
- 训练成本非常高:大模型的参数量非常大,每家公司都去从头训练一个自己的大模型,性价比非常低;
- Prompt Engineering 的局限性:这种方式虽然容易上手,但缺点明显。大模型对输入序列长度有限制,Prompt Engineering 会把 Prompt 搞得很长。越长的 Prompt,推理成本越高,因为推理成本跟 Prompt 长度的平方正向相关。另外,Prompt 太长会因超过限制而被截断,导致输出质量打折,这是一个严重的问题。
- 特定领域能力提升:如果企业有比较好的自有数据,可以通过自有数据更好地提升大模型在特定领域的能力,这时候微调非常适用。
- 个性化服务:要在个性化的服务中使用大模型的能力,针对每个用户的数据训练一个轻量级的微调模型是一个不错的方案。
- 数据安全:如果数据不能传递给第三方大模型服务,搭建自己的大模型就非常必要。通常这些开源的大模型需要用自有数据进行微调才能满足业务需求。
什么时候需要 LLM 微调
说起 LLM,总会涉及到上下文学习、零样本、单样本和少样本推理等话题。
- 上下文学习(In-context learning):通过在提示中加入特定任务示例来改进提示的方法,为 LLM 提供了完成任务的蓝图。
- 零样本(Zero-shot)、单样本(One-shot)和少样本(Few-shot)推理:零样本推理是在提示中直接使用输入数据,不添加额外示例。如果零样本推理未能达到预期结果,可以使用单样本或少样本推理。这些策略涉及在提示中添加一个或多个已完成的示例,帮助较小的 LLM 表现得更好。
- 上下文学习的问题:将以上这些技术直接应用于用户提示,旨在优化模型输出,使其更符合用户偏好。问题是它们并不总是有效,尤其是对于较小的 LLM。除此之外,在提示中包含的任何示例都会占用宝贵的上下文窗口空间,减少了包含其他有用信息的空间。
当以上方式无法解决相关问题时,这就需要 LLM 微调。但它与预训练阶段使用大量非结构化文本数据不同,微调是一个监督学习过程。这意味着你使用标记好的示例数据集来更新 LLM 的权重。这些标记好的示例通常是 prompt-response,使得模型能更好地完成特定任务。
如何对大模型进行微调
从参数规模的角度
-
全量微调(FFT, Full Fine Tuning):对全量的参数进行全量的训练。原理是用特定的数据对大模型进行训练,将 W 变成 W',W'相比 W,最大的优点就是上述特定数据领域的表现会好很多。
- 缺点:训练成本高,参数量跟预训练的一样多;存在灾难性遗忘(Catastrophic Forgetting),用特定训练数据去微调可能会把原来表现好的别的领域的能力变差。
-
参数高效微调(PEFT, Parameter-Efficient Fine Tuning):只对部分的参数进行训练。主要想解决的问题是 FFT 存在的成本高和灾难性遗忘问题,是目前比较主流的微调方案。
从训练数据的来源及方法角度
- 监督式微调(SFT, Supervised Fine Tuning):用人工标注的数据,用传统机器学习中监督学习的方法对大模型进行微调。
- 基于人类反馈的强化学习微调(RLHF, Reinforcement Learning with Human Feedback):把人类的反馈通过强化学习的方式引入到对大模型的微调中去,让大模型生成的结果更加符合人类的一些期望。
- 基于 AI 反馈的强化学习微调(RLAIF, Reinforcement Learning with AI Feedback):原理大致跟 RLHF 类似,但是反馈的来源是 AI。这里想解决反馈系统的效率问题,因为收集人类反馈成本较高、效率较低。
不同的分类角度侧重点不一样,对同一个大模型的微调不局限于某一个方案,可以多个方案一起。微调的最终目的是在可控成本的前提下,尽可能地提升大模型在特定领域的能力。
流行的参数高效微调技术(PEFT)方案
参数高效微调方法可大致分为三个类别:增加式方法、选择式方法和重新参数化式方法。
1. 增加式方法(Additive methods)
增加式方法通过增加额外的参数或层来扩展现有的预训练模型,且仅训练新增加的参数。目前这是 PEFT 方法中被应用最广泛的类别。
在增加式方法中,大致分为 Adapter 类方法和软提示(Soft Prompts)。2019 年 1 月至 2022 年 3 月期间,Adapter 类的方法 Adapter Tuning,软提示类的方法 Prefix Tuning、P-Tuning、Prompt Tuning、P-Tuning v2 相继出现。
1.1 Adapter Tuning
Adapter 的架构是在每一个 Transformer 层中的每个子层之后插入两个串行的 Adapter。在 Adapter 微调期间,新增层是根据下游数据进行训练的,而预训练模型的原参数保持不变。
- Adapter 模块主要由两个前馈(Feed-forward)子层组成。
- 第一个前馈子层将原始特征的维度 d 投影到一个更小的维度 m,应用非线性函数,再投影回维度 d 的特征。
- 总参数量为 2md + d + m。通过设置 m < d,限制了每个任务添加的参数数量。
- 当投影层的参数初始化接近零时,根据一个 skip-connection,将该模块就初始化为近似恒等函数,以确保微调的有效性。
实验结果:使用公开的预训练 BERT 作为基础模型。Adapter 微调具有高参数效率,可以生成性能强劲的紧凑模型,与完全微调相比表现相当。Adapter 通过使用原始模型 0.5-5% 大小的参数量来微调,性能与 BERT-LARGE 上具有竞争力的结果相差不到 1%。
1.2 Soft Prompts
早期的提示微调通过修改输入文本来控制语言模型的行为,称为硬提示(Hard Prompts)微调。这些方法很难优化,且受到最大模型输入长度的限制。
软提示(Soft Prompts)将离散的'提示'问题转为连续的'提示'问题,通过反向传播和梯度下降更新参数来学习 Prompts,而不是人工设计 Prompts。有仅对输入层进行训练,也有对所有层进行训练的类型。
1.2.1 Prefix Tuning
Prefix Tuning 的灵感来源于 Prompt Engineering 的实践表明,在不改变大模型的前提下,在 Prompt 上下文中添加适当的条件,可以引导大模型有更加出色的表现。
Prompt Tuning 是在 Embedding 环节往输入序列 X 前面加特定的 Token。而 Prefix Tuning 是在 Transformer 的 Encoder 和 Decoder 的网络中都加了一些特定的前缀。
具体来说,就是将 Y=WX 中的 W,变成 W' = [Wp; W],Y=W'X。Prefix Tuning 也保证了基座模型本身是没有变的,只是在推理的过程中,按需要在 W 前面拼接一些参数。
- 冻结预训练语言模型的参数,为每个任务存储特定的连续可微的前缀,节省空间。
- 训练间增加 MLP 层以达到稳定。
- 对于不同模型构造不同的 Prefix。
实验结果:对于表格到文本任务,使用 GPT-2MEDIUM 和 GPT-2LARGE 模型。在表格到文本任务上,Prefix Tuning 优于 Fine-Tuning 和 Adapter-Tuning。对于摘要任务,使用 BART-LARGE 模型。在摘要任务上,Prefix Tuning 比全量微调弱。
1.2.2 P-Tuning
- P-Tuning 只在输入层加入可微的 Virtual Token,其会自动插入到文本提示的离散 Token 嵌入中。
- Virtual Token 不一定作为前缀,其插入位置是可选的。
实验结果:使用的是 GPT 系列和 BERT 系列的模型。P-Tuning 与全参数效果相当,且在一些任务上优于全参数微调,可以显著提高 GPT 模型在自然语言理解方面的性能,并且 BERT 风格的模型也可以获得较小的增益。
1.2.3 Prompt Tuning
Prompt Tuning 的出发点是基座模型(Foundation Model)的参数不变,为每个特定任务训练一个少量参数的小模型,在具体执行特定任务的时候按需调用。
基本原理是在输入序列 X 之前,增加一些特定长度的特殊 Token,以增大生成期望序列的概率。
具体来说,就是将 X = [x1, x2, …, xm] 变成,X' = [x'1, x'2, …, x'k; x1, x2, …, xm], Y = WX'。
Prompt Tuning 发生在 Embedding 这个环节。如果将大模型比做一个函数:Y=f(X),那么 Prompt Tuning 就是在保证函数本身不变的前提下,在 X 前面加上了一些特定的内容,而这些内容可以影响 X 生成期望中 Y 的概率。
- 只在输入层加入 Prompt,并且不需要加入 MLP 进行调整来解决难训练的问题。
- 提出了 Prompt Ensembling,即通过在同一任务上训练 N 个提示,相当于为任务创建了 N 个独立的'模型',同时仍然共享核心语言建模参数。
实验结果:使用的是预训练的各种 T5 模型。在流行的 SuperGLUE 基准测试中,Prompt Tuning 的任务性能与传统的模型调优相当,且随着模型规模的增加,差距逐渐减小。在零样本领域迁移中,Prompt Tuning 可以改善泛化性能。
1.2.4 P-Tuning v2
- P-Tuning v2 每一层的输入都加入了 Tokens,允许更高的任务容量同时保持参数效率;且添加到更深层的提示对模型的预测有更直接的影响。
实验结果:使用的是 BERT 系列和 GLM 系列模型。P-Tuning v2 是一种在不同规模和任务中都可与微调相媲美的提示方法。在 NLU 任务中,整体上 P-Tuning v2 与全量微调的性能相差很小。
2. 选择式方法
选择性方法对模型的现有参数进行微调,可以根据层的深度、层类型或者甚至是个别参数进行选择。
2.1 BitFit
2022 年 9 月 5 日,BitFit 出现,这是一种稀疏微调方法,仅修改模型的 Bias(偏置项)或其中的子集。
- 冻结大部分 Transformer 编码器的参数,只训练偏置项和任务特定的分类层。
- 优化的偏置项参数包括 Attention 模块中计算 Query、Key、Value 时,计算 MLP 层时,计算 Layernormalization 层时遇到的偏置项参数。
- 每个新任务只需要存储偏置项参数向量(占总参数数量的不到 0.1%)和任务特定的最终线性分类器层。
实验结果:使用公开可用的预训练 BERTBASE、BERTLARGE 和 RoBERTaBA 模型。BitFit 微调结果不及全量参数微调,但在极少数参数可更新的情况下,远超 Frozen(冻结模型参数)方式。
3. 重新参数化方法
基于重新参数化的高效微调方法利用低秩表示来最小化可训练参数的数量,其中包括 2021 年 10 月到 2023 年 3 月间出现的 LoRA 和 AdaRoLA 方法。
3.1 LoRA
LoRA 是跟 Prompt Tuning 和 Prefix Tuning 完全不相同的另一条技术路线。
LoRA 背后有一个假设:我们现在看到的这些大语言模型,它们都是被过度参数化的。而过度参数化的大模型背后,都有一个低维的本质模型。大白话说:大模型参数很多,但并不是所有的参数都是发挥同样作用的;大模型中有其中一部分参数,是非常重要的,是影响大模型生成结果的关键参数,这部分关键参数就是上面提到的低维的本质模型。
- 首先,要适配特定的下游任务,要训练一个特定的模型,将 Y=WX 变成 Y=(W+∆W)X,这里面∆W 主要是我们要微调得到的结果;
- 其次,将∆W 进行低维分解∆W=AB (∆W 为 m * n 维,A 为 m * r 维,B 为 r * n 维,r 就是上述假设中的低维);
- 接下来,用特定的训练数据,训练出 A 和 B 即可得到∆W,在推理的过程中直接将∆W 加到 W 上去,再没有额外的成本。
- 另外,如果要用 LoRA 适配不同的场景,切换也非常方便,做简单的矩阵加法即可:(W + ∆W) - ∆W + ∆W'。
该方法认为模型权重矩阵在特定微调后具有较低的本征秩,故基于秩分解的概念,将预训练模型的现有权重矩阵分成两个较小的矩阵。
- 将矩阵乘积 BA 加到原模型参数矩阵 W 上可以避免推理延迟。
- 可插拔的低秩分解矩阵模块,方便切换到不同的任务。
实验结果:使用的模型是 RoBERTa、DeBERTa、GPT-2、GPT-3 175B。在多个数据集上,LoRA 在性能上能和全量微调相近,且在某些任务上优于全量微调。
3.2 AdaLoRA
- 该方法基于权重矩阵的重要性而自适应调整不同模块的秩,节省计算量,可理解为 LoRA 的升级版。
- 做法是让模型学习 SVD 分解的近似。在损失函数中增加了惩罚项,防止矩阵 P 和 Q 偏离正交性太远,以实现稳定训练。
实验结果:使用的模型是 DeBERTaV3-base 和 BART-large 模型。AdaLoRA 的性能通常高于参数量更高的方法。其中,AdaLoRA 在 0.32M 微调参数时,在 CoLA 数据集上达到了 70.04 的 Mcc 分数。
4. 参数微调方法小结
以上几类参数高效微调方法各有千秋。Adapter 方法在预训练模型的层中插入可训练模块的形式简单,但增加推理延时。Soft Prompts 方法避免了人工'硬提示'的局限性,却可能难收敛。
Soft Prompts 方法中,Prefix Tuning 率先提出可用梯度下降法优化的 Tokens,而 P-Tuning、Prompt Tuning、P-Tuning v2 相继作出不同的改变,比如:
- 加入的 Tokens:P-Tuning 仅限于输入层,而 Prefix-Tuning 在每一层都加。
- P-Tuning 和 Prompt Tuning 仅将连续提示插入到输入嵌入序列中,而 Prefix Tuning 的'软提示'添加在每一个 Transformer Block 中。
- Prompt Tuning 不需要额外的 MLP 来解决难训练的问题,P-Tuning v2 移除了重参数化的编码器。
BitFit 方法只更新模型内部偏置项参数所以训练参数量很微小,但整体效果比 LoRA、Adapter 等方法弱。LoRA 方法不存在推理延时,但无法动态更新增量矩阵的秩,不过改进版 AdaLoRA 解决了这个问题。
实践建议与选型指南
在实际项目中选择合适的微调方案,需要综合考虑资源、性能和部署环境。
- 资源受限场景:如果显存有限,无法支撑全量微调,PEFT 是首选。其中 LoRA 因其实现简单、效果好且推理无延迟,成为当前最流行的选择。
- 快速迭代场景:如果需要频繁切换任务,LoRA 的可插拔特性非常适合,只需加载不同的适配器权重即可。
- 极致性能场景:如果对特定任务的精度要求极高,且资源充足,全量微调(FFT)仍然是上限最高的方案,尽管代价较大。
- 隐私敏感场景:涉及敏感数据时,必须本地化部署并进行微调,此时结合 SFT 和 PEFT 可以在保护数据的同时降低训练门槛。
总之,微调技术的核心在于平衡成本与效果。随着技术的发展,参数高效微调将成为大多数企业和开发者的标准配置,而全量微调则更多用于构建基础底座模型。开发者应根据自身业务需求,灵活组合 SFT、RLHF 及各类 PEFT 技术,以最大化大模型的价值。
相关免费在线工具
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online