一、BitFit

(论文:BitFit: Simple Parameter-efficient Fine-tuning or Transformer-based Masked Language-models)是一种稀疏的微调方法,它训练时只更新bias的参数或者部分bias参数。 

对于Transformer模型而言,冻结大部分 transformer-encoder 参数,只更新bias参数跟特定任务的分类层参数。涉及到的bias参数有attention模块中计算query,key,value跟合并多个attention结果时涉及到的bias,MLP层中的bias,Layernormalization层的bias参数。 

# bitfit
# 选择模型参数里面的所有bias部分

num_param = 0
for name, param in model.named_parameters():
    if "bias" not in name:
        param.requires_grad = False
    else:
        num_param += param.numel()

二、Prompt-Tuning

(论文:The Power of Scale for Parameter-Efficient Prompt Tuninghttps://arxiv.org/abs/2104.08691

  • 模型本身完全 “冻结”:pre-trained 好的大模型参数一动不动,所有任务共用这一个 “基础模型”,不用重复存储;
  • 只训练 “小提示”:针对每个任务,额外加一段短的 “虚拟提示词”(不是真实文字,是模型能理解的数值向量),只训练这段 “提示” 的参数,让它学会 “告诉” 模型该做什么任务;

Ptompt-Tuning的思想:冻结模型全部参数,在训练数据前加入一小段Prompt,只训练Prompt表示层,即一个Embedding模块,Prompt又存在两种形式,一种是Hard Prompt,一种是soft Prompt

from peft import PromptTuningConfig, get_peft_model, TaskType, PromptTuningInit

# Soft Prompt
# config = PromptTuningConfig(task_type=TaskType.CAUSAL_LM, num_virtual_tokens=10)
# config
# Hard Prompt
config = PromptTuningConfig(task_type=TaskType.CAUSAL_LM,
                            prompt_tuning_init=PromptTuningInit.TEXT,
                            prompt_tuning_init_text="下面是一段人与机器人的对话。",
                            num_virtual_tokens=len(tokenizer("下面是一段人与机器人的对话。")["input_ids"]),
                            tokenizer_name_or_path="Langboat/bloom-1b4-zh")

三、P-Tuning  & P-Tuning V2

P-tuning:

https://arxiv.org/abs/2103.10385

P-Tuning的思想:在Prompt-Tuning的基础上,对Prompt部分进行进一步的编码计算,加速收敛。具体来说,PEFT中支持两种编码方式,一种是LSTM,另一种是MLP,与prompt-Tuning不同的是,prompt的形式只有soft-Prompt

from peft import PromptEncoderConfig, TaskType, get_peft_model, PromptEncoderReparameterizationType

config = PromptEncoderConfig(task_type=TaskType.CAUSAL_LM, num_virtual_tokens=10,
                             encoder_reparameterization_type=PromptEncoderReparameterizationType.MLP,
                             encoder_dropout=0.1, encoder_num_layers=5, encoder_hidden_size=1024)

P-Tuning v2:

https://aclanthology.org/2022.acl-short.8/

传统提示调优仅在输入层插入连续提示,存在 “提示容量有限、对预测影响间接” 的缺陷,导致模型规模 < 10B 时性能远差于微调。P-tuning v2 通过核心设计 —— 在模型每一层插入连续提示(深度提示调优)

四、Prefix-Tuning

https://arxiv.org/abs/2101.00190

ptrfix-Tuning的思想:相较于Prompt-Tuning和P-Tuning,prefix-Tuning不再将prompt加在embedding层,而是将其作为可学习的前缀,放置在Transformer模型的每一层中,具体表现形式为past_key_values。

from peft import PrefixTuningConfig, get_peft_model, TaskType

config = PrefixTuningConfig(task_type=TaskType.CAUSAL_LM, num_virtual_tokens=10, prefix_projection=True)

五、LoRa

https://arxiv.org/pdf/2106.09685

本文提出LoRA(Low-Rank Adaptation,低秩适配) 方法,核心是冻结预训练语言模型的所有权重,通过在 Transformer 每层注入可训练的低秩分解矩阵(A 和 B) 实现下游任务适配,大幅减少可训练参数。实验表明,LoRA 在 RoBERTa、DeBERTa、GPT-2 及GPT-3 175B上性能与全微调相当甚至更优:相较于 GPT-3 全微调,可训练参数减少10,000 倍,GPU 内存需求降低3 倍(从 1.2TB 降至 350GB),且无额外推理延迟(区别于 Adapter);在低数据场景(如 MNLI-100 样本)表现优于全微调,对未见过主题的外推能力更强。同时,研究发现模型适配时权重更新的 “内在秩” 极低(GPT-3 中 r=1-2 即可),为 LoRA 的有效性提供理论支撑。

假设权重更新\Delta W具有低 “内在秩”,用BA(低秩矩阵)近似\Delta W,公式为W_0 +\Delta W = W_0 + BA

from peft import LoraConfig, TaskType, get_peft_model

config = LoraConfig(task_type=TaskType.CAUSAL_LM, target_modules=".*\.1.*query_key_value", modules_to_save=["word_embeddings"])

六、PEFT

https://arxiv.org/pdf/2303.15647

本文系统综述了 2019 年初至 2024 年中的50 余篇参数高效微调(PEFT)相关论文,提出 PEFT 方法的三级分类体系(添加型、选择型、重参数化型),并通过覆盖0.7B-11B 参数模型5 个数据集(SuperGLUE 的 BoolQ/RTE/COPA 及 CNN-Dailymail)的大规模实验,对比 14 种主流 PEFT 方法的性能与效率。核心发现包括:Houlsby Adapters 与 LoRA在全模型规模下性能持平甚至超越全微调,且无需复杂超参调优;Layer Norm(LN)调优作为轻量方法表现意外优异;混合 PEFT 方法(如 UniPELT、MAM)存在高超参敏感性,在资源受限场景下难超 LoRA;

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐