避免了全模型微调带来的计算资源浪费,同时也克服了Few-Shot Learning的上下文长度限制。
Prompt-Tuning是一种利用提示(prompt)来指导模型生成特定类型输出的方法(包括:硬提示:PET,软提示:Prompt Tuning和P-Tuning)
PEFT是一种使用前缀向量来进行微调的方法,前缀向量被添加到模型的输入中,用于调整模型的输出以适应特定任务。只有前缀向量被更新,模型主体的参数保持不变。(包括:Prefix-Tuning,Adapter-Tuning,LoRA)PEFT 方法仅微调少量或额外的模型参数,固定大部分预训练参数,大大降低了计算和存储成本,同时最先进的 PEFT 技术也能实现了与全量微调相当的性能。
1,Prompt Tuning
1)适合自然语言生成的任务,基于T5模型(seq2seq结构)来做的
2)为每一个任务额外添加一个或多个embedding-——>将这些embedding和文本一起输入到大语言模型中——>只训练这些embedding的表征参数,不改模型的参数
3)embedding可以是随机初始化,也可以是预训练模型中已有的词作为这个伪标记的初始化,还可以是标签词对应的embedding为初始化
2,P-Tuning
1)适合自然语言理解任务
2)根据任务随机初始化一组提示词向量(伪标记,模型输入的一部分,会加入一些可以代表句子语义的一些词一起初始化)——>这些向量通过一层Bi-LSTM+两个前馈神经网络组成的Prompt Encoder转为新的嵌入向量(更加适应特定任务的需求)——>转换后的新的嵌入向量和原始文本一起送入预训练模型中(嵌入向量的位置可以随意放)——>模型根据整合后的输入生成输出——>误差通过反向传播计算并且只更新经过Prompt Encoder的嵌入向量以及相关神经网络的参数
3)推理阶段不使用Prompt Encoder,只在训练的时候用
4)P-Tuning v2 是在模型的每一层都应用连续的 prompts 并对 prompts 参数进行更新优化
3,Prefix-Tuning
1)随机初始化一组前缀向量,在模型的每一层都加入这前缀向量,比如BERT,有12层都加入前缀向量(其维度与模型的隐藏层维度相同,数量根据需要设定)——>将前缀向量与输入文本的嵌入向量连接或者相加形成最终的输入向量-——>将输入向量送入模型,计算损失函数,仅针对前缀向量进行反向传播以更新这些向量的值。
4,Adapter Tuning
在不修改预训练模型参数的情况下,通过添加轻量级的适配器模块(小型的前馈网络)来调整模型的行为以适应特定任务,适配器模块可以很容易地在不同的任务之间迁移和共享,促进了多任务学习和迁移学习。
Adapter模块通常由两个线性层组成,中间可能包含非线性激活函数,如ReLU或GELU。
第一个线性层将模型的隐藏状态从高维压缩到低维,减少参数数量
第二个线性层将压缩后的状态恢复回原来的维度,以便与模型其他部分连接
采用残差连接,即将原始的模型输出与经过适配器处理后的输出相加。
工作流程是:
-
输入:模型的隐藏状态进入Adapter模块。
-
降维:通过第一个线性层(down-projection)将隐藏状态压缩到低维空间。
-
激活:通过非线性激活函数增加表达能力。
-
升维:通过第二个线性层(up-projection)将状态恢复到原来的维度。
-
残差连接:将经过Adapter模块处理后的状态与原始状态相加,形成最终的输出
-
只有Adapter模块的参数被更新,预训练模型的参数保持不变。
5,LoRA(微软)
对大型模型的权重矩阵进行隐式的低秩转换,也就是:通过一个较低维度的表示来近似表示一个高维矩阵或数据集。
LoRA技术冻结预训练模型的权重,并在每个Transformer块中注入可训练层
LoRA 模块由一对小的线性层组成,分别称为A和B,其中A用于降维,B用于升维。
-
模型的权重矩阵被表示为:
𝑊=W0+ΔW
其中𝑊0是预训练权重,ΔW是更新量。
-
Δ𝑊被表示为两个小矩阵A和B的乘积:Δ𝑊=𝐴⋅𝐵𝑇
A=rd B=dr,B一般初始化为0,为了模型的稳定,r一般为8
-
在微调过程中,只有LoRA模块的A和𝐵参数被更新。