微调的方法分类
参数规模
从参数规模的角度,大模型的微调分成两条技术路线:
- 全量微调FFT(Full Fine Tuning),是对全量的参数,进行全量的训练。用特定的数据,对大模型进行训练,将W 变成W’ ,W’相比W ,最大的优点就是上述特定数据领域的表现会好很多。主要问题:
- 一个是训练的成本会比较高,因为微调的参数量跟预训练的是一样的多的;
- 一个是叫灾难性遗忘(Catastrophic Forgetting),用特定训练数据去微调可能会把这个领域的表现变好,但也可能会把原来表现好的别的领域的能力变差。
- PEFT(Parameter-Efficient Fine Tuning),旨在通过最小化微调参数数量和计算复杂度,提升预训练模型在新任务上的表现,从而减轻大型预训练模型的训练负担。PEFT的出现就是为了解决 FFT中存在的主要问题。 PEFT 是目前比较主流的微调方案。
训练的方法
- 监督式微调SFT(Supervised Fine Tuning) 主要是用人工标注的数据,用传统机器学习中监督学习的方法,对大模型进行微调;
- 基于人类反馈的强化学习微调RLHF(Reinforcement Learning with Human Feedback) 是把人类的反馈,通过强化学习的方式,引入到对大模型的微调中去,让大模型生成的结果,更加符合人类的一些期望;
- 基于AI反馈的强化学习微调RLAIF(Reinforcement Learning with AI Feedback) 大致跟RLHF类似,但是反馈的来源是AI。这里是想解决反馈系统的效率问题,因为收集人类反馈,相对来说成本会比较高、效率比较低。
技术路径
每种微调,都要对 权衡参数效率、内存效率、训练速度、模型质量和推理成本 进行权衡。针对微调,一些路径技术会冻结大部分模型权重,并专注于微调现有模型参数的子集,例如特定的层或组件,比如PEFT。
其他技术根本不会触及原始模型的权重,而是添加少量新参数或层,只对新组件进行微调。
Selective
仅微调原始 LLM 参数子集的方法。您可以采用多种方法来确定要更新的参数。您可以选择仅训练模型或特定层的某些组件,甚至可以选择单独的参数类型。研究人员发现,这些方法的性能好坏参半,参数效率和计算效率之间存在显著的权衡取舍。Reparameterization
重新参数化方法也可以使用原始的 LLM 参数,但是通过创建原始网络权重的新的低等级变换来减少要训练的参数数量。这种常用的技术是LoRa。Additive
通过冻结所有原始 LLM 权重并引入新的可训练组件来进行微调。这里有两种主要方法。- Adapters在模型架构中添加了新的可训练层,通常位于注意层或前馈层之后的编码器或解码器组件内。
- Soft Prompts 可以保持模型架构的固定和冻结,并专注于操纵输入以实现更好的性能。这可以通过在提示嵌入中添加可训练的参数或保持输入固定并重新训练嵌入权重来实现。
微调的步骤
- 数据准备:与全面微调相同。
- 冻结大部分参数:在训练过程中冻结模型的大部分参数。
- 训练设置:设定需要调整的参数部分的学习率。
- 训练过程:只更新选定的参数。
- 评估与迭代:与全面微调类似,但聚焦于微调参数的
基于PEFT的相关技术方法
PEFT(Parameter-Efficient Fine-Tuning)是hugging face开源的一个参数高效微调大模型的工具,里面集成了4中微调大模型的方法,可以通过微调少量参数就达到接近微调全量参数的效果,使得在GPU资源不足的情况下也可以微调大模型。
PEFT技术 即使在计算资源受限的情况下,也能够利用预训练模型的知识快速适应新任务,实现有效的迁移学习。因此,PEFT不仅能提升模型效果,还能显著缩短训练时间和计算成本,使更多研究者能够参与到深度学习的研究中。
PEFT包括LoRA、QLoRA、适配器调整(Adapter Tuning)、前缀调整(Prefix Tuning)、提示调整(Prompt Tuning)、P-Tuning及P-Tuning v2等多种方法。
以下图表示了7种主流微调方法在Transformer网络架构中的作用位置及其简要说明,接下来将详细介绍每一种方法。

1. LoRA(基于新数据训练一个地址分解矩阵,使用时加到原模型矩阵上)
LoRA 背后有一个假设:我们现在看到的这些大语言模型,它们都是被过度参数化的。而过度参数化的大模型背后,都有一个低维的本质模型。。也就是说 大模型中有其中一部分参数,是非常重要的,是影响大模型生成结果的关键参数,这部分关键参数就是上面提到的低维的本质模型。
LoRA(Low-Rank Adaptation)是一种旨在微调大型预训练语言模型(如GPT-3或BERT)的技术。其核心理念在于,在模型的决定性层次中引入一个额外的小型矩阵(“旁路”用A、B两个矩阵组合表示,维度分别是d × r和 r × d,其中r远小于d,A随机初始化,B初始化为0),来实现模型行为的微调,而无需对整个模型结构进行大幅度修改。在微调模型的过程中,左边的W不更新,只更新右边的A和B的参数。前向传播时是左右的输出和,反向传播时只更新右边,因此计算的梯度以及优化器的中间值也只和右边有关,最终右边的参数会单独保存下来。LORA这种训练方式不会改变大模型的参数,且针对每个下游任务生成自己的LORA参数,在预测阶段只要将大模型的参数和LORA参数叠加在一起即可。
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`。
该方法认为模型权重矩阵在特定微调后具有较低的本征秩,故基于秩分解的概念,将预训练模型的现有权重矩阵分成两个较小的矩阵。
LoRA的特点
- 将矩阵乘积BA加到原模型参数矩阵W上可以避免推理延迟。
- 可插拔的低秩分解矩阵模块,方便切换到不同的任务。
- 不显著增加额外计算负担的前提下,能够有效地微调模型,同时保留模型原有的性能水准。
LoRA的实验结果
使用的模型是RoBERTa、DeBERTa、GPT-2、GPT-3 175B。在多个数据集上,LoRA在性能上能和全量微调相近,且在某些任务上优于全量微调。
2、QLoRA(低精度加载高精度重训练)
QLoRA(Quantized Low-Rank Adaptation)是一种结合了LoRA(Low-Rank Adaptation)方法与深度量化技术的高效模型微调手段。QLoRA的核心在于:
量化技术:QLoRA采用创新的技术将预训练模型量化为4位。这一技术包括低精度存储数据类型(4-bit NormalFloat,简称NF4)和计算数据类型(16-bit BrainFloat)。这种做法极大地减少了模型存储需求,同时保持了模型精度的最小损失。
量化操作:在4位量化中,每个权重由4个比特表示,量化过程中需选择最重要的值并将它们映射到16个可能的值之一。首先确定量化范围(例如-1到1),然后将这个范围分成16个区间,每个区间对应一个4-bit值。然后,原始的32位浮点数值将映射到最近的量化区间值上。
微调阶段:在训练期间,QLoRA先以4-bit格式加载模型,训练时将数值反量化到bf16进行训练,这样大幅减少了训练所需的显存。例如,33B的LLaMA模型可以在24 GB的显卡上进行训练。
量化过程的挑战在于设计合适的映射和量化策略,以最小化精度损失对性能的影响。在大型模型中,这种方法可以显著减少内存和计算需求,使得在资源有限的环境下部署和训练成为可能。
大模型入门(二)—— PEFT
3.适配器调整 Adapter Tuning(增加一个Adapter层,
与LoRA技术类似,适配器调整的目标是在保留预训练模型原始参数不变的前提下,使模型能够适应新的任务。适配器调整的方法是在模型的每个层或选定层之间插入小型神经网络模块,称为“适配器”。这些适配器是可训练的,而原始模型的参数则保持不变。
Adapter的架构如下:
在每一个Transformer层中的每个子层之后插入两个串行的Adapter。在Adapter微调期间,绿色层是根据下游数据进行训练的,而预训练模型的原参数保持不变。
Adapter 模块主要由两个前馈(Feed-forward)子层组成。
- 第一个前馈子层将原始特征的维度d投影到一个更小的维度m,应用非线性函数,再投影回维度d的特征(作为Adapter模块的输出)。
- 总参数量为2md + d + m。通过设置m < d,我们限制了每个任务添加的参数数量。
- 当投影层的参数初始化接近零时,根据一个skip-connection,将该模块就初始化为近似恒等函数,以确保微调的有效性。
LoRA 与 Adapter Tuning 的主要区别在于:
- LoRA:在模型的权重矩阵中引入低秩矩阵来实现微调。这些低秩矩阵作为原有权重矩阵的修改项,在实际计算时对原有权重矩阵进行调整。
- 适配器调整:通过在模型各层中添加小型神经网络模块,即“适配器”,来实现微调。适配器独立于模型的主体结构,仅适配器的参数在微调过程中更新,而模型的其他预训练参数保持不变。
早期的**提示微调**通过修改输入文本来控制语言模型的行为,称为硬提示(Hard Prompts)微调。这些方法很难优化,且受到最大模型输入长度的限制。下图为离散的人工设计的Prompt示例:

软提示(Soft Prompts)将离散的“提示”问题转为连续的“提示”问题,通过过反向传播和梯度下降更新参数来学习Prompts,而不是人工设计Prompts。
硬提示和软提示之间的区别在于,**硬提示提供了明确的指令来指导模型的响应,并且可能需要针对不同的任务定制模型**,而软提示通过**调整提示参数**来指导模型的行为,提供更通用和更有效的策略跨越各种任务。
有仅对输入层进行训练,也有对所有层进行训练的类型。下面将介绍几种热门的Soft Prompts微调方法。
4.前缀调整 Prefix Tuning()
Prefix Tuning的灵感来源是,基于Prompt Engineering的实践表明,在不改变大模型的前提下,在Prompt上下文中添加适当的条件,可以引导大模型有更加出色的表现。
前缀调整提出了一种新的策略,即在预训练的语言模型(LM)输入序列前添加可训练、任务特定的前缀(添加的是参数或矩阵),从而实现针对不同任务的微调。除了在embedding层加入这个前缀之外,还在其他的所有层都添加这样一个前缀。最后微调时只调整前缀的参数,大模型的参数保持不变。这意味着我们只需要为不同任务保存各自特异的前缀部分的参数,而不是为每个任务保存一整套微调后的模型权重,从而节省了大量的存储空间和微调成本。

前缀实际上是一种连续可微的虚拟标记(Soft Prompt/Continuous Prompt),与离散的Token相比,它们更易于优化并且效果更佳。这种方法的优势在于不需要调整模型的所有权重(基座不变),而是通过在输入中添加前缀来调整模型的行为,从而节省大量的计算资源,同时使得单一模型能够适应多种不同的任务。前缀可以是固定的(即手动设计的静态提示)或可训练的(即模型在训练过程中学习的动态提示)
Prefix Tuning的特点
- 冻结预训练语言模型的参数,为每个任务存储特定的连续可微的前缀,节省空间。
- 训练间增加MLP层以达到稳定。
- 对于不同模型构造不同的Prefix。
Prefix Tuning的实验结果:
对于表格到文本任务,使用GPT-2MEDIUM和GPT-2LARGE模型。在表格到文本任务上,Prefix Tuning优于Fine-Tuning(全量微调)和Adapter-Tuning。对于摘要任务,使用BART-LARGE模型。在摘要任务上,Prefix Tuning比全量微调弱。
5.提示调整(Prompt Tuning)
Prompt Tuning的出发点,是基座模型(Foundation Model)的参数不变,为每个特定任务,训练一个少量参数的小模型,在具体执行特定任务的时候按需调用。这些可训练的提示向量在训练过程中更新,以指导模型输出更适合特定任务的响应。
像GPT3中那种,通过人工构造一些token作为前缀输入到模型中,因为这些token是从vocab中选择的,因此会受到大模型的参数的影响,所以要取得好的结果的话,人工构造的提示语必须要符合模型训练语料的特性。而Prompt tuning是为Prompt单独生成一份参数,在微调的过程中大模型的参数冻结不变,只更新Prompt的参数。且文章实验表明对于Prompt的参数使用大模型的vocab中的一些token 的embedding初始化,或者使用标签词的嵌入(当标签词的token数大于1时,对所有token取平均,即将一个标签词看作一个整体)初始化要比随机初始化的效果要好。此外Prompt的长度对结果也会有影响,长度越长效果会越好,但随着模型的规模变大,不同长度或者不同初始化的Prompt之间的差距会被缩小。

Prompt Tuning与Prefix Tuning都涉及在输入数据中添加可学习的向量,这些向量是在输入层添加的,但两者的策略和目的不同:
- 提示调整:旨在模仿自然语言中的提示形式,将可学习向量(通常称为提示标记)设计为模型针对特定任务生成特定类型输出的引导。这些向量通常被视为任务指导信息的一部分,倾向于使用较少的向量来模仿传统的自然语言提示。
- 前缀调整:可学习前缀更多地用于提供输入数据的直接上下文信息,作为模型内部表示的一部分,可以影响整个模型的行为。
Prompt Tuning的基本原理是在输入序列X之前,增加一些特定长度的特殊Token,以增大生成期望序列的概率。
如果将大模型比做一个函数:Y=f(X),那么Prompt Tuning就是在保证函数本身不变的前提下,在X前面加上了一些特定的内容,而这些内容可以影响X生成期望中Y的概率。
其结构如下:
上图中,仅Virtual Token部分会由梯度下降法去更新参数。
Prompt Tuning的实验结果:
使用的是预训练的各种T5模型。在流行的SuperGLUE基准测试中,Prompt Tuning的任务性能与传统的模型调优相当,且随着模型规模的增加,差距逐渐减小。在零样本领域迁移中,Prompt Tuning可以改善泛化性能。
Prompt Tuning 是在 Embedding环节,往输入序列X前面加特定的Token。
而Prefix Tuning是在Transformer的Encoder和Decoder的网络中都加了一些特定的前缀。
具体来说,就是将Y=WX中的W,变成W= [Wp; W],Y=WX。
6. P-Tuning的特点
一般在通过Prompt的方式使用大模型时,通常需要人工构造一些模板,P-tuning将自然语言模板的构建转换成连续参数优化的问题,用一些特殊的token替代人工构造的自然语言模板,让模型自己去学习这些连续的token,在学习的过程中只微调这些token的embedding参数,并且为了保证token之间的联系,并不是随机初始化embedding,而是通过lstm层学习这些token的embedding。

P-Tuning(基于提示的微调)和提示调整都是为了调整大型预训练语言模型(如GPT系列)以适应特定任务而设计的技术。两者都利用预训练的语言模型执行特定的下游任务,如文本分类、情感分析等,并使用某种形式的“提示”或“指导”来引导模型输出,以更好地适应特定任务。
提示调整与P-Tuning的主要区别在于:
- 提示调整:使用静态的、可训练的虚拟标记嵌入,在初始化后保持固定,除非在训练过程中更新。这种方法相对简单,因为它只涉及调整一组固定的嵌入参数,在处理多种任务时表现良好,但可能在处理特别复杂或需要细粒度控制的任务时受限。
- P-Tuning:使用一个可训练的LSTM模型(称为提示编码器prompt_encoder)来动态生成虚拟标记嵌入,允许根据输入数据的不同生成不同的嵌入,提供更高的灵活性和适应性,适合需要精细控制和理解复杂上下文的任务。这种方法相对复杂,因为它涉及一个额外的LSTM模型来生成虚拟标记嵌入。
P-Tuning中使用LSTM(长短期记忆网络)作为生成虚拟标记嵌入的工具,利用了LSTM的以下优势:
- 更好的适应性和灵活性:LSTM可以捕捉输入数据中的时间序列特征,更好地理解和适应复杂的、顺序依赖的任务,如文本生成或序列标注。
- 改进的上下文理解:LSTM因其循环结构,擅长处理和理解长期依赖关系和复杂的上下文信息。
- 参数共享和泛化能力:在P-Tuning中,LSTM模型的参数可以在多个任务之间共享,这提高了模型的泛化能力,并减少了针对每个单独任务的训练需求。而在提示调整中,每个任务通常都有其独立的虚拟标记嵌入,这可能限制了跨任务泛化的能力。
其结构如下:
- P-Tuning只在输入层加入可微的Virtual Token,其会自动插入到文本提示的离散Token嵌入中。
- Virtual Token不一定作为前缀,其插入位置是可选的。
P-Tuning的实验结果
使用的是GPT系列和BERT系列的模型。P-Tuning与全参数效果相当,且在一些任务上优于全参数微调,可以显著提高GPT模型在自然语言理解方面的性能,并且BERT风格的模型也可以获得较小的增益。
7.P-Tuning v2
P-Tuning v2是P-Tuning的进一步改进版,在P-Tuning中,连续提示被插入到输入序列的嵌入层中,除了语言模型的输入层,其他层的提示嵌入都来自于上一层。这种设计存在两个问题:
- 第一,它限制了优化参数的数量。由于模型的输入文本长度是固定的,通常为512,因此提示的长度不能过长。
- 第二,当模型层数很深时,微调时模型的稳定性难以保证;模型层数越深,第一层输入的提示对后面层的影响难以预测,这会影响模型的稳定性。
其结构如下:
P-Tuning v2的改进在于,不仅在第一层插入连续提示,而是在多层都插入连续提示,且层与层之间的连续提示是相互独立的。这样,在模型微调时,可训练的参数量增加了,P-Tuning v2在应对复杂的自然语言理解(NLU)任务和小型模型方面,相比原始P-Tuning具有更出色的效能。
P-Tuning v2的实验结果:
使用的是BERT系列和GLM系列模型。P-Tuning v2是一种在不同规模和任务中都可与微调相媲美的提示方法。在NLU任务中,整体上P-Tuning v2与全量微调的性能相差很小。
除了上述方法外,随着大模型行业的发展,也有一些新的微调方法相继涌现
8.BitFit
属于选择性方法,是对模型的现有参数进行微调,可以根据层的深度、层类型或者甚至是个别参数进行选择。
2022年9月5日,BitFit出现,这是一种稀疏微调方法,仅修改模型的Bias(偏置项)或其中的子集。
BitFit的特点
- 冻结大部分Transformer编码器的参数,只训练偏置项和任务特定的分类层。
- 优化的偏置项参数包括Attention模块中计算Query、Key、Value时,计算MLP层时,计算Layernormalization层时遇到的偏置项参数。
- 每个新任务只需要存储偏置项参数向量(占总参数数量的不到0.1%)和任务特定的最终线性分类器层。
BitFit的实验结果
使用公开可用的预训练BERTBASE、BERTLARGE和RoBERTaBA模型。BitFit微调结果不及全量参数微调,但在极少数参数可更新的情况下,远超Frozen(冻结模型参数)方式。
9.AdaLoRA
该方法基于权重矩阵的重要性而自适应调整不同模块的秩,节省计算量,可理解为LoRA的升级版。
AdaLoRA的做法是让模型学习SVD分解的近似。在损失函数中增加了惩罚项,防止矩阵P和Q偏离正交性太远,以实现稳定训练。
AdaLoRA的实验结果:
使用的模型是DeBERTaV3-base 和BART-large模型。AdaLoRA的性能通常高于参数量更高的方法。其中,AdaLoRA在0.32M微调参数时,在CoLA数据集上达到了70.04的Mcc分数。
其他方法
RLHF (Reinforcement Learning fromHuman feedback)
RLHF使用强化学习(简称RL)使用人类反馈数据对LLM进行微调,从而生成更符合人类偏好的模型。您可以使用 RLHF 来确保模型生成的输出能够最大限度地提高输入提示的实用性和相关性。也许最重要的是,RLHF可以帮助最大限度地减少可能的伤害。你可以训练你的模型,让它给出承认其局限性的注意事项,并避免使用有害的语言和话题。
PPO(Proximal Policy Optimization)

KL(Kullback-Leibler)发散
KL发散是PPO算法中一个重要的概念,它表示两个概率分布之间的差异。在PPO算法中,我们希望新的策略(新的策略)与旧的策略(旧的策略)之间的差异尽可能小,避免单纯的提高强化评分的结果,而生成无效的文本输出,从而实现策略的可靠更新。