高效的参数调整方法汇总
parameter-efficient transfer learning method:意思是只需要调整一小部分的参数就可以达到微调的效果。
现有的常见的参数微调方法:
(1)adapater tuning :是在PLM模型的每一层中插入了小的神经网络模块,在fine tuning时,只有这一小块的参数需要被微调。
(2) prefix tuning
(3) prompt tuning
transformer的架构:由多个堆叠的叠块组成(blocks),每个叠块包含了两种类型的层,一是多头注意力层,一种是前向全连接层,在多头注意力层,参数包括了,每部分的参数量为:,n表示head的数量,表示维度。,
注意力的计算公式为:
在多头注意力计算中,共有n个并行的头,单个注意力参数的维度可以表示为
,,
将每个head计算的结果做cat连接,然后,通过线性层映射。
W1的维度是d*dm,dm表示transformer的维度,即通过transformer层后得到的张量维度。
W2的维度是dm*d,是在transformer之后,将其映射至d的维度。
之后通过残差连接和layer正则化
上图是论文中 Transformer 的内部结构图,左侧为 Encoder block,右侧为 Decoder block。红色圈中的部分为 Multi-Head Attention,是由多个 Self-Attention组成的,可以看到 Encoder block 包含一个 Multi-Head Attention,而 Decoder block 包含两个 Multi-Head Attention (其中有一个用到 Masked)。Multi-Head Attention 上方还包括一个 Add & Norm 层,Add 表示残差连接 (Residual Connection) 用于防止网络退化,Norm 表示 Layer Normalization,用于对每一层的激活值进行归一化。
Adapter (2019)
Adapter 方法在transformer层之间插入小模块(Adapter )。Adapter 层通常使用 的下投影将输入 h 投影到由瓶颈维度 r 指定的低维空间,然后是非线性激活函数 f(·),以及。这些Adapter被残差连接包围,形成最终形式。
Houlsby et al. (2019) places two adapters sequentially within one layer of the transformer, one after the multi-head attention and one after the FFN sub-layer
Pfeiffer et al. (2021) have proposed a more efficient adapter variant that is inserted only after the FFN “add & layer norm” sub-layer.
prefix tuning (2021)
受文本提示方法(Liu et al., 2021a)成功的启发,前缀调整在每一层的多头注意力的键和值之前添加了 l 个可调整的前缀向量。具体来说,将两组前缀向量 Pk, Pv ∈ 与原始键 K 和值 V 连接起来作为新的前缀键和值,然后,执行多头注意力。(Pk and Pv are split into head vectors respectively and P (i) k , P (i) v ∈ denote the i-th head vector)
所以,transformer的新的参数向量是(l_prefix+l_ori)*d,将prefix的参数也考虑进来,作为最终的transformer维度的一部分。
Prompt-tuning (Lester et al., 2021) simplifies prefix-tuning by only prepending to the input word embeddings in the first layer (Prompt-tuning (Lester et al., 2021) 通过仅在第一层的输入词嵌入前添加前缀来简化前缀调整),我理解的也就是,只更新词嵌入部分的参数。
LoRA(2021)
LoRA 将可训练的低秩矩阵注入到transformer中以近似权重更新。
For a pre-trained weight matrix W ∈ , LoRA represents its update with a low-rank decomposition W +∆W = W +,其中,,是需要微调的参数。LoRA使用更新后的query和value 矩阵到多头注意力层。
对于多头注意力中线性映射部分,LoRA 将原始输入x通过线性映射得到的输出 h 修改为
Others
BitFit (Ben Zaken et al., 2021), which only fine-tunes bias vectors in the pre-trained model
Diff-pruning (Guo et al., 2021), which learns a sparse parameter update vector
(“PLM 模块”表示冻结的 PLM 的某个子层(例如注意力或 FFN)。 “Scaled PA”表示缩放的并行适配器。我们在这里不包括多头并行适配器以节省空间。)
prefix tuning和Adapter的区别
(1)prefix tuning使用 PLM 层的输入 x 来计算 Δh,而Adapter使用 PLM 层的输出 h。
(2) Adapter更加灵活,它可以放在注意力层或者线性层。但是prefix tuning只修改了每个head的注意力层的输出。
(3)Adapter可以只修改多头注意力中的一个head。prefix tuning是修改attention head的所有head。
不同方法调整的参数量大小
单个层调整的参数量的大小,l表示length,d表示维度,r表示 bottlenck的参数。
在prefix tuning中,attention是由Q、K、V三部分组成,只调节了Q、K部分的参数,参数量为2*ld
在Adapter中,attention部分同linear部分,均是在与add&norm之间的层处,添加adapter,考虑的瓶颈部分的维度,为r. 参数量为2rd
在LoRA中,是由W-bottom和W-up两部分组成,每个的参数是rd,则Q部分的参数是2rd,整个attention部分是Q和K两部分,则单层的参数是2*2rd=4rd
不同模型的单层参数增加量
在假设transformer是由12个block组成的假设下,需要调整的模型参数量大小,如下:
应该是能够看懂的。
提出一种简单的mask方法实现高效finetune。相比一般的finetune,该方法在finetune阶段不对参数进行调整,而是学习一个mask矩阵。对于每一个Transformer层,都会学习一个0-1的矩阵,然后用这个矩阵对该层所有全连接权重进行缩放。公式如下,m表示矩阵中某一个元素,根据一个阈值设置为1或0,再用这个矩阵和每层的全连接参数相乘进行对应元素的缩放。
Mask-tuning的出发点为,在预训练模型finetune的过程中,其实不需要finetune那么多参数,只要finetune一些关键参数就能达到较好的效果,减少finetune阶段计算的冗余性。在How fine can fine-tuning be? Learning efficient language models(2020)一文中也提出了类似的思路。
Mask-tuning的出发点为,在预训练模型finetune的过程中,其实不需要finetune那么多参数,只要finetune一些关键参数就能达到较好的效果,减少finetune阶段计算的冗余性。
个人补充:
(1)mask 预训练模型中的参数,即对于模型中的部分参数采用二分类的mask方式,确定是否是下游任务的关键参数。
但是,transformer是包括多个block的,这篇文章只对linear层的相关参数做出了选择。在整个PLM中,涉及到linear层的,包括了:WK, WQ, WV , and WAO
前三个是attention部分的线性层参数,后一个是feed forward层的参数(The attention is then transformed by WAO)and subsequently fed forward by WI and WO to the next transformer block.
(2)在对线性层参数确定mask部分的时候,是采用二分类思想,定好一个阈值,如果高于阈值,则为1,低于阈值,则为0。在mask 矩阵的基础上,得到的线性层参数是Wl',是由原来的Wl与mask 矩阵的Hadamard 积得到的。(哈达玛积是矩阵A,B对应元素的乘积)
(3)参数更新
整个实验中的影响因素分析
- 初始化mask矩阵的稀疏率:(i) 去除大部分预训练参数时,初始稀疏度很大,例如 95%,会导致四个任务的性能不佳。这是因为预训练的知识在很大程度上被丢弃了。 (ii) 逐渐降低初始稀疏度可以提高任务性能。通常,3% ∼ 10% 的初始稀疏性会在任务中产生合理的结果。像 SST2 这样的大数据集比像 RTE 这样的小数据集更不敏感。 (iii) 选择几乎所有预训练参数,例如 1% 稀疏度,会损害任务性能。
2.分层行为
如何更新PLM 的参数?是bottom-up还是up-bottom的方式?
在PLM的不同层数中,蕴含的信息不同,句法信息在较低层更好地表示,而语义信息在较高层被捕获
实验结果:(1)top-down的方式优于bottom-up mask的方式;(2)bottom-up mask方式中,增加掩蔽层数逐渐提高性能
该方法学习了一个特定于任务的 "diff "向量,该向量对原始预训练的参数进行了调整。在训练过程中,这个 diff 向量通过对L0-norm惩罚的可微调近似来适应性地修剪,以鼓励稀疏性(L0-norm主要被用来度量向量中非零元素的个数)。
由于它不需要在训练期间访问所有任务,因此它在任务流设置中很有吸引力。它只需要为每个任务存储一个小的diff向量,在工业应用中很有实用价值。
Diff pruning 将特定任务的微调表述为学习一个 diff 向量 ,该向量被添加到预先训练的模型参数θ中,该参数保持固定。我们首先对特定任务的模型参数进行重新参数化,
这导致了下面的经验风险最小化问题,
个人补充:我理解的diff向量也是一个二值向量,是mask向量,主要用来控制哪部分参数更新,哪部分参数不更新的。针对每个任务有一个特定的的diff向量,然后,为了能够使用梯度下降的方法更新学习参数,将Zr放宽到连续空间 [0,1] ,并采用拉伸的 Hard-Concrete 分布,这样就可以使用路径梯度估计器。
实验结果中,显示,不同任务的预训练模型参数的保留是不同的。下图,显示了每个任务中不同层的非零 diff 参数的百分比
parameter-Efficient学习方法:
- 为每个任务学习较小的压缩模型:这种方法面临着严重的稀疏性/性能权衡,并在每个任务中保留大量非零参数(例如10%-30%)。相关论文:《Compressing BERT: Studying the Effects of Weight Pruning on Transfer Learning》
《Poor Man’s BERT: Smaller and Faster Transformer Models》
《Masking as an Efficient Alternative to Finetuning for Pretrained Language Models》
《Adaptive Sparsity by Fine-Tuning》- 多任务学习和feature-based 的迁移:允许每个任务的参数效率更高的迁移学习,这些方法在共享模型的基础上训练少量附加参数(例如线性层)。多任务学习通常需要在训练期间访问所有任务,以防止灾难性遗忘,而 feature-based 的迁移学习在面对基于任务不可知的句子表示通常通过微调表现得更好