预训练模型微调 | 一文带你了解Adapter Tuning

2022-12-05 21:46:56 浏览数 (2)

引言

 前几天的一篇文章,给大家介绍了预训练模型的微调方法Prompt Tuning。《一文了解预训练模型 Prompt 调优》。今天再给大家介绍另外一种主流的预训练模型微调方法Adapter,并将Adapter与Prompt两种方法做了对比,希望能对你的论文写作有启发。

Adapter Tuning

 随着计算机硬件性能的提高,预训练模型参数量越来越多,在训练下游任务时进行全模型微调变得昂贵且耗时,Adapter 的出现缓解了这个问题。Adapter在预训练模型每层中插入用于下游任务的参数,在微调时将模型主体冻结,仅训练特定于任务的参数,减少训练时算力开销。

Adapter模块设计方法

 2019年,Houlsby N等人将Adapter引入NLP领域,作为全模型微调的一种替代方案。Adapter主体架构下图所示。

 在预训练模型每一层(或某些层)中添加Adapter模块(如上图左侧结构所示),微调时冻结预训练模型主体,由Adapter模块学习特定下游任务的知识。每个Adapter模块由两个前馈子层组成,第一个前馈子层将Transformer块的输出作为输入,将原始输入维度d投影到m,通过控制m的大小来限制Adapter模块的参数量,通常情况下m<<d。在输出阶段,通过第二个前馈子层还原输入维度,将m重新投影到d,作为Adapter模块的输出(如上图右侧结构)。通过添加Adapter模块来产生一个易于扩展的下游模型,每当出现新的下游任务,通过添加Adapter模块来避免全模型微调与灾难性遗忘的问题。Adapter方法不需要微调预训练模型的全部参数,通过引入少量针对特定任务的参数,来存储有关该任务的知识,降低对模型微调的算力要求。

Adapter算法改进

 2020年,Pfeiffer J等人对Adapter进行改进,「提出AdapterFusion算法,用以实现多个Adapter模块间的最大化任务迁移」(其模型结构如下图所示)。

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模块的添加也导致模型整体参数量的增加,降低了模型推理时的性能」

 Adapter Fusion 在 Adapter 的基础上进行优化,通过将学习过程分为两阶段来提升下游任务表现。作者对全模型微调(Full)、Adapter、AdapterFusion三种方法在各个数据集上进行和对比实验。从表中数据中可以看出,AdapterFusion在大多数情况下性能优于全模型微调和Adapter,特别在MRPC(相似性和释义任务数据集)与RTE(识别文本蕴含数据集)中性能显著优于另外两种方法。

「AdapterDrop」: RückléA等人对Adapter的计算效率进行分析,发现与全模型微调相比适配器在训练时快60%,但是在推理时慢4%-6%,并提出了AdapterDrop方法缓解该问题。「AdapterDrop在不影响任务性能的情况下,对Adapter动态高效的移除,尽可能的减少模型的参数量,提高模型在反向传播(训练)和正向传播(推理)时的效率」。在删除了前五层的Adapter后,在对八个任务进行推理时,效率提高了39%。

「自适应机器翻译」:BapnaA等人「基于Adapter的思想在机器翻译领域提出了一种简单的自适应机器翻译方法」。首先在大型语料库中训练一个基础通用NMT(NeuralMachineTranslation;神经机器翻译)模型,作为预训练模型。在模型收敛后将模型主体部分进行冻结,保留在预训练阶段学习的通用知识。在每个Transformer层中为每种语言分别添加Adapter模块,在对应语料库中进行训练,调整Adapter参数,让其学习对应语言知识。与全模型微调相比,基于Adapter的机器翻译获得了更好的效果,并且无需对不同自适应数据集和模型容量进行调整。

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

Adapter在DL中的应用

「Adapter作为全模型微调的替代方法,已经广泛应用在域迁移、机器翻译、迁移学习和跨语言迁移等方面」。与之前昂贵的全模型微调方法相比,Adapter只需要一个较小的训练和存储代价就可以获得与全模型微调方法相近的结果。然而,基于Adapter的微调方法需要在预训练模型中添加针对下游任务的相关参数。虽然提高了模型的训练效率,但也会降低模型推理时的性能。将模型在实际应用中部署时,速度下降会非常明显。

Adapter VS Prompt

模型参数

 Adapter方法在模型中添加少量参数,在训练时将模型主体冻结,使Adapter块学习下游任务的知识,减少了训练时的参数量并达到了全模型微调的效果。与Adapter微调方法相比,「基于Prompt的微调是非侵入性的,无需附加大量参数」

应用场景

 在下游任务繁多的背景下,使用「Prompt可以解决为每个任务生成一个模型样本的问题」,是全模型微调的一种轻量化替代方案。但目前「Prompt的研究主要针对分类和生成两方面」,对于其它领域研究相对较少,对于模板与答案之间的关联也了解甚少。

存在的问题

 Prompt在自然语言处理领域大放异彩,取得的优异成绩足以证明其的有效性。Adapter和Prompt中连续模板的构造需要在预训练模型的基础上添加参数,并在训练过程中对参数进行优化。与全模型微调方法相比,虽然降低了训练成本,但是在模型中新添加了参数,会导致模型在推理过程中效率的降低,在实际中应用中这个缺点会被放大。「如何在少量添加模型参数甚至不添加的情况下将模型微调至较好的效果是未来的一个研究方向」

0 人点赞