高效的参数调整方法汇总

parameter-efficient transfer learning method:意思是只需要调整一小部分的参数就可以达到微调的效果。

现有的常见的参数微调方法:

(1)adapater tuning :是在PLM模型的每一层中插入了小的神经网络模块,在fine tuning时,只有这一小块的参数需要被微调。

(2) prefix tuning

(3) prompt tuning

transformer的架构:由多个堆叠的叠块组成(blocks),每个叠块包含了两种类型的层,一是多头注意力层,一种是前向全连接层,在多头注意力层,参数包括了Q\setminus K\setminus V,每部分的参数量为:Q\in \mathbb{R}^{^{n*d_{k}}},n表示head的数量,d_{k}表示维度。K\in \mathbb{R}^{^{m*d_{k}}},V \in \mathbb{R}^{^{m*d_{v}}}

注意力的计算公式为:

Attn(Q,K,V)=softmax(\frac{QK^{T}}{\sqrt{d_{k}} } )V

在多头注意力计算中,共有n个并行的头,单个注意力参数的维度可以表示为

W_{q}\in \mathbb{R}^{d*d_{h}},W_{k}\in \mathbb{R}^{d*d_{h}},W_{v}\in \mathbb{R}^{d*d_{h}}

将每个head计算的结果做cat连接,然后,通过线性层映射。

FFN(x)=Relu(x*W_{1}+b_{1})W_{2}+b_{2}

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,用于对每一层的激活值进行归一化

transformer中的parameter-efficient tuning method结构:

  1. 注意看adapter放置的位置。
  2. LoRA是和原始的W参数做cat之后,送入注意力层。LoRA的计算,是对原始x做了计算,h=h+s*xW_{down}W_{up}
  3. P表示的prefix 参数,是和原有的attention的参数做cat之后,作为新的注意力参数,在做多头注意力机制的计算。

Adapter (2019)

Adapter 方法在transformer层之间插入小模块(Adapter )。Adapter 层通常使用W_{down} \in \mathbb{R}^{d*r}  的下投影将输入 h 投影到由瓶颈维度 r 指定的低维空间,然后是非线性激活函数 f(·),以及W_{up} \in \mathbb{R}^{d*r}。这些Adapter被残差连接包围,形成最终形式。

h=h+f(h*W_{down})W_{up}

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 ∈ \mathbb{R}^{l*d}与原始键 K 和值 V 连接起来作为新的前缀键和值,然后,执行多头注意力。(Pk and Pv are split into N_{h} head vectors respectively and P (i) k , P (i) v ∈ \mathbb{R}^{l*d/N_{h}} denote the i-th head vector)
head_{i}=Attn(x*W_{q}^{i} ,concat(P_{k}^{i},CW_{k}^{i}),concat(P_{v}^{i},CW_{v}^{i})

所以,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) 通过仅在第一层的输入词嵌入前添加前缀来简化前缀调整),我理解的也就是,只更新词嵌入部分的参数。

W_{down} \in

LoRA(2021)

LoRA 将可训练的低秩矩阵注入到transformer中以近似权重更新。

For a pre-trained weight matrix W ∈ \mathbb{R}^{d*k} , LoRA represents its update with a low-rank decomposition W +∆W = W +W_{down}W_{up},其中,W_{down}\in \mathbb{R}^{d*r},W_{up} \in \mathbb{R}^{r*k},是需要微调的参数。LoRA使用更新后的query和value 矩阵到多头注意力层

对于多头注意力中线性映射部分,LoRA 将原始输入x通过线性映射得到的输出 h 修改为

h=h+s*xW_{down}W_{up}

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

以上几种模型的表现形式

  1. Adapter是在attention 层或者linear层与Add&norm层之间添加adapter。即需要微调的参数。
  2. Prefix tuning是在输入部分添加了一部分可学习的参数。在transformer中更新了query和value的参数。
  3. LoRA 是在transformer中更新了query和value的参数。
  4. parallel adapter中,是与整个PLM并行的。注意观察和(a)图的区别。
  5. Scaled PA,缩放的adapter,是对Adapter的参数做了scalling处理。

(“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组成的假设下,需要调整的模型参数量大小,如下:

应该是能够看懂的。

## Masking as an Efficient Alternative to Finetuning for Pretrained Language Models(2020)

提出一种简单的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)参数更新

整个实验中的影响因素分析

  1. 初始化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方式中,增加掩蔽层数逐渐提高性能

Parameter-Efficient Transfer Learning with Diff Pruning

该方法学习了一个特定于任务的 "diff "向量,该向量对原始预训练的参数进行了调整。在训练过程中,这个 diff 向量通过对L0-norm惩罚的可微调近似来适应性地修剪,以鼓励稀疏性(L0-norm主要被用来度量向量中非零元素的个数)。

由于它不需要在训练期间访问所有任务,因此它在任务流设置中很有吸引力。它只需要为每个任务存储一个小的diff向量,在工业应用中很有实用价值。

Diff Pruning

Diff pruning 将特定任务的微调表述为学习一个 diff 向量 ,该向量被添加到预先训练的模型参数θ中,该参数保持固定。我们首先对特定任务的模型参数进行重新参数化,

这导致了下面的经验风险最小化问题,

L0 范数的可微近似(Differentiable approximation to the L0-norm)

个人补充:我理解的diff向量也是一个二值向量,是mask向量,主要用来控制哪部分参数更新,哪部分参数不更新的。针对每个任务有一个特定的的diff向量,然后,为了能够使用梯度下降的方法更新学习参数,将Zr放宽到连续空间 [0,1] ,并采用拉伸的 Hard-Concrete 分布,这样就可以使用路径梯度估计器。

实验结果中,显示,不同任务的预训练模型参数的保留是不同的。下图,显示了每个任务中不同层的非零 diff 参数的百分比

parameter-Efficient学习方法:

  1. 为每个任务学习较小的压缩模型:这种方法面临着严重的稀疏性/性能权衡,并在每个任务中保留大量非零参数(例如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》
  2. 多任务学习和feature-based 的迁移:允许每个任务的参数效率更高的迁移学习,这些方法在共享模型的基础上训练少量附加参数(例如线性层)。多任务学习通常需要在训练期间访问所有任务,以防止灾难性遗忘,而 feature-based 的迁移学习在面对基于任务不可知的句子表示通常通过微调表现得更好

Delta tuning(只抓核心)相关推荐

  1. 大模型系统和应用——Prompt-learning Delta Tuning

    引言 最近在公众号中了解到了刘知远团队退出的视频课程<大模型交叉研讨课>,看了目录觉得不错,因此拜读一下. 观看地址: https://www.bilibili.com/video/BV1 ...

  2. Fiddler抓包-只抓APP的请求

    from:https://www.cnblogs.com/yoyoketang/p/6582437.html fiddler抓手机app的请求,估计大部分都会,但是如何只抓来自app的请求呢? 把来自 ...

  3. 查看本机所有请求_【松勤教育】Fiddler抓包-只抓APP的请求

    fiddler抓手机app的请求,估计大部分都会,但是如何只抓来自app的请求呢? 把来自pc的请求过滤掉,因为请求太多,这样会找不到重要的信息了. 环境准备: 1.电脑上已装fiddler 2.手机 ...

  4. 爬取的网页翻页是js的(构造post请求,ajax 异步刷新的, 只抓ajax调用的接口就行),然后保存固定格式

    import requests import json from lxml import etree import time''' 注意,河北省博物馆这个网站.从第二页开始是这样匹配的replys = ...

  5. 如何写一只抓哔哩哔哩弹幕的爬虫

    原文地址:http://blog.csdn.net/bigbigsman/article/details/78639053 如何写一只抓哔哩哔哩弹幕的爬虫 爬虫工作流程 解析首页获得视频cid 构造所 ...

  6. 测试组负责软件质量对吗,软件测试负责人如何开展只做核心功能测试又对软件质量负责的测试工作?...

    经理古先生:为了追赶项目进度,节省资源,只做核心功能的测试,这样的软件存在一定的质量风险,但是测试负责人仍要对软件质量负责,那么测试负责人应该怎样开展?51Testing软件测试网cqy;d7p$b ...

  7. 中国知网,只看核心期刊

    中国知网,只看核心期刊 进入中国知网->点击期刊->点击高级检索.

  8. Windows10用fiddler抓包Android应用(解决手机设置代理后无法上网,设置只抓app包)

    #1.环境准备 1.电脑上安装fiddler #2.设置 1.fiddler>Tools>Fiddler Options>Connections 勾选Allow remote com ...

  9. directshow怎样打开摄像头不预览只抓帧_不比不知道,一比还真有差距!四款高性价比家庭智能摄像头对比...

    随着科技不断的迈进,如今智慧产品越来越丰富,无论是可以远程控制的家庭电器,还是精密检测的空气净化器,烟.煤气探测,或者是智能门锁.家庭摄影机以及智能猫眼这类安全监控产品.特别是家庭摄影机,现在可以说越 ...

最新文章

  1. 腐蚀rust高速箭怎么做不了_皮带轮动平衡怎么做
  2. MooTools教程(1):认识MooTools
  3. Java中的Set操作
  4. 测试系列之六---软件测试分类
  5. 用Transformer完全代替CNN:AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE
  6. 单片机涡轮流量传感器_迅尔仪表|同是涡轮流量计,为什么液体涡轮流量计不能测气体?...
  7. 20-30-010-安装-kafka-manager
  8. h5 宽度全屏自适应
  9. 篮球战术谈之经典配合
  10. Java经典编程题50道之三十一
  11. keil4出现目标未被创建_STM32入门系列-创建寄存器模板
  12. 三路划分快速排序 java_程序员面试—快速排序的三路划分
  13. 软件测试用例的书写方式以及测试模板
  14. 如何解决百度识图中图片被限制百度防盗链破解方法
  15. matlab入门——矩阵(运算、编辑、高维矩阵、对角矩阵)
  16. linux查看网络连接命令,linux查看网络链接状况命令之-netstat
  17. Tolerance Analysis 尺寸公差分析
  18. 2020-10-18Go语言接口
  19. PS-实战-ICON图标
  20. LCD中如何描绘点阵数据

热门文章

  1. 如何Disable Alfresco的Download以及打印功能
  2. 比较两个字符串的大小
  3. PureMVC 实例讲解
  4. 解决win10一开机内存(8G)就占用70%多,查看任务管理器并没有占用内存很高的进程的问题
  5. FLUENT操作--VOF模型局部初始化的TUI命令
  6. 简单音乐播放器html+css+基础vue+含源码,有搜索和播放mv功能,代码可直接复制用。
  7. 11. WS · HTTPDNS · FTP · 邮件
  8. 关于安卓的通知栏 NotificationCompat
  9. 嵌入式数据库-SQLite的基本使用
  10. [Golang]写文件的权限定义perm