全参数微调是指对模型的所有参数进行更新,以适应特定领域的数据。通常效果好, 但是训练时间较长,对显存的要求较高。
部分模型参数参与微调,训练快,显存占用少,效果可能跟FT(fine-tune)比会稍有效果损失,但一般效果能打平。而PEFT的论文《ADAPTIVE BUDGET ALLOCATION FOR PARAMETER- EFFICIENT FINE-TUNING》结果现实AdaLoRA效果稍好于FT。
在面对特定的下游任务时,如果进行Full FineTuning(即对预训练模型中的所有参数都进行微调),太 过低效;而如果采用固定预训练模型的某些层,只微调接近下游任务的那几层参数,又难以达到较好的效果。
1. PEFT介绍
1.1 什么是PEFT?
PEFT技术旨在通过最小化微调参数的数量和计算复杂度,来提高预训练模型在新任务上的性能,从而缓解大型预训练模型的训练成本,缓解全量微调带来灾难性遗忘的问题。这样一来,即使计算资源受限,也可以利用预训练模型的知识来迅速适应新任务,实现高效的迁移学习。
1.2 微调方法批处理大小模式GPU显存速度?
LoRA (r=8) 16 FP16 28GB 8ex/s
LoRA (r=8) 8 FP16 24GB 8ex/s
LoRA (r=8) 4 FP16 20GB 8ex/s
LoRA (r=8) 4 INT8 10GB 8ex/s
LoRA (r=8) 4 INT4 8GB 8ex/s
P-Tuning (p=16) 4 FP16 20GB 8ex/s
P-Tuning (p=16) 4 INT8 16GB 8ex/s
P-Tuning (p=16) 4 INT4 12GB 8ex/s
Freeze (l=3) 4 FP16 24GB 8ex/s
Freeze (l=3) 4 INT8 12GB 8ex/s
1.3 PEFT 和 全量微调区别?
-
PEFT是一种高效的微调方法,主要通过调整模型的一小部分参数来适应任务。它保留了原始模型的大部分知识,适合于资源受限的环境或多任务学习。
-
全量微调 则对模型的所有参数进行调整,允许对模型的知识和能力进行更全面的改变。它在计算和存储上要求更高,但能够提供更大的灵活性和适应性。
PEFT | 全量微调 | |
参数调整 | 只调整模型中一小部分参数,而不是全部参数。 | 所有参数都可以被更新和调整 |
效率 | 在存储和计算上都比全量微调更加高效 | 需要更多的计算资源和存储空间 |
知识保持 | 保留了模型的原始知识,因为它们没有改变模型的核心参数。 | 在一定程度上修改其原有的知识 |
适用场景 | 适合于资源受限的环境或需要快速适应多个任务的情况。它也允许将同一个预训练模型用于多个任务,通过不同的PEFT方法来微调。 | 能够提供更大的灵活性和适应性 |
1.4 多种不同的高效微调方法对比
像P-Tuning v2、LoRA等都是综合评估很不错的高效微调技术。如果显存资源有限可以考虑QLoRA;如果只是解决一些简单任务场景,可以考虑P-Tuning、Prompt Tuning也行。
从表中可以看到,Prompt Tuning、Prefix Tuning、LoRA等少部分微调技术针对不同参数规模的模型进 行过评估,同时,这几种方式也是目前应用比较多的高效微调方法。
1.5 当前高效微调技术存在的一些问题
当前的高效微调技术很难在类似方法之间进行直接比较并评估它们的真实性能,主要的原因如下所示:
1. 参数计算口径不一致:参数计算可以分为三类:
- 可训练参数的数量:仅计算模型中的可训练参数可能无法全面反映微调的存储和计算开销。
- 微调模型与原始模型相比改变的参数数量:例如,DiffPruning 仅更新0.5%的参数,但实际参与训练的参数量可能达到200%。
- 模型之间差异的等级:不同技术对模型参数的修改程度和方式不同。 Ladder-side Tuning使用一个单独的小网络,参数量高于LoRA或BitFit,但 是因为反向传播不经过主网络,其消耗的内存反而更小。
2. 缺乏模型大小的考虑:大模型和小模型在微调时的参数更新量差异,影响对不同技术的评估。
3. 缺乏测量基准和评价标准:
- 模型/数据集组合差异:不同研究使用的模型和数据集组合不同,评价指标也各异,导致比较困难。
- 评价指标多样性:各方法使用的评价指标不同,难以进行横向比较。
4. 代码实现可读性差:开源代码的实现常常不透明,难以复用和验证。
1.6 高效微调技术最佳实践
1. 明确指出参数数量类型。
2. 使用不同大小的模型进行评估。
3. 和类似方法进行比较。
4. 标准化PEFT测量基准。
5. 重视代码清晰度,以最小化进行实现。
1.7 PEFT存在问题?
相比全参数微调,大部分的高效微调技术目前存在的两个问题:
1. 推理速度会变慢;
2. 模型精度会变差;
下面将介绍不同的参数高效微调方法,分为几类如下:
- 增加额外参数,如:Prefix Tuning、Prompt Tuning、Adapter Tuning及其变体。
- 选取一部分参数更新,如:BitFit。
- 引入重参数化,如:LoRA、AdaLoRA、QLoRA。
- 混合高效微调,如:MAM Adapter、UniPELT。
2. 增加额外参数方法
Prompt 提供上下文和任务相关信息,以帮助模型更好地理解要求,并生成正确的输出。提示学习(Prompting)旨在通过最小化微调参数的数量和计算复杂度,来提高预训练模型在新任务上的性能,从而缓解大型预训练模型的训练成本。
提示学习(Prompting)有前缀微调(Prefix-tining)和指示微调(Prompt-tuning)。
2.1 Prefix-Tuning
人工设计离散的 Prompts 缺点是Prompts 的变化对模型最终的性能特别敏感,加一个词、少一个词或者变动位置都会造成 比较大的变化;自动化搜索离散的 Prompts 缺点是成本也比较高,离散化的 token 搜索出来的结果可能并不是最优的; 传统的微调范式利用预训练模型去对不同的下游任务进行微调,对每个任务都要保存一份微调后的模型权重,一方面微调整个模型耗时长;另一方面也会占很多存储空间。
2.1.1 前缀微调(Prefix-tining)流程是什么?
step 1 Prefix 构建 在输入 token 之前构造一段任务相关的 virtual tokens 作为 Prefix;
step 2 训练时只更新 Prefix 部分的参数 而 Transformer 中的其他部分参数固定;
step 3在Prefix层前面加了MLP结构(相当于将Prefix分解为更小维度的Input与MLP的组合后输出的结果),训练完成后,只保留 Prefix 的参数;(用于 防止直接更新 Prefix 的参数 导致训练不稳定的情况)
微调(顶部)会更新所有 Transformer 参数(红色的 Transformer 框),并且需要为每个任务存储一个完整的模型副本。我们提出了前缀微调(底部),它冻结了 Transformer 参数,仅优化前缀(红色的前缀块)。因此,我们只需要为每个任务存储前缀,使得前缀微调具有模块化和节省空间的优点。请注意,每个垂直块表示在一个时间步的 Transformer 激活状态。
2.1.2 前缀微调(Prefix-Tuning)优点是什么?
相对于人工设计离散prompts,前缀微调(Prefix- tining) 可以学习的“隐式”的 Prompts; 基于前缀的架构可以在一个批次中处理来自多个用户/任务的样本,这是其他轻量级微调方法所不能做到的;相比于full fine-tuning 更新所有参数,Prefix Tuning 只更新 Prefix 部分的参数;
2.1.3 前缀微调(Prefix-Tuning)缺点是什么?
占用序列长度,有一定的额外计算开销; 在每层都加了 prompt 的参数,改动较大;
2.2 Prompt-Tuning指示微调
https://arxiv.org/pdf/2104.08691
2.2.1 指示微调(Prompt-tuning)思路是什么?
将 prompt 扩展到连续空间,仅在输入层添加 prompt 连续向量,通过反向传播更新参数来学习 prompts;冻结模型原始权重,只训练 prompts 参数,训练完成后,只用同一个模型可以做多任务推理;使用 LSTM 建模 prompt 向量间关联性。
模型调优需要为每个下游任务制作整个预训练模型的任务特定副本,并且推理必须在不同的批次中进行。提示调优只需要为每个任务存储一个小的任务特定提示,并允许使用原始预训练模型进行混合任务推理。对于一个 T5 “XXL” 模型,每个调优后的模型副本需要 110 亿个参数。相比之下,我们的调优提示每个任务只需 20,480 个参数——减少了超过五个数量级——假设提示长度为 5 个标记。
2.2.2 指示微调(Prompt-tuning)优点是什么?
只在输入层加入 prompt tokens,并且不需要加入 MLP 进行调整来解决难训练的问题; 随着预训练模型参数量的增加,Prompt Tuning 的方法会逼近全参数微调的结果;
提出了 prompt ensembling:在一个批次(Batch)里同时训练同一个任务的不同 prompt(即采用多种不同方式询问同一个问题),这样相当于训练了不同模型,比模型集成的成本小多了;
2.2.3 指示微调(Prompt-tuning)缺点是什么?
训练难度加大:省了显存,但不一定省时间。具体来讲,大部分 prompt 现在 只是 parameter efficient 并没有达到想要的 training efficient。也就是说只是省了空间(显存), 但不一定能加快训练,训练时间有可能更长。
多个 prompt token 之间相互独立:可能会影响效果在 NLU 上,prompt tuning 对于正常大小的预训练模型表现不佳;
现有的 prompt tuning 方法不能处理困难的序列标注任务。
2.2.4 Prompt-tuning与Prefix-tuning区别 是什么?
Prompt-tuning可以看作是 Prefix Tuning 的简化版本。
1. 适用任务不同
Prefix-tuning 仅针对 自然语言生成任务有效,服务于 GPT 架构;Prompt-tuning考虑所有类型的语言模型。
2. 添加方式不同
Prefix-tuning 限定在输入前面添加;Prompt-tuning可以在任意位置添加;
3. prompt 连续向量添加方式不同
Prefix-tuning 每一层都添加,保证效果; Prompt-tuning可以只在输入层添加。
2.3 P-Tuning
大模型的 Prompt 构造方式严重影响下游任务的效果。P-tuning 提高模型在少样本(few-shot)和零样本(zero-shot)任务上的表现和稳定性。
1. 不在需要人工设计:传统的 GPT 系列模型依赖于手工设计的提示(prompt),这些提示的效果可能不稳定,且需要不断调整和优化。P-tuning 通过引入可学习的提示(prompts),使得模型能够自动优化和调整提示,从而在没有大量训练样本的情况下,提升模型的泛化能力和表现。
2. 需要优化的参数极少,避免过拟合.
2.3.1 P-Tuning 思路是什么?
可学习的 Embedding 层设计。将 Prompt 转换为可学习 Embedding 层; prompt encoder 设计用 prompt encoder(由一个双向的 LSTM+两层 MLP 组成) 的方式来 对 Prompt Embedding 进行一层处理,建模伪提示 token 的相互依赖,并且可以提供一个更好的初始化。
“The capital of Britain is [MASK]”的提示搜索示例。给定上下文(蓝色区域,“Britain”)和目标(红色区域,“[MASK]”),橙色区域指的是提示的标记。在(a)中,提示生成器仅接收离散奖励;相对而言,在(b)中,伪提示和提示编码器可以以可微分的方式进行优化。有时,添加一些与任务相关的锚点标记(例如(b)中的“capital”)会带来进一步的改善。
2.3.2 P-tuning 优点是什么?
引入Prompt encoder(由一个双向的LSTM+两层MLP组成)来建模伪提示token的相互依赖, 并且可以提供一个更好的初始化;
2.3.3 P-tuning 缺点是什么?
复杂性增加。伪提示token 编码时是连续的,但在与输入结合时可能是不连续的,中间可能会插入输入。
2.4 P-tuning v2
如何让 Prompt Tuning 能够在不同参数规模的预训练模型、针对不同下游任务的结果上都达到匹敌 Fine-tuning 的结果; v2保留了 P-Tuning 的核心思想,即通过优化输入提示向量来引导预训练模型处理特定任务。
2.4.1 P-tuning v2 思路是什么?
- Deep Prompt Encoding:在输入序列的每一层插入可微调的提示 tokens,类似于 Prefix-tuning。
- 移除重参数化编码器:不使用 Prefix-tuning 和 P-tuning 中的重参数化功能,避免对小模型的表现产生负面影响。
- 任务特定的提示长度:不同的理解任务通常用不同的提示长度,优化提示效果。
- 多任务学习:先在多任务提示上进行预训练,再适配具体任务。
- 回归传统分类:使用传统的 CLS 和 token label 分类,而非 verbalizer,提高通用性。
来自 Lester 等(2021)及 P-tuning 到 P-tuning v2。橙色标记(包括 h0、hi)指我们添加的提示嵌入;蓝色标记是由冻结的预训练语言模型存储或计算的嵌入。与 Lester 等(2021)相比,P-tuning v2 将可训练的连续提示独立地添加到每个 transformer 层的输入中(类似于 prefix-tuning)。此外,P-tuning v2 移除了带有语言模型头的 verbalizer,改回使用普通的线性头来返回传统的类别标签,从而实现任务的普遍适用性。
2.4.2 P-tuning v2 优点是什么?
在输入前面的每层加入可微调的 Prompts tokens 作为输入。更多可学习的参数(从 P-tuning 和 Prompt Tuning 的 0.01%增加到 0.1%-3%),同时也足够 参数高效;加入到更深层结构中的 Prompt 能给模型预测带来更直接的影响;解决了 Prompt Tuning 无法在小模型上有效提升的问题;将 Prompt Tuning 拓展至 NER 等序列标注任务上。
2.4.3 P-tuning v2 缺点是什么?
抛弃了 prompt learing 中常用的 verbalizer,回归到传统的 CLS 和 token label 分类范式,这其实某种程度上弱化了 prompt 的味道。
---------------------------------------------------- P系列总结--------------------------------------------------------------
- Prefix-tuning 在每一层插入可训练的前缀 tokens。
-
Prompt-tuning:在输入中添加训练的提示 tokens。引入了任务特定的提示(prompts),这些提示是可训练的,但通常需要在任务中设计硬性提示模板,并且训练时对模型参数的调整较少。
-
P-tuning:采用复杂的编码机制对提示 tokens 进行优化。在 Prompt-tuning 的基础上,通过使用伪提示(pseudo prompt tokens)来替代硬性提示模板,这些伪提示是可训练的。P-tuning 允许在提示中加入更多灵活的可训练参数,以便更好地适应任务。
-
P-tuning v2:简化了 P-tuning 的复杂性,每层加入可微调的 Prompts tokens ,改回了普通的线性头。
2.5 Adapter Tuning 适配器微调
定义:通过在预训练模型的基础上添加适配器层(adapters),来实现特定任务的微调。这种方法旨在保留预训练模型的原始权重,仅在需要适应新任务的地方进行小规模的参数调整。
适配器层结构: 这些适配器层是一些小规模的神经网络,通常由一个下采样层down-project(减少维度)、一个非线形层(激活函数)和一个上采样层up-project(恢复高维度)组成;同时也设 计了 skip-connection 结构,确保了在最差的情况下能够退化为 identity),并将其嵌入 Transformer 的结构里面;这些模块通常由一个小型的前馈神经网络组成。
冻结预训练权重: 在微调过程中,预训练模型的原始权重保持不变,仅训练适配器层的权重。
高效微调: 由于适配器层的参数数量相对较少,微调过程变得更加高效。适配器层可以针对不同任务进行训练,而不影响预训练模型的核心结构。
对于适配器不同的组合形成新的适配器。
2.3.1 AdapterFusion 思路是什么?
思路:一种融合多任务信息的 Adapter 的变体,在 Adapter 的基础上进行优化,通过将学习过程分为两阶段来提升下游任务表现。
2.3.2 AdapterDrop 思路是什么?
思路:在不影响任务性能的情况下,对 Adapter 动态高效的移除,尽可能的减少模型的参数量,提高模型在反向传播(训练)和正向传播(推理)时的效率。
通过从较低的 Transformer 层删除可变数量的 Adaper 来提升推理速度; 当对多个任务执行推理时,动态地减少了运行时的计算开销,并在很大程度上保持了任务性能。
3. 选取一部分参数更新方法
3.1 BitFit
它的核心思想是仅对模型的偏置(bias)参数进行微调,而不是更新整个模型的权重。通过这种方式,BitFit 旨在减少训练开销,同时保留预训练模型的大部分原始知识,使其适应新的任务或数据。
-
原始 BERT 模型:包含多层 Transformer,每层有权重矩阵 W 和偏置 b。
-
BitFit 微调:保持所有权重矩阵 W 不变,只微调每层的偏置参数 b。
4. 引入重参数化方法
4. 1LoRA(Low-Rank Adaptation)低秩适应
- 描述:通过在某些层中添加低秩矩阵来实现,将权重矩阵分解为两个较小的低秩矩阵的乘积,来减少减少参数量和计算成本。
- 优点:通过低秩分解来模拟参数的改变量,从而以极小的参数量来实现大模型的间接训练。
LoRA核心思想是什么?
LoRA 方法通常在模型的关键层中插入低秩矩阵模块,这些模块与原始的权重矩阵进行加法操作,形成新的加权矩阵。
优点:这种设计可以灵活地集成到现有的模型架构中,而不会对模型的整体结构产生重大影响。
LoRA流程是什么?
初始化:A采用高斯分布初始化,B初始化为全0,保证训练开始时旁路为0矩阵;
任务切换:只要将lora部分替换即可,W0+B1A1换成W0+B2A2。
-
预训练模型:使用传统的预训练模型(如 BERT、GPT 等)作为基础模型。
-
低秩矩阵引入:在原模型旁边增加一个旁路,通过低秩分解(先降维再升维)来模拟参数的更新量。
-
训练和微调:在微调过程中,仅调整低秩矩阵的参数A和B,而保留原始模型的权重不变。
-
推理:在推理阶段,将原始模型的权重加上经过微调的低秩矩阵BA,不引入额外的推理延迟。
LoRA 特点:
- 消除推理延迟:通过预计算和合并操作,将 (BA) 加到 (W) 上的方式可以简化计算过程, (BA) 作为额外的参数调整,计算上已经和原始权重一同完成。
- 低秩矩阵的效率高:低秩矩阵的计算成本较低,使得推理更为高效。
- 可拔形式切换任务:低秩适应使得任务切换更加高效和灵活,避免了重新训练的复杂性。
LoRA 微调优点是什么?
- 节省存储:只需添加少量适配器参数,不必调整整个模型。
- 高效微调:通过低秩适配器进行任务微调,更加高效。
- 无推理延迟:适配器权重可以与基础模型权重合并,推理时不会增加额外计算开销。
- 训练稳定:训练过程稳定,减少过拟合风险。
- 兼容性强:可以与其他优化技术(如量化、剪枝等)结合使用。
- 多任务适用:一个中心模型可以通过不同的低秩适配器来适应多个下游任务,一个模型可以适应多个任务。
LoRA微调方法为啥能加速训练?
- 只更新了部分参数:比如LoRA原论文就选择只更新Self-Attention的参数,实际使用时我们还可以选择只更新部分层的参数;
- 减少了通信时间:由于更新的参数量变少了,所以(尤其是多卡训练时)要传输的数据量也变少了,从而减少了传输时间;
- 采用了各种低精度加速技术:如FP16、FP8或者INT8量化等。
- 它们并不是LoRA所独有的,事实上几乎都有参数高效方法都具有这些特点。LoRA的优点是它的低秩分解很直观,在不少场景下跟全量微调的效果一致,以及在预测阶段不增加推理成本。
import torch
import torch.nn as nn
class LoRA(nn.Module):
def __init__(self, original_layer, rank):
super(LoRA, self).__init__()
self.original_layer = original_layer
self.rank = rank
# Initialize low-rank matrices
self.A = nn.Parameter(torch.randn(original_layer.in_features, rank) * 0.01)
self.B = nn.Parameter(torch.randn(rank, original_layer.out_features) * 0.01)
def forward(self, x):
# Apply LoRA adjustment
return self.original_layer(x) + x @ (self.A @ self.B).T
# Example usage with a linear layer
original_linear = nn.Linear(128, 64)
lora_linear = LoRA(original_linear, rank=10)
# Forward pass
input_tensor = torch.randn(32, 128) # batch_size=32, input_dim=128
output = lora_linear(input_tensor)
LoRA 微调参数量怎么确定?
LoRA 模型中可训练参数的结果数量取决于低秩更新矩阵的大小,其主要由秩 r 和原始权重矩阵的形状确定。实际使用过程中,通过选择不同的 lora_target 决定训练的参数量。 以 LLama 为例:
--lora_target q_proj,k_proj,v_proj,o_proj,gate_proj,up_proj,down_proj
Rank 如何选取?
初步选择Rank在4-8之间最好,适用于大多数任务。训练并验证模型性能。若模型表现不佳,可以尝试增加秩值,例如 ( r = 16 ) 或 ( r = 32 )。如果模型过拟合或计算资源不足,可以尝试减小秩值。最后选择最优结果。
alpha参数 如何选取?
alpha其实是个缩放参数,本质和learning rate相同,所以为了简化我默认让alpha=rank,只调整lr,这样可以简化超参。
LoRA 缺点?
参与训练的模型参数量不多,也就百万到千万级别的参数量,所以效果比全量微调差很 多。可能在扩散模型上感知没那么强,但在LLM上,个人感觉表现还是差距挺大的。
LoRA的扩展
AdaLoRA、QLoRA 和 LoRA 是用于优化深度学习模型的技术,它们在适应性、量化、计算效率等方面各有不同。以下是它们之间的主要区别:
LoRA (Low-Rank Adaptation)
- 核心思想:通过引入低秩矩阵来调整模型的参数,从而减少计算和存储的复杂度。
- 工作原理:在原始模型参数 (W) 上添加低秩矩阵 (BA) 进行适应性调整,模型参数更新为
。
- 应用:适用于减少训练和推理过程中的计算复杂度,特别是在处理大规模预训练模型时。
- 优点:有效减少计算需求,但在存储方面并没有显著的优化。
4. 2 QLoRA (Quantized Low-Rank Adaptation)
- 核心思想:在 LoRA 的基础上引入量化技术,通过将低秩矩阵和模型参数进行量化来进一步减少存储需求和计算开销。
- 工作原理:量化模型参数和低秩矩阵 Q(B))和 Q(A),计算为
,其中
是量化操作。
- 应用:主要用于内存和计算资源有限的场景,如边缘设备或需要高效推理的应用。
- 优点:显著减少存储需求,并在推理阶段提供高效性,但可能会引入量化带来的精度损失。
4.3 AdaLoRA (Adaptive Low-Rank Adaptation)
- 核心思想:在 LoRA 的基础上引入自适应机制,根据数据或模型的表现动态调整低秩矩阵的秩和学习率。
- 工作原理:通过自适应调整低秩矩阵的配置,使得参数调整更加灵活和高效。可以根据模型在训练过程中的表现动态优化低秩矩阵的参数。
- 应用:提升了低秩适应的灵活性和有效性,适用于需要动态调整的训练场景。
- 优点:通过适应性调整提高了模型的性能,能够更好地适应不同的数据和任务需求。
-------------------------------------------------- LoRA系列-----------------------------------------------------------------
- LoRA:专注于通过低秩矩阵减少计算复杂度,不涉及量化。
- QLoRA:在 LoRA 的基础上结合了量化技术,减少存储和计算开销。
- AdaLoRA:在 LoRA 的基础上引入自适应机制,动态调整低秩矩阵的配置以提高性能。
5. 混合高效微调方法
在Xsum数据集上做英文文本摘要任务的效果以及其他高效微调方法参数量相对于全参数微调参数量的百分比。发现Adapter,Prefix Tuning,LoRA
都是性能比较好的方法。
5.1 MAM Adapter 思路 是什么?
一种在 Adapter、Prefix Tuning 和 LoRA 之间建立联系的统一方法。最终的模型MAM Adapter (Meta Adapter Module) 是用 FFN 层的并行Adapter和软提示的组合.整体上来说,最终的模型 MAM Adapter 效果会优于单个高效微调方法。
5.2 UniPELT
UniPELT 是一种结合了 LoRA(Low-Rank Adaptation)、Prefix Tuning 和 Adapter Tuning 的门控组合方法。
它通过以下方式实现高效微调:
- LoRA:通过低秩分解技术,将模型的预训练参数
转换为优化的外挂层参数
,减少了参数的更新量。
- Prefix Tuning:在每层的多头注意力机制中,引入前缀向量
和
进行键和值的调整,从而影响注意力计算。
- Adapter Tuning:在 Transformer 块的前馈子层后添加适配器模块,以便在特定任务上进行微调。
在 UniPELT 中,门控机制(GP、GL、GA)用于控制不同微调方法的开关,这些门控机制是通过线性层实现的。这使得模型可以灵活地组合和调节这三种方法,从而达到更高的微调效率和灵活性。
6. 其他
6.1DistilBERT
使用知识蒸馏技术将大模型压缩成更小的模型,从而减少微调所需的计算资源和时间。
DistilBERT 是 BERT 模型的精简版,旨在减少模型的规模和计算资源需求,同时尽可能保留其性能。它通过知识蒸馏(knowledge distillation)技术,将大型 BERT 模型的知识压缩到一个更小、更高效的模型中。DistilBERT 保留了 BERT 的大部分特性,但具有更少的层和参数,从而加快推理速度和降低计算成本。
原理
知识蒸馏是一种模型压缩技术,通过训练一个较小的学生模型(student model)来模仿较大教师模型(teacher model)的行为。具体步骤如下:
教师模型:使用预训练的 BERT 模型作为教师模型。
学生模型:构建一个较小的 BERT 模型,即 DistilBERT。
训练过程:在训练过程中,学生模型通过模仿教师模型的输出来学习。损失函数不仅包括学生模型和教师模型输出之间的差异,还包括学生模型和真实标签之间的差异。
参考文章:
大模型高效微调综述下: DiffPruning、BitFit、LoRa、AdaLoRA、MAM Adapters、UniPELT-CSDN博客