参考链接:https://blog.csdn.net/qq_56591814/article/details/131293940https://www.bilibili.com/video/BV1WkbzeUEVD/?spm_id_from=333.880.my_history.page.click&vd_source=e01172ea292c1c605b346101d7006c61https://zhuanlan.zhihu.com/p/635152813

peft 库可以实现几乎所有的微调

# 一、为什么要对大模型进行微调

  通常,要对大模型进行微调,有以下一些原因:

  • 第一个原因是,因为大模型的参数量非常大,训练成本非常高;

  • 第二个原因是, Prompt Engineering 的方式是一种相对来说容易上手的使用大模型的方式,但是它的缺点也非常明显。因为通常大模型都会对输入序列的长度有限制, Prompt EngineeringPrompt 很长。越长的 Prompt ,大模型的推理成本越高,因为推理成本是跟 Prompt 长度的平方正向相关的。

  • 第三个原因是, Prompt Engineering 的效果达不到要求,企业又有比较好的自有数据,能够通过自有数据,更好的提升大模型在特定领域的能力。这时候微调就非常适用。

  • 第四个原因是,要在个性化的服务中使用大模型的能力,这时候针对每个用户的数据,训练一个轻量级的微调模型,就是一个不错的方案。

  • 第五个原因是,数据安全的问题。如果数据是不能传递给第三方大模型服务的,那么搭建自己的大模型就非常必要。

# 二、大模型微调的技术手段

  根据微调对整个预训练模型的调整程度,微调可以分为全微调和部分微调两个方法:

  • 全微调( Full Fine-tuning, FFT ): FFT 是指对整个预训练模型进行微调,包括所有的模型参数。在这种方法中,预训练模型的所有层和参数都会被更新和优化,以适应目标任务的需求。这种微调方法通常适用于任务和预训练模型之间存在较大差异的情况,或者任务需要模型具有高度灵活性和自适应能力的情况。 FFT 需要较大的计算资源和时间,但可以获得更好的性能。

  • 参数高效微调( Parameter-Efficient Fine-Tuning, PEFT ): PEFT 旨在通过最小化微调参数数量和计算复杂度,提升预训练模型在新任务上的表现,从而减轻大型预训练模型的训练负担。 PEFT 可以粗略分为以下三大类:增加额外参数( A )、选取一部分参数更新( S )、引入重参数化( R )。而在增加额外参数这类方法中,又主要分为类适配器( Adapter-like )方法和软提示( Soft prompts )两个小类。

# 2.1 Additive methods

  主要思想是通过添加额外的参数或层来扩充现有的预训练模型,并仅训练新添加的参数。这种方法又分为:

  • Adapters (类适配器):即在 Transformer 子层后引入小型全连接网络。 Adapters 有多种变体,例如修改适配器的位置、剪枝以及使用重参数化来减少可训练参数的数量。
  • Soft Prompts (软提示):人工设计的是 hard prompt,模型训练出来的是 soft promptSoft Prompts 将模型的一部分输入嵌入通过梯度下降进行微调,将在离散空间中寻找提示的问题转化为连续优化问题。 Soft Prompts 可以仅对输入层进行训练 Prompt Tuning),也可以对所有层进行训练(Prefix-Tuning)。
  • others :例如 LeTS , LST(IA)^3

  尽管这些方法引入了额外的参数到网络中,但它们通过减少梯度和优化器状态的大小,减少了训练时间,提升了内存效率。此外可以对冻结的模型参数进行量化(参考论文), additive PEFT 方法能够微调更大的网络或使用更大的批次大小,这提高了在 GPU 上的训练吞吐量。此外,在分布式设置中优化较少的参数大大减少了通信量。

# (1) Prefix Tuning

  Prefix-Tuning 在输入 token 之前构造一段任务相关的 virtual tokens 作为 Prefix,然后训练的时候只更新 Prefix 部分的参数,而 PLM 中的其他部分参数固定。

  针对不同的模型结构,需要构造不同的 Prefix。

  • 针对仅编码器架构模型:在句子前面添加前缀,得到 z = [PREFIX; x; y],合适的上文能够在固定 LM 的情况下去引导生成下文(比如:GPT3 的上下文学习)。
  • 针对编码器 - 解码器架构模型:Encoder 和 Decoder 都增加了前缀,得到 z = [PREFIX; x; PREFIX0; y]。Encoder 端增加前缀是为了引导输入部分的编码,Decoder 端增加前缀是为了引导后续 token 的生成。

  Prefix Tuning 和构造 Prompt 类似,只是 Prompt 是人为构造的 “显式” 的提示,并且无法更新参数,而 Prefix 则是可以学习的 “隐式” 的提示

  同时,为了防止直接更新 Prefix 的参数导致训练不稳定和性能下降的情况,在 Prefix 层前面加了 MLP 结构,训练完成后,只保留 Prefix 的参数

  通过消融实验证实,只调整 embedding 层的表现力不够,将导致性能显著下降,因此,在每层都加了 prompt 的参数,改动较大

  另外,实验还对比了位置对于生成效果的影响,Prefix-tuning 也是要略优于 Infix-tuning 的。其中,Prefix-tuning 形式为 [PREFIX; x; y],Infix-tuning 形式为 [x; INFIX; y]。

# (2) Prompt Tuning

  人工设计 prompts 提示语,成本比较高,并且效果不太好。Prompt Tuning 通过反向传播更新参数来学习 prompts,而不是人工设计 prompts;同时冻结模型原始权重,只训练 prompts 参数,训练完以后,用同一个模型可以做多任务推理。

  Prompt Tuning 可以看作是 Prefix Tuning 的简化版本,它给每个任务定义了自己的 Prompt,然后拼接到数据上作为输入,但只在输入层加入 prompt tokens,并且不需要加入 MLP 进行调整来解决难训练的问题

  通过实验发现,随着预训练模型参数量的增加,Prompt Tuning 的方法会逼近全参数微调的结果

  同时,Prompt Tuning 还提出了 Prompt Ensembling,也就是在一个批次(Batch)里同时训练同一个任务的不同 prompt(即采用多种不同方式询问同一个问题),这样相当于训练了不同模型,比模型集成的成本小多了。

  通过消融实验结果发现,Prompt Tuning 采用类标签初始化模型的效果更好。不过随着模型参数规模的提升,这种 gap 最终会消失。Prompt token 的长度在 20 左右时的表现已经不错

# (3) P-Tuning

  大模型的 Prompt 构造方式严重影响下游任务的效果。人工设计的模版的变化特别敏感,加一个词或者少一个词,或者变动位置都会造成比较大的变化。

  同时,自动化搜索 Prompt 模版成本比较高,离散化的 token 的搜索出来的结果可能并不是最优的,导致性能不稳定。

  P-Tuning,设计了一种连续可微的 virtual token(同 Prefix-Tuning 类似)。P-Tuning 将 Prompt 转换为可以学习的 Embedding 层,并用 MLP+LSTM 的方式来对 Prompt Embedding 进行一层处理

  相比 Prefix Tuning,P-Tuning 加入的可微的 virtual token,但仅限于输入层,没有在每一层都加;另外,virtual token 的位置也不一定是前缀,插入的位置是可选的。这里的出发点实际是把传统人工设计模版中的真实 token 替换成可微的 virtual token。

  经过预训练的 LM 的词嵌入已经变得高度离散,如果随机初始化 virtual token,容易优化到局部最优值,而这些 virtual token 理论是应该有相关关联的。因此,作者通过实验发现用一个 prompt encoder 来编码会收敛更快,效果更好。即用一个 LSTM+MLP 去编码这些 virtual token 以后,再输入到模型

# (4) P-Tuning v2

  Prompt Tuning 和 P-Tuning 等方法存在两个主要的问题:

  第一,缺乏模型参数规模和任务通用性。

  • 缺乏规模通用性:Prompt Tuning 论文中表明当模型规模超过 100 亿个参数时,提示优化可以与全量微调相媲美。但是对于那些较小的模型(从 100M 到 1B),提示优化和全量微调的表现有很大差异,这大大限制了提示优化的适用性。
  • 缺乏任务普遍性:尽管 Prompt Tuning 和 P-tuning 在一些 NLU 基准测试中表现出优势,但提示调优对硬序列标记任务(即序列标注)的有效性尚未得到验证

  第二,缺少深度提示优化,在 Prompt Tuning 和 P-tuning 中,连续提示只被插入 transformer 第一层的输入 embedding 序列中,在接下来的 transformer 层中,插入连续提示的位置的 embedding 是由之前的 transformer 层计算出来的,这可能导致两个可能的优化挑战

  • 由于序列长度的限制,可调参数的数量是有限的。
  • 输入 embedding 对模型预测只有相对间接的影响。

  考虑到这些问题,P-tuning v2 利用深度提示优化(如:Prefix Tuning),对 Prompt Tuning 和 P-Tuning 进行改进,作为一个跨规模和 NLU 任务的通用解决方案

  P-Tuning v2 在每一层都加入了 Prompts tokens 作为输入,而不是仅仅加在输入层,这带来两个方面的好处:

  • 更多可学习的参数(从 P-tuning 和 Prompt Tuning 的 0.01% 增加到 0.1%-3%),同时也足够参数高效。
  • 加入到更深层结构中的 Prompt 能给模型预测带来更直接的影响

  具体做法基本同 Prefix Tuning,可以看作是将文本生成的 Prefix Tuning 技术适配到 NLU 任务中,然后做了一些改进:

  • 移除重参数化的编码器。以前的方法利用重参数化功能来提高训练速度和鲁棒性(如:Prefix Tuning 中的 MLP、P-Tuning 中的 LSTM))。在 P-tuning v2 中发现重参数化的改进很小,尤其是对于较小的模型,同时还会影响模型的表现。
  • 针对不同任务采用不同的提示长度。不同的文本生成任务可能有不同的最佳提示长度。
  • 引入多任务学习。先在多任务的 Prompt 上进行预训练,然后再适配下游任务。多任务学习对 P-tuning v2 来说是可选的,但可能是相当有帮助的。一方面,连续提示的随机惯性给优化带来了困难,这可以通过更多的训练数据或与任务相关的无监督预训练来缓解;另一方面,连续提示是跨任务和数据集的特定任务知识的完美载体。实验表明,在一些困难的序列任务中,多任务学习可以作为 P-tuning v2 的有益补充。
  • 回归传统的分类标签范式,而不是映射器。标签词映射器(Label Word Verbalizer)一直是提示优化的核心组成部分,它将 one-hot 类标签变成有意义的词,以利用预训练语言模型头。尽管它在 few-shot 设置中具有潜在的必要性,但在全数据监督设置中,Verbalizer 并不是必须的。它阻碍了提示调优在我们需要无实际意义的标签和句子嵌入的场景中的应用。因此,P-Tuning v2 回归传统的 CLS 标签分类范式,采用随机初始化的分类头(Classification Head)应用于 tokens 之上,以增强通用性,可以适配到序列标注任务。

  论文中展示了 P-tuning v2 在不同模型规模下的表现。对于简单的 NLU 任务,如 SST-2(单句分类),Prompt Tuning 和 P-Tuning 在较小的规模下没有显示出明显的劣势。但是当涉及到复杂的挑战时,如:自然语言推理(RTE)和多选题回答(BoolQ),它们的性能会非常差。相反,P-Tuning v2 在较小规模的所有任务中都与微调的性能相匹配。并且,P-tuning v2 在 RTE 中的表现明显优于微调,特别是在 BERT 中。

  为了评估 P-Tuning v2 在一些困难的 NLU 挑战中的能力,作者选择了三个典型的序列标注任务(名称实体识别、抽取式问答(QA)和语义角色标签(SRL)),共八个数据集。我们观察到 P-Tuning v2 在所有任务上都能与全量微调相媲美。

  论文还通过消融实验研究了不同任务上 Prompt Length 的影响:

  • 针对简单任务:如情感分析,较短的 Prompt(~20)即可取得不错的效果。
  • 针对复杂任务:如阅读理解,需要更长的 Prompt(~100)。

  总之,P-Tuning v2 是一种在不同规模和任务中都可与微调相媲美的提示方法。P-Tuning v2 对从 330M 到 10B 的模型显示出一致的改进,并在序列标注等困难的序列任务上以很大的幅度超过了 Prompt Tuning 和 P-Tuning。P-Tuning v2 可以成为微调的综合替代方案和未来工作的基线(Baseline)。

# (5) Adapter Tuning

Adapter Tuning 设计了 Adapter 结构,并将其嵌入 Transformer 的结构里面,针对每一个 Transformer 层,增加了两个 Adapter 结构 (分别是多头注意力的投影之后和第二个 feed-forward 层之后),在训练时,固定住原来预训练模型的参数不变,只对新增的 Adapter 结构和 Layer Norm 层进行微调,从而保证了训练的高效性。

每当出现新的下游任务,通过添加 Adapter 模块来产生一个易于扩展的下游模型,从而避免全量微调与灾难性遗忘的问题。

# 2.2 Selective methods

  最早的 selective PEFT 方法是仅微调网络的几个顶层(冻结前层),现代方法通常基于层的类型(Cross-Attention is All You Need)或内部结构,例如仅微调模型的偏置(BitFit)或仅特定的行(Efficient Fine-Tuning of BERT Models on the Edge)。

# (1) BitFit

  BitFit 是一种稀疏的微调方法,它训练时只更新 bias 的参数或者部分 bias 参数。涉及到的 bias 参数有 attention 模块中计算 query,key,value 跟合并多个 attention 结果时涉及到的 bias,MLP 层中的 bias,Layernormalization 层的 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 方式。

  同时,通过对比 BitFit 训练前后的参数,发现很多 bias 参数并没有太多变化(例如:跟计算 key 所涉及到的 bias 参数)。发现计算 query 和将特征维度从 N 放大到 4N 的 FFN 层(intermediate)的 bias 参数变化最为明显,只更新这两类 bias 参数也能达到不错的效果,反之,固定其中任何一者,模型的效果都有较大损失。

# 2.3 Reparametrization-based PEFT(重参数化)

  利用低秩表示来最小化可训练参数的数量。Aghajanyan 等人(2020)证明了在低秩子空间中可以有效地进行微调,对于更大的模型或经过更长时间预训练的模型,需要进行调整的子空间更小。最知名的基于重参数化的方法 LoRa ,它将参数矩阵进行简单的低秩分解来更新权重。最近的研究(Karimi Mahabadi 等,2021;Edalati 等,2022)还探索了 Kronecker product reparametrization 的使用,它在秩和参数数量之间取得了更有利的权衡。

   LoRA 背后有一个假设:我们现在看到的这些大语言模型,它们都是被过度参数化的。而过度参数化的大模型背后,都有一个低维的本质模型。

  大白话说:大模型参数很多,但并不是所有的参数都是发挥同样作用的;大模型中有其中一部分参数,是非常重要的,是影响大模型生成结果的关键参数,这部分关键参数就是上面提到的低维的本质模型。

   LoRA 的基本思路,包括以下几步:

  • 首先,要适配特定的下游任务,要训练一个特定的模型,将 Y=WX 变成 Y=(W+∆W)X ,这里面 ∆W 主是我们要微调得到的结果;

  • 其次,将 ∆W 进行低维分解 ∆W=AB ( ∆Wm*n 维, Am*r 维, Br*n 维, r 就是上述假设中的低维);

  • 接下来,用特定的训练数据,训练出 AB 即可得到 ∆W ,在推理的过程中直接将 ∆W 加到 W 上去,再没有额外的成本。

  • 另外,如果要用 LoRA 适配不同的场景,切换也非常方便,做简单的矩阵加法即可: (W+∆W)-∆W+∆W'

  该方法认为模型权重矩阵在特定微调后具有较低的本征秩,故基于秩分解的概念,将预训练模型的现有权重矩阵分成两个较小的矩阵。

# 2.4 Hybrid methods

  混合多种 PEFT 方法,例如, MAM Adapter 结合了 AdaptersPrompt tuningUniPELT 加入了 LoRa , CompacterKronAB 对适配器进行了重参数化以减少其参数数量;最后, S4 是一个自动化算法搜索的结果,它结合了所有的 PEFT 类别,额外参数数量增加 0.5% 的情况下最大化准确性。

# 三、使用 LLaMA-Factory 微调 Qwen2 模型

# 3.1 运行 Qwen2 模型

  首先进入下载 Qwen2 的 github 网页的运行文件。运行 Qwen2/examples/demo/web_demo.py 即可在网页端运行 Qwen2 模型。

  若本地没有大模型参数文件,则会下载 hugging face 中的参数文件。但是 hugging face 由于网络原因会导致模型下载失败。因此选择国内的 ModelScope 网站下载所需要的 Qwen2 大模型参数文件。找到对应的模型参数文件,依次点击模型文件 - 下载模型 - SDK 下载,即可获得模型参数文件的下载方式,一个示例下载的 python 程序如下所示:

#模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('qwen/Qwen2-1.5B-Instruct')

  待下载完成模型文件后,更改 web_demo.py 文件的 DEFAULT_CKPT_PATH 参数为所下载模型参数文件的路径,一个示例的路径为: DEFAULT_CKPT_PATH = 'E:/python/9_LLM/2_FineTuning/4_Qwen/qwen/Qwen2-1___5B-Instruct'

  之后即可成功运行 web_demo.py ,并与所下载的大模型参数文件对应的大模型进行对话。

# 3.2 下载并运行 LLaMA-Factory

  首先进入 github LLaMA-Factory 网页,下载 LLaMA-Factory 工具箱。运行 LLaMA-Factory-main/src/webui.py 即可运行 LLaMA-Factory 的网页可视化界面。可视化界面如下所示:

# 3.3 准备数据集

  在 LLaMA-Factory-main/data 文件夹下保存了几组示例数据集的 json 文件。其中 dataset_info.json 包含了所有可用的数据集。参考 LLaMA-Factory 的说明文件,如果希望使用自定义数据集,需要在 dataset_info.json 文件中添加数据集描述,目前 LLaMA-Factory 仅支持 alpaca 格式和 sharegpt 格式的数据集。完整的数据集描述如下,具体的示例可以参考初始 dataset_info.json 文件:

"数据集名称": {
  "hf_hub_url": "Hugging Face 的数据集仓库地址(若指定,则忽略 script_url 和 file_name)",
  "ms_hub_url": "ModelScope 的数据集仓库地址(若指定,则忽略 script_url 和 file_name)",
  "script_url": "包含数据加载脚本的本地文件夹名称(若指定,则忽略 file_name)",
  "file_name": "该目录下数据集文件夹或文件的名称(若上述参数未指定,则此项必需)",
  "formatting": "数据集格式(可选,默认:alpaca,可以为 alpaca 或 sharegpt)",
  "ranking": "是否为偏好数据集(可选,默认:False)",
  "subset": "数据集子集的名称(可选,默认:None)",
  "split": "所使用的数据集切分(可选,默认:train)",
  "folder": "Hugging Face 仓库的文件夹名称(可选,默认:None)",
  "num_samples": "该数据集所使用的样本数量。(可选,默认:None)",
  "columns(可选)": {
    "prompt": "数据集代表提示词的表头名称(默认:instruction)",
    "query": "数据集代表请求的表头名称(默认:input)",
    "response": "数据集代表回答的表头名称(默认:output)",
    "history": "数据集代表历史对话的表头名称(默认:None)",
    "messages": "数据集代表消息列表的表头名称(默认:conversations)",
    "system": "数据集代表系统提示的表头名称(默认:None)",
    "tools": "数据集代表工具描述的表头名称(默认:None)",
    "images": "数据集代表图像输入的表头名称(默认:None)",
    "chosen": "数据集代表更优回答的表头名称(默认:None)",
    "rejected": "数据集代表更差回答的表头名称(默认:None)",
    "kto_tag": "数据集代表 KTO 标签的表头名称(默认:None)"
  },
  "tags(可选,用于 sharegpt 格式)": {
    "role_tag": "消息中代表发送者身份的键名(默认:from)",
    "content_tag": "消息中代表文本内容的键名(默认:value)",
    "user_tag": "消息中代表用户的 role_tag(默认:human)",
    "assistant_tag": "消息中代表助手的 role_tag(默认:gpt)",
    "observation_tag": "消息中代表工具返回结果的 role_tag(默认:observation)",
    "function_tag": "消息中代表工具调用的 role_tag(默认:function_call)",
    "system_tag": "消息中代表系统提示的 role_tag(默认:system,会覆盖 system column)"
  }
}

  添加完成数据集描述后,即可在在 LLaMA-Factory-main/data 文件夹内创建对应数据集名称的 json 文件,即可完成自定义数据集的添加。数据集的格式需要和数据集描述一致,详细的示例可以参考初始在 LLaMA-Factory-main/data 文件夹下的其他 json 数据集文件。

# 3.4 使用 LLaMA-Factory 进行大模型微调

  在准备好微调的数据集之后,即可再次运行 LLaMA-Factory-main/src/webui.py ,启动 LLaMA-Factory 的可视化界面,其中的部分参数定义如下,需要注意的是数据路径应该指定为本地计算机 LLaMA-Factory-main/data 文件夹的绝对路径:

  定义完成训练参数后即可点击 “开始” 按钮,开始模型的微调训练。模型训练完毕后,点击 Chat 选项卡,检查点路径选择训练好的大模型,即可开始与微调完成的大模型进行在线对话。点击 Export 选项卡,指定导出目录以及其他设置,点击 “开始导出”,即可导出训练完毕的大模型。至此,已经完成使用 LLaMA-Factory 进行大模型微调的全部过程。

# 总结

参考:https://zhuanlan.zhihu.com/p/649755252

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 的不同部分对模型有效性和鲁棒性都有好处。

更新于 阅读次数