万字精研:大型语言模型微调Fine-Tuning技术——14种主流方法的原理、适用场景及实践指南
LLM 训练时间和的成本太过庞大,况且个人卷训练经验极为困难,不妨从微调开始搞起。本文对正经的微调方法进行了总结,继续打怪,继续升级~提示:本文对当前常见的微调技术都进行了罗列,由于结合了论文和网络资料导致文章很长,可以先看总结部分先对概念有些印象,如果需要用到对应的微调技术再进行原理探究。
1.Fine-Tuning概览
模型微调(Fine-tuning)是指在已有的大规模预训练语言模型(如 GPT-3、GPT-4、BERT 等)基础上,针对特定任务或领域进行的二次训练过程。
-
预训练(Pre-train)模型通常在大规模无标注文本数据上进行训练,以学习语言的通用表示和规律。
-
微调则是利用针对性的小规模、有标签的数据集,调整模型参数以使其更好地适应并精准完成特定任务,如文本分类、问答、机器翻译、情感分析等。
1.1 全微调(Full Fine-tuning)
全微调是对整个预训练模型的所有参数进行全面更新和优化。在这一过程中,模型的所有层(包括底层的嵌入层、中间的隐藏层和顶层的输出层)都将参与训练,并根据新任务的数据调整各自的权重。
tip:全微调能够充分利用预训练模型的知识,并在此基础上对模型进行大幅度的调整以适应新的任务需求。适用于新任务与预训练任务相差较大或者需要模型具有极高灵活性和自适应能力的情况。
- 优点
相比于部分微调或使用特定微调技术(如 Adapter、LoRA 等),全微调无需在模型内部添加额外的模块或层,模型结构简单,易于理解和实现。全微调过程中,模型从前向后进行整体训练,可以学习到从输入到输出的完整映射关系,有利于优化全局优化目标,对于某些需要全局信息的任务(如文本生成)可能更为有效。
- 缺点
-
需要更多的计算资源(如 GPU 时间、内存)和更长的训练时间,模型越大越显著。
-
在目标任务数据量有限的情况下,全微调可能导致模型过拟合,即对训练数据学习的过于具体,从而在未见过的数据上表现不佳。需要采取正则化、早停等策略来防止过拟合。
-
对所有参数进行重新训练可能导致模型遗忘部分预训练阶段学到的通用知识,特别是当微调数据集较小且分布与预训练数据相差较大时,模型的泛化能力可能受到负面影响。
-
当需要对同一预训练模型进行多次微调以适应不同任务时,每次全微调都会完全覆盖之前的学习结果。若想保留对多个任务的适应能力,需要分别保存每个任务的微调模型副本,增加了存储成本和模型管理复杂性。
-
若微调过程中出现不良训练现象(如梯度爆炸、优化困难等),可能对预训练模型的内部结构造成破坏,影响其在其他任务上的表现。(相对罕见)
1.2 部分微调 (Partial Fine-tuning/Repurposing 或 Parameter-efficient Fine-Turning,PEFT,参数高效微调)
部分微调仅更新模型的顶层 (靠近输出层) 或一小部分中间层的参数,而保留大部分或全部底层预训练模型参数不变。这可以通过冻结部分层的训练(不让其参数更新)或采用特殊结构(如 Adapter、LoRA 等)来实现。
部分微调旨在保留预训练模型在通用语言理解上的优势,同时以较低的成本对模型进行轻度调整以适应新任务。这种方法适用于新任务与预训练任务较为相关,或者希望尽可能保留预训练模型泛化能力的情况。
- 优点
只训练模型的部分参数,通常意味着更少的参数需要更新,这往往导致更快的收敛速度和更低的训练时间成本。预训练模型的底层通常学习到通用的语言结构和模式,部分微调可以避免这些已习得的通用特征被过度修改,从而保持对基础语言结构的良好捕获能力。少量参数的调整相对不易过拟合特定任务的数据,尤其是在下游任务数据量有限的情况下,有助于保持模型的泛化性能。
当面临多个相关任务时,可以使用同一底层预训练模型,仅针对每个任务微调不同的顶层参数,实现知识的有效共享和跨任务迁移
- 缺点
如果只微调模型的顶层,可能无法充分适应某些复杂或高度专业化的下游任务,因为底层特征可能不足以捕捉到这些任务特有的细微差异。顶层参数的调整空间有限,可能难以达到与全微调相当的性能水平,特别是当预训练模型的底层特征与目标任务不完全匹配时。
部分微调可能需要更精细的超参数调整和学习率策略设计,以确保仅更新的部分参数能够有效学习到新的任务特性,同时避免底层参数的退化。对于某些任务,可能需要模型的不同层次乃至整个网络结构都能适应新任务的特点。部分微调的固定更新范围可能限制了这种灵活性。
部分微调的效果很大程度上取决于预训练模型的质量及其底层特征对目标任务的适用程度。如果预训练模型与目标任务不匹配,部分微调可能无法取得良好效果。
下表是网络上搜集的一些信息,展示了在一张 A100 GPU(80G 显存)以及 CPU 内存 64GB 以上的硬件上进行模型全量微调以及参数高效微调对于 CPU/GPU 内存的消耗情况。
部分微调技术可以粗略分为以下三大类:增加额外参数(A)、选取一部分参数更新(S)、引入重参数化(R)。而在增加额外参数这类方法中,又主要分为类适配器(Adapter-like)方法和软提示(Soft prompts)两个小类。
1.3 快速总结
-
BitFit对微调机制的一种积极探索,也很简单,通过仅调整 bias 效果就能有不错的效果,但没有具体阐述原理,就是通过猜测加实验得到的结果。同时,作者提出一个观点:微调的过程不是让模型适应另外的数据分布,而是让模型更好的应用出本身的表征能力。特点:
-
训练参数量极小(约 0.1%)。
-
在大部分任务上效果会差于 LoRA、Adapter 等方法。
-
Prefix Tuning
在每一个 Transformer 层都带上一些 virtual token 作为前缀,以适应不同的任务。特点:
-
前缀 Token 会占用序列长度,有一定的额外计算开销。
-
Prefix Tuning 的线性插值是比较复杂的。
-
Prompt Tuning该方法可以看着是 Prefix Tuning 的简化版本,针对不同的任务,仅在输入层引入 virtual token 形式的软提示(soft prompt)。特点:* 相对于 Prefix Tuning,参与训练的参数量和改变的参数量更小,更节省显存。
-
对一些简单的 NLU 任务还不错,但对硬序列标记任务(即序列标注)表现欠佳。
-
P-Tuning
将 Prompt 转换为可以学习的 Embedding 层,并用 MLP+LSTM 的方式来对 Prompt Embedding 进行一层处理。相比 Prefix Tuning,仅在输入层加入的可微的 virtual token;另外,virtual token 的位置也不一定是前缀,插入的位置是可选的。特点:
-
引入一个 prompt encoder(由一个双向的 LSTM + 两层 MLP 组成)来建模 virtual token 的相互依赖会收敛更快,效果更好。
-
P-Tuning v2
该方法在每一个 Transformer 层都加入了 prompt token 作为输入,引入多任务学习,针对不同任务采用不同的提示长度。并且回归传统的分类标签范式,而不是映射器。特点:
-
解决了 Prompt Tuning 无法在小模型上有效提升的问题。
-
移除了对模型效果改进较小的重参数化的编码器(如:Prefix Tuning 中的 MLP、P-Tuning 中的 LSTM)。
-
对于一些复杂的硬序列标记任务(即序列标注)取得了不错的效果。
-
Adapter Tuning该方法设计了 Adapter 结构,并将其嵌入 Transformer 的结构里面,针对每一个 Transformer 层,增加了两个 Adapter 结构,在训练时,固定住原来预训练模型的参数不变,只对新增的 Adapter 结构和 Layer Norm 层进行微调。特点:
-
通过在 Transformer 层中嵌入 Adapter 结构,在推理时会额外增加推理时长。
-
AdapterFusion
一种融合多任务信息的 Adapter 的变体,在 Adapter 的基础上进行优化,通过将学习过程分为两阶段来提升下游任务表现。
-
AdapterDrop该方法在不影响任务性能的情况下,对 Adapter 动态高效的移除,尽可能的减少模型的参数量,提高模型在反向传播(训练)和正向传播(推理)时的效率。特点:
-
通过从较低的 Transformer 层删除可变数量的 Adaper 来提升推理速度。当对多个任务执行推理时,动态地减少了运行时的计算开销,并在很大程度上保持了任务性能。
-
LoRA该方法通过低秩分解来模拟参数的改变量,从而以极小的参数量来实现大模型的间接训练。特点:
-
将 BA 加到 W 上可以消除推理延迟。
-
可以通过可插拔的形式切换到不同的任务。
-
设计的比较好,简单且效果好。
-
AdaLoRA
对 LoRA 的一种改进,它根据重要性评分动态分配参数预算给权重矩阵,将关键的增量矩阵分配高秩以捕捉更精细和任务特定的信息,而将较不重要的矩阵的秩降低,以防止过拟合并节省计算预算。
-
QLoRA使用一种新颖的高精度技术将预训练模型量化为 4 bit,然后添加一小组可学习的低秩适配器权重,这些权重通过量化权重的反向传播梯度进行微调。特点:
-
使用 QLoRA 微调模型,可以显著降低对于显存的要求。同时,模型训练的速度会慢于 LoRA。
-
MAM Adapter一种在 Adapter、Prefix Tuning 和 LoRA 之间建立联系的统一方法。最终的模型 MAM Adapter 是用于 FFN 的并行 Adapter 和 软提示的组合。特点:
-
整体上来说,最终的模型 MAM Adapter 效果会优于单个高效微调方法。
-
UniPELT一种将不同的 PELT 方法 LoRA、Prefix Tuning 和 Adapter 作为子模块,并通过门控机制学习激活最适合当前数据或任务的方法。特点:
-
相对于 LoRA,BitFit,Prefix-tuning,训练的参数量更大;同时,推理更耗时;并且,输入会占用额外的序列长度。
-
多种 PELT 方法的混合涉及 PLM 的不同部分对模型有效性和鲁棒性都有好处。
下面分别对部分微调技术进行解析(每种微调技术附加了相对应的论文,方便深入了解):
2. BitFit
BitFit(论文:BitFit: Simple Parameter-efficient Fine-tuning or Transformer-based Masked Language-models)是一种稀疏的微调方法,它训练时只更新 bias 的参数或者部分 bias 参数。涉及到的 bias 参数有 attention 模块中计算 query,key,value 跟合并多个 attention 结果时涉及到的 bias,MLP(多层感知机)层中的 bias,Layernormalization 层的 bias 参数。对于 Transformer 模型而言,可以理解为冻结大部分 transformer-encoder 参数,只更新 bias 参数跟特定任务的分类层参数。
在 Bert-Base/Bert-Large 这种模型里,bias 参数仅占模型全部参数量的 0.08%~0.09%。但是通过在 Bert-Large 模型上基于 GLUE 数据集进行了 BitFit、Adapter 和 Diff-Pruning 的效果对比发现,BitFit 在参数量远小于 Adapter、Diff-Pruning 的情况下,效果与 Adapter、Diff-Pruning 想当,甚至在某些任务上略优于 Adapter、Diff-Pruning。
通过实验结果可以看出,BitFit 微调结果相对全量参数微调而言, 只更新极少量参数的情况下,在多个数据集上都达到了不错的效果,虽不及全量参数微调,但是远超固定全部模型参数的 Frozen 方式。
^Mapping the HuggingFace’s BertLayer bias parameters names to BitFit paper bias notation.^通过对比 BitFit 训练前后的参数,发现很多 bias 参数并没有太多变化(例如:跟计算 key 所涉及到的 bias 参数)。发现计算 query 和将特征维度从 N 放大到 4N 的 FFN 层(intermediate)的 bias 参数变化最为明显,只更新这两类 bias 参数也能达到不错的效果,反之,固定其中任何一者,模型的效果都有较大损失。
^Fine-tuning using a subset of the bias parameters.Reported results are for the BERT(BASE) model.
3.Prefix Tuning
在 Prefix Tuning 之前的工作主要是人工设计离散的模版或者自动化搜索离散的模版。对于人工设计的模版,模版的变化对模型最终的性能特别敏感,加一个词、少一个词或者变动位置都会造成比较大的变化。而对于自动化搜索模版,成本也比较高;同时,以前这种离散化的 token 搜索出来的结果可能并不是最优的。除此之外,传统的微调范式利用预训练模型去对不同的下游任务进行微调,