大规模语言模型高效参数微调--Adapter 微调系列

Adapter Tuning

Adapter Tuning 在预训练模型每层中插入用于下游任务的参数(针对每个下游任务, 仅增加 3.6% 的参数), 在微调时将模型主体冻结,仅训练特定于任务的参数,从而减少了训练时的算力开销。

Adapter Tuning 设计了 Adapter 结构, 并将其嵌入 Transformer 的结构里面, 针对每一个 Transformer 层, 增加 了两个 Adapter 结构 (分别是多头注意力的投影之后和第二个 feed-forward 层之后),在训练时, 固定住原来预训 练模型的参数不变, 只对新增的 Adapter 结构和 Layer Norm 层进行微调, 从而保证了训练的高效性。每当出现新 的下游任务,通过添加 Adapter 模块来产生一个易于扩展的下游模型,从而避免全量微调与灾难性遗忘的问题。

与 Transformer 集成的 Adapter 架构图。左图: 添加了两个 Adapter 模块到每个 Transformer 层。右图:Adapter 包含一个bottleneck ,其中包含了少量参数, Adapter 还包含一个残差连接。

上图是 adapter 的具体结构, 每个 Adapter 模块主要由两个前馈(Feedforward) 子层组成, 第一个前馈子层 (down-project) 将 Transformer 块的输出作为输入, 将原始输入维度d (高维特征) 投影到 m (低维特征),通过控 制 m 的大小来限制 Adapter 模块的参数量, 通常情况下, m«d。然后, 中间通过一个非线形层。在输出阶段, 通 过第二个前馈子层(up-project) 还原输入维度, 将 m (低维特征) 重新映射回 d (原来的高维特征),作为 Adapter 模块的输出。同时, 通过一个 skip connection 来将 Adapter 的输入重新加到最终的输出中去, 这样可以保证, 即 便 Adapter 一开始的参数初始化接近 0,Adapter 也由于 skip connection 的设置而接近于一个恒等映射, 从而确保 训练的有效性。

至于 adapter 引进的模型参数, 假设 adapter 的输入的特征维度是 d,而中间的特征维度是 m,那么新增的模 型参数有:down-project 的参数 d*m+m ,up_project 的参数 m*d+d,总共 2md+m+d, 由于 m 远小于 d,所以真 实情况下, 一般新增的模型参数都只占语言模型全部参数量的 0.5%~8%。同时要注意到, 针对下游任务训练需 要更新的参数除了 adapter 引入的模型参数外, 还有 adapter 层后面紧随着的 layer normalization 层参数需要更新, 每个 layer normalization 层只有均值跟方差需要更新,所以需要更新的参数是 2d。

通过实验发现, 只训练少量参数的 Adapter 方法的效果可以媲美全量微调, 这也验证了 Adapter 是一种高效 的参数训练方法,可以快速将语言模型的能力迁移到下游任务中去。Adapter 通过引入 0.5% ~ 5% 的模型参数可 以达到不落后全量微调模型 1% 的性能。

AdapterFusion

为了整合来自多个任务的知识, 传统的两个方法是按一定顺序微调(Sequential fine-tuning) 或者多任务学习(multi-task learning)。前者的一大问题是需要先验知识来确定顺序, 且模型容易遗忘之前任务 学到的知识,后者的问题是不同的任务会互相影响,也难以平衡数据集大小差距很大的任务。

之前的工作, Adapter Tuning 的一个优势就是不用更新预训练模型的参数, 而是插入比较少的新的参数就可 以很好地学会一个任务。此时, Adapter 的参数某种程度上就表达了解决这个任务需要的知识。如果想要把来自 多个任务的知识结合起来, 是否可以考虑把多个任务的 Adapter 的参数结合起来?基于此, 提出了AdapterFusion, 这是一种新的两阶段学习算法,可以利用来自多个任务的知识。

左图:与 Transformer 集成的 AdapterFusion 架构图。右图:AdapterFusion 架构图, 包含了可学习的 Query, Key 和 Value。

AdapterFusion 在 Adapter 的基础上进行优化, 通过将学习过程分为两阶段来提升下游任务表现。AdapterFu- sion 在大多数情况下性能优于全模型微调和 Adapter,特别在 MRPC(相似性和释义任务数据集) 与 RTE(识别文本 蕴含数据集) 中性能显著优于另外两种方法。AdapterFusion 学习过程的两个阶段:

  • 1. 知识提取阶段:训练 Adapter 模块学习下游任务的特定知识,将知识封装在 Adapter 模块参数中。

  • 2. 知识组合阶段:将预训练模型参数与特定于任务的 Adapter 参数固定, 引入新参数学习组合多个Adapter 中的知识,提高模型在目标任务中的表现。

首先, 对于 N 的不同的下游任务训练 N 个 Adapter 模块。然后, 使用 AdapterFusion 组合 N 个适配器中的 知识, 将预训练参数 Θ 和全部的 Adapter 参数 Φ 固定, 引入新的参数 Ψ,使用 N 个下游任务的数据集训练, 让 AdapterFusion 学习如何组合 N 个适配器解决特定任务。参数 Ψ 在每一层中包含 Key、Value 和 Query,如上图右 侧架构所示。在 Transformer 每一层中将前馈网络子层的输出作为 Query ,Value 和 Key 的输入是各自适配器的 输出, 将 Query 和 Key 做点积传入 SoftMax 函数中, 根据上下文学习对适配器进行加权。在给定的上下文中, AdapterFusion 学习经过训练的适配器的参数混合, 根据给定的输入识别和激活最有用的适配器。「作者通过将适 配器的训练分为知识提取和知识组合两部分, 解决了灾难性遗忘、任务间干扰和训练不稳定的问题。Adapter 模 块的添加也导致模型整体参数量的增加,降低了模型推理时的性能」。

AdapterDrop

大量预训练的 Transformer 模型的微调计算成本高, 推理速度慢, 并且具有大量存储要求。最近 的方法通过训练较小的模型、动态减小模型大小以及训练轻量级 Adapter 来解决这些缺点。提出的 AdapterDrop, 在训练和推理期间从较低的转换器层中移除适配器, 而且同时对多个任务执行推理时, AdapterDrop 可以动态减 少计算开销,任务性能的降低最小,下图是 Adapter Tuning 和 AdaterDrop 对比图。

Adapter Tuning 和 AdaterDrop 对比图, 右图第一个模型中每一层都包含 Adapter,而第二个模型中的 Adapter 在第一层中被丢弃了;右图中的箭头代表每个模型中前向和后向传递的信息流。

通过对 Adapter 的计算效率进行分析, 发现与全量微调相比, Adapter 在训练时快 60%,但是在推理时慢 4%- 6% 。AdapterDrop,在不影响任务性能的情况下, 对 Adapter 动态高效的移除, 尽可能的减少模型的参数量, 提 高模型在反向传播(训练)和正向传播(推理)时的效率。

为了加快推理速度, 在推理时可以对某几层的 adapter 进行剪枝。之前有研究表明, 靠近输入的 adapter 被剪 掉后对性能影响更小。因此, AdapterDrop 的作者提出, 推理时可以剪掉最下方 n 层的 adapter,也就是最靠近输 入的前 n 层。为了尽可能地减小性能损失,作者设计了两种训练方案:

  • 1 ) specialized AdapterDrop: 训练时固定 n ,训练后的模型推理时也固定剪掉前 n 层;

  • (2 ) robust AdapterDrop: 训练时每个 batch 都随机选取 n 的大小,训练后的模型可以适应多个 n 。由于原有 模型其他参数是不训练的,在训练时梯度就可以只回传到保留 adapter 的最早一层即可,如上图所示。

在 GLUE 的多个任务上, 两种训练方案的 AdapterDrop 可以做到推理时 n=5 以下性能损失都不太严重, 而 传统的 adapter 在 n>1 时性能下降就很快了。当去除掉五层的 adapter 时, 训练速度可以加快 26%,多任务同时 推理的速度可以加快 21%-42%,超过了原模型的推理速度。而且 AdapterDrop 对多任务同时进行推理时, 模型 可以生成多个任务的输出。

K-Adapter

2020 年提出的 K-Adapter 方法, 将 Adapter 应用在迁移学习领域, 解决新知识注入时, 历史知识被 冲走 (灾难性遗忘) 的问题。主要思想与 Adapter 类似, 固定预训练模型参数, 针对每一种新知识添加一个 Adapter 模块进行训练。将 Adapter 模块作为预训练模型的插件, 每个插件之间没有信息流传输, 这样可以有效的训练多 个 Adapter 模块,做到即插即用。避免了新的任务出现,需要对所有任务重新训练的问题。

K-Adapter 的内部结构图。

K-Adapter 的内部结构如上图所示, 一种知识可以用一个 adapter 模型来引入, 每个 Adapter 模型包含 K 个 adapter 层, 每个 adapter 层包含:N 个 Transformer 层, 2 个映射层, 并且在 2 个 projection 层之间加入 1 个残差连 接.

以上提到的 Adapter 系列可以快速迭代,灵活性好,节省计算资源等优点,但他们的设计架构存在一个显著劣势, 即添加了 Adapter 后, 模型整体的层数变深, 会增 加训练速度和推理速度,原因是:

  • 需要耗费额外的运算量在 Adapter 上;

  • 当采用并行训练时(例如 Transformer 架构常用的张量模型并行),Adapter 层会产生额外的通讯量, 增加通 讯时间.

ps: 欢迎扫码关注公众号^_^.

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值