大模型LLM-微调 Adapter Tuning

大模型的微调有很多方法,所谓微调是指将一个已经过大规模预训练的模型(如Transformer-based的语言模型)调整以适应特定任务的过程。以下是几种常见的微调方法,每种方法各有特点,适用于不同的场景和资源限制:

  1. 全微调(Full Fine-tuning)

  2. 描述:这是最直接的微调方式,涉及到模型的所有参数都会被更新。预训练模型在特定任务的数据集上进行额外训练,通常采用较小的学习率来避免破坏预训练学到的知识。

  3. 优点:能充分适应新任务,通常可以获得最佳性能。

  4. 缺点:需要较多计算资源和时间,且可能会导致过拟合,尤其是当目标任务数据集较小时。

  5. 微调顶层(Top-Layer Fine-tuning)

  6. 描述:仅对模型的顶层(通常是输出层或最后一层)进行微调,保持其他层不变。

  7. 优点:计算成本低,速度快,因为大部分参数保持不变。

  8. 缺点:性能提升可能有限,对于需要模型深层次理解的任务效果不佳。

  9. 冻结底层(Freezing Lower Layers)

  10. 描述:冻结模型的底层(通常是靠近输入的层),仅微调顶层或部分高层。

  11. 优点:可以保留模型的通用知识,减少过拟合风险。

  12. 缺点:对任务特性的适应性不如全微调。

  13. 逐层微调(Layer-wise Fine-tuning)

  14. 描述:从模型的顶层开始,逐步向下逐层进行微调,每一层在前一层微调后的基础上进行调整。

  15. 优点:可以更好地平衡预训练知识与特定任务需求。

  16. 缺点:复杂度较高,需要仔细设计微调策略。

  17. 高效参数微调(Efficient Parameter Fine-tuning)

  18. 描述:引入少量额外参数或修改现有参数的子集来适应新任务,如LoRA (Low-Rank Adaptation)、适配器调整(Adapter Tuning)、前缀调整(Prefix Tuning)等。

  19. 优点:显著减少计算和内存需求,同时仍能保持较好的性能。

  20. 缺点:可能不如全微调精确,需要更精细的调参。

  21. 监督式微调(Supervised Fine-Tuning, SFT)

  22. 描述:使用人工标注的数据集进行传统的监督学习微调。

  23. 优点:直观且直接,易于理解和实施。

  24. 缺点:依赖大量高质量标注数据,成本高且某些领域获取困难。

  25. 基于人类反馈的强化学习微调(Reinforcement Learning with Human Feedback, RLHF)

  26. 描述:通过人类评价者的反馈作为奖励信号,指导模型的微调过程,如OpenAI的InstructGPT。

  27. 优点:能够优化模型生成的内容,使其更符合人类偏好。

  28. 缺点:过程复杂,需要设计有效的反馈收集和强化学习机制。

  29. 对齐微调(Aligned Fine-tuning)

  30. 特别提及于text-davinci-003等模型,目的是使模型的输出更加有帮助、真实和无害。

  31. 优点:提高模型输出的质量和可靠性。

  32. 缺点:需要精心设计的微调目标和评估标准。

选择哪种微调方法取决于具体任务的需求、可用资源、时间限制以及对模型性能的期望。在实际应用中,经常需要实验比较不同方法的效果,以确定最适合的微调策略。本节我们将重点介绍Adapter Tuning微调。

Adapter Tuning

Adapter Tuning 是一种参数高效的迁移学习方法,它允许在预训练语言模型(PLM)的基础上,通过仅调整模型的一小部分参数来实现与全量参数微调相近的效果。这种方法最早在2019年提出,其核心思想是在Transformer模型的每个层中增加额外的参数,这些参数被称为Adapter 。

Adapter模块的设计是紧凑且可扩展的,它通过在多头注意力和前馈网络之后增加两个前馈子层来实现,这两个子层分别是降维和升维的前馈网络,通过控制中间维度的大小来限制参数量。AdapterTuning在训练时固定原始预训练模型的参数,只对新增的Adapter结构进行微调,从而提高了训练的效率 。

AdapterTuning的优势在于,它只需要为每个任务添加少量的可训练参数,并且可以为新任务添加新的Adapter模块而无需重新访问以前的任务,原始网络的参数保持固定。在GLUE基准测试中,AdapterTuning证明了其有效性,获得了与全量微调性能相近的结果,同时每个任务只添加了少量参数 。

此外,还有AdapterFusion和AdapterDrop等变体。AdapterFusion是一种两阶段学习算法,可以在不同任务下引入各自的Adapter模块,然后在第二阶段引入新参数来学习组合多个Adapter中的知识,以提高模型在目标任务中的表现 。而AdapterDrop则是为了提高推理速度,在推理时可以对某几层的Adapter进行剪枝

总的来说,AdapterTuning及其变体提供了一种有效的大模型微调方法,能够在保持参数效率的同时,实现对下游任务的良好适应性。

本文主要针对《Parameter-Efficient Transfer Learning for NL》进行介绍。

abstract 摘要

在自然语言处理(NLP)中,微调大型预训练模型是一种有效的迁移机制。然而,面对众多下游任务时,微调在参数上是不够高效的:每个任务都需要一个全新的模型。作为替代方案,我们提出了使用适配器模块(adapter modules)进行迁移。适配器模块提供了一个紧凑且可扩展的模型;它们每个任务只增加了少量可训练参数,而且可以无需重新审视先前的任务即可添加新任务。原始网络的参数保持固定,从而实现了高度的参数共享。为了证明适配器的有效性,我们将最近提出的BERT Transformer模型迁移到26个不同的文本分类任务上,包括GLUE基准测试。适配器达到了接近最先进性能的水平,同时每个任务只增加了少量参数。在GLUE上,我们实现了与完整微调性能相差仅0.4%的结果,但每个任务只增加了3.6%的参数。相比之下,微调每个任务训练了100%的参数。

1 Introduction

从预训练模型的迁移学习在许多自然语言处理(NLP)任务上产生了强大的性能(Dai & Le, 2015; Howard & Ruder, 2018; Radford et al., 2018)。BERT,一种在大量文本语料库上以无监督损失训练的Transformer网络,在文本分类和抽取式问答上达到了最先进的性能(Devlin et al., 2018)。

在本文中,我们解决的是在线设置问题,即任务以流的形式到达。我们的目标是构建一个系统,该系统能够在所有任务上表现良好,但不需要为每个新任务训练一个全新的模型。任务之间的高度共享对于云服务等应用特别有用,在这些应用中,模型需要按顺序训练以解决来自客户的许多任务。为此,我们提出了一种迁移学习策略,该策略产生紧凑且可扩展的下游模型。紧凑模型是指那些解决许多任务时每个任务只使用少量额外参数的模型。可扩展模型可以递增地训练以解决新任务,而不会忘记先前的任务。我们的方法在不牺牲性能的情况下产生了这样的模型

在自然语言处理(NLP)中,最常见的两种迁移学习技术是基于特征的迁移和微调。相反,我们提出了一种基于适配器模块(Rebuffi et al., 2017)的替代迁移方法。基于特征的迁移涉及预训练实值嵌入向量。这些嵌入可能在单词(Mikolov et al., 2013)、句子(Cer et al., 2019)或段落(Le & Mikolov, 2014)级别。然后,这些嵌入被输入到定制的下游模型中。微调涉及从预训练网络复制权重,并在下游任务上调整它们。最近的工作表明,微调通常比基于特征的迁移有更好的性能表现(Howard & Ruder, 2018)。

基于特征的迁移和微调都需要为每个任务准备一套新的权重。如果网络的较低层能够在不同任务间共享,微调在参数上会更加高效。然而,我们提出的适配器调整方法在参数上更为高效。图1展示了这种权衡。x轴显示了每个任务训练的参数数量;这对应于为解决每个额外任务所需的模型大小的边际增加。基于适配器的调整所需的训练参数数量比微调少两个数量级,同时却能达到类似的性能

适配器是添加在预训练网络层之间的新模块。基于适配器的调整与基于特征的迁移和微调有以下不同之处。考虑一个带有参数 w 的函数(神经网络):φw(x)。基于特征的迁移将 φw 与一个新的函数 χv 组合起来,得到 χv(φw(x))。然后,只有新的任务特定的参数 v 被训练。微调涉及为每个新任务调整原始参数 w,这限制了模型的紧凑性。对于适配器调整,定义了一个新的函数 ψw,v(x),其中参数 w 是从预训练复制过来的。初始参数 v0 被设置为使新函数类似于原始函数:ψw,v0(x) ≈ φw(x)。在训练期间,只有 v 被调整。对于深度网络,定义 ψw,v 通常涉及在原始网络 φw 中添加新层。如果选择 |v| ≪ |w|,结果模型在许多任务中需要 ∼ |w| 参数。由于 w 是固定的,该模型可以扩展到新任务,而不影响以前的任务。

总结一下上面的内容:

这段话详细解释了在机器学习领域,尤其是深度学习中,适配器方法与其他模型调整技术(如基于特征的迁移和微调)相比的不同之处。简化理解如下:

  1. 基于特征的迁移:这种方法涉及到将一个预训练好的模型(表示为函数φw(x),其中w是模型参数)的输出作为输入,传递给一个新的任务特定的函数χv,即χv(φw(x))。这里,只有新函数的参数v会被训练以适应新任务,而预训练模型的参数w保持不变。这样做可以利用预训练模型学到的通用特征,同时通过χv对这些特征进行特定任务的转换。

  2. 微调:微调是指在预训练模型的基础上,对整个模型的参数w进行进一步优化以适应新任务。这意味着包括原始预训练得到的参数在内的所有参数都会根据新任务的数据进行调整。这种方法虽然能够提升模型在特定任务上的性能,但可能会导致模型忘记原先学到的知识(即“灾难性遗忘”),并且模型的大小和计算需求可能显著增加,影响模型的紧凑性和泛化能力。

  3. 适配器调整:适配器方法则提供了一种更为灵活且高效的途径来适应新任务。它不是直接修改原始模型的参数w,而是在预训练模型内部或周围插入新的适配器模块(表示为函数ψw,v(x)),其中v是适配器的参数。这些适配器参数初始化时旨在让适配器函数的输出接近原始模型的输出(ψw,v0(x) ≈ φw(x)),确保新模型在未调整前大致保持原有性能。在训练过程中,仅适配器参数v被优化,而预训练的w参数保持固定。这样做的好处是,通过控制适配器参数的数量(|v|)远小于原始模型参数数量(|w|),可以在不显著增加模型复杂度的情况下适应多个任务,同时保持模型对之前任务知识的记忆,实现更好的任务间泛化。

总结来说,适配器方法是一种轻量级的微调策略,它通过添加少量可训练参数来适应新任务,既保留了大规模预训练模型的通用知识,又实现了模型在特定任务上的高效学习,同时保持了模型的紧凑性和对新任务的快速适应能力。

基于适配器的调整与多任务学习及持续学习相关。多任务学习同样能够产生紧凑的模型,其特点是同时对所有任务进行学习,而基于适配器的调整则无需这种同步访问所有任务的要求。持续学习系统旨在从不断涌现的任务流中持续学习。这一模式面临挑战,因为网络在重新训练后往往会遗忘先前的任务(参见McCloskey & Cohen, 1989; French, 1999的研究)。适配器方法有所不同,各个任务之间不相互影响,且共享的参数是固定的。这意味着模型能够利用少量的任务特定参数,完美地保留对先前任务的记忆,从而克服了遗忘问题

我们在一大型且多样化的文本分类任务集中展示了适配器在自然语言处理(NLP)中的高效参数调整能力。核心创新点在于设计了一个有效的适配器模块及其与基础模型的融合。我们提出了一种简单而高效的瓶颈架构。在GLUE基准测试上,我们的策略几乎达到了全模型微调BERT的性能水平,但仅使用了3%的任务特定参数,相比之下,传统的微调方法则需使用100%的任务特定参数。在另外17个公开的文本数据集以及SQuAD提取式问答任务上,我们观察到了相似的结果。总之,基于适配器的调整方法产生了一个单一、可扩展的模型,该模型在文本分类任务中几乎达到了最前沿的性能表现。

2 Adapter tuning for NLP

我们介绍了一种针对大型文本模型在多个下游任务上进行调优的策略。该策略具有三个关键特性:(i)能实现良好的性能表现,(ii)支持任务的顺序训练,即不需要同时访问所有数据集,以及(iii)每针对一个新任务仅需增加少量额外参数。这些特点在云服务环境中尤为有用,因为在云服务中,许多模型需要按序列对一系列下游任务进行训练,因此高度的资源共享是非常理想的。

为了实现这些特性,我们提出了一种新型的瓶颈适配器模块。使用适配器模块进行调优涉及向模型中添加少量新参数,并在下游任务上对这些参数进行训练(Rebuffi等人,2017年)。在对深度网络进行常规微调时,通常会修改网络的顶层,这是必要的,因为上游任务和下游任务的标签空间和损失函数可能不同。而适配器模块则执行更广泛的架构修改,以重新调整预训练网络以适应下游任务。具体来说,适配器调优策略包括在原始网络中插入新层。原始网络的权重保持不变,而新加入的适配器层则以随机方式初始化。在标准微调中,新顶层与原始权重会协同训练。相比之下,在适配器调优中,原始网络的参数被冻结,因此可以被多个任务共享。

总结一下上面的内容:

想象一下,你有一个强大的预训练模型,就像一个精通多种语言的大师(这就是我们的“原始网络”),现在你需要这位大师去完成两个新的专项任务:一个是识别古代文学作品的风格,另一个是分析现代新闻报道的情感倾向。

常规微调(Vanilla Fine-Tuning)

如果采用常规的微调方法,你会让这位大师重新学习,以便更专注于每一个新任务。这就意味着,无论是学习古代文学风格还是分析现代新闻情感,你都允许修改大师原本的知识结构(即网络的所有权重w)。这可能会让他在新任务上表现得更好,但同时也可能让他忘掉一些原本广泛而宝贵的语言理解能力,而且每次针对新任务都要调整全部的技能(权重),这既耗时又可能导致知识冲突。

适配器调优(Adapter-based Tuning)

相反,采用适配器调优的方法,你不会直接修改这位大师的核心技能(冻结原始网络权重),而是给他配备两位助手(适配器模块),每位助手专门学习如何将大师的通用语言理解能力转换为解决特定任务的能力。一位助手学习如何识别古代文学的风格特征,另一位则学习捕捉现代新闻中的情感线索。这些助手(适配器层)加在大师的技能链中,但他们携带的是非常轻便的工具包(少量任务特定参数v),与大师本身的庞大知识库相比微不足道(|v| ≪ |w|)。

实例说明

  • 对于古代文学风格识别,适配器可能是一个小型的神经网络层,它学习在大师提供的丰富语言理解基础上,提炼出特定历史时期文字表达的特点。

  • 对于现代新闻情感分析,另一个适配器层则专攻于理解现代语言的情绪色彩和上下文暗示,而不用关心它是否能理解莎士比亚的作品。

结果

通过这种方式,适配器调优不仅使得模型能够在多个任务上表现出色,而且保持了模型的紧凑性,因为大部分的通用知识(原始网络权重)是共享且不变的。此外,由于适配器模块独立于彼此,新任务的学习不会干扰旧任务的表现,这对于需要持续学习新技能而不能遗忘旧知识的场景(比如云服务环境)尤其重要。

适配器模块具有两大特性:少量参数和近似恒等初始化。相较于原始网络的层,适配器模块必须保持较小的规模。这意味着随着添加更多任务,模型的总体大小增长相对缓慢。为了适配模型的稳定训练,需要进行近似恒等初始化;我们在第3.6节中对此进行了实证研究。通过将适配器初始化为接近恒等函数的形式,可以确保在训练开始时原始网络不受影响。随着训练进行,适配器会被激活以改变网络中激活值的分布。如果不需要,适配器模块也可以被忽略;我们在第3.6节观察到,某些适配器对比其他适配器对网络有着更大的影响力。此外,我们也发现如果初始化远离恒等函数太多,模型可能无法成功训练

2.1 Instantiation for Transformer Networks

我们针对文本Transformer模型实现了基于适配器的调整方法。这些模型在众多自然语言处理(NLP)任务中达到了顶尖性能,涵盖翻译、抽取式问答及文本分类等问题(Vaswani等人,2017年;Radford等人,2018年;Devlin等人,2018年)。我们采用了Vaswani等人(2017年)提出的标准Transformer架构作为基础。

适配器模块提供了许多架构选择。我们提供了一个简单的设计,该设计能够实现良好的性能。我们尝试了一些更复杂的设计,详见第3.6节,但我们发现以下策略在我们测试的多个数据集中表现与其他任何策略一样好。

图2展示了我们的适配器架构及其在Transformer中的应用。Transformer的每一层包含两个主要的子层:一个注意力层和一个前馈层。这两个层之后紧跟着一个投影层,该投影层将特征大小映射回该层输入的大小。每个子层都应用了跳跃连接(skip-connection)。每个子层的输出都进入层归一化(layer normalization)处理。

我们在每个子层之后插入两个串联的适配器。适配器总是直接应用于子层的输出,即在投影回输入大小之后,但在将跳跃连接加回之前。适配器的输出随后直接传递给下一层的归一化处理。

为了限制参数数量,我们提出了一个瓶颈架构。适配器首先将原始的d维特征投影到一个更低的维度m,施加非线性变换,然后再投影回d维。每层增加的总参数数量,包括偏置项,为2md + d + m。通过设置m远小于d,我们可以限制每个任务新增的参数数量;实际上,我们使用的适配器参数约为原始模型参数的0.5%至8%。瓶颈维度m提供了一个简便的方式,以便在性能与参数效率之间进行权衡。适配器模块内部包含一个跳接连接。有了跳接连接,如果投影层的参数初始化接近于零,那么该模块就被初始化为一个近似的恒等函数。

除了适配器模块中的层之外,我们还会为每个任务训练新的层归一化参数。这种技术类似于条件批次归一化(De Vries等人,2017)、FiLM(Perez等人,2018年)和自我调节(Chen等人,2019年),同样实现了网络的高效参数适应性;每层只需2d个参数。然而,仅训练层归一化参数不足以达到良好的性能表现

详细解释下上面的内容:

figure2 展示了适配器模块的架构及其与Transformer模型的整合。左边部分显示了我们将适配器模块添加到每个Transformer层两次:一次在多头注意力后的投影之后,一次在两个前馈层之后。右边部分展示了适配器由一个包含少量参数的瓶颈组成相比于原模型中的注意力层和前馈层。适配器也包含了跳接连接。在适配器调整过程中,绿色标注的层会在下游数据上进行训练,这包括适配器本身、层归一化参数,以及最终的分类层(图中未展示)。以下是对Figure 2内容的详细介绍:

  1. Transformer Layer 结构

  2. 每个Transformer层由两个主要的子层构成:注意力层(Attention Layer)和前馈层(Feed-forward Layer)。

  3. 注意力层负责处理输入序列,通过计算不同单词之间的关联性来增强模型对上下文的理解。

  4. 前馈层则对每个注意力头的输出进行进一步的非线性变换。

  5. 投影层(Projection Layers)

  6. 在每个子层之后,紧跟着一个投影层,这个投影层将特征的维度映射回该层输入的维度。这有助于控制模型的参数量,同时保持信息的流动。

  7. 跳跃连接(Skip Connections)

  8. 在每个子层的输出和对应的投影层之间,应用了跳跃连接。这种连接方式允许子层的输出直接传递到下一层,增强了模型的学习能力。

  9. 层归一化(Layer Normalization)

  10. 每个子层的输出在进入跳跃连接之前,会经过层归一化处理。这有助于稳定训练过程,加快收敛速度,并提高模型的泛化能力。

  11. 适配器模块的插入

  12. 在每个子层的输出之后,即在投影层和跳跃连接之间,插入了两个串联的适配器模块。这些适配器模块是新增加的组件,用于调整模型以适应特定的下游任务。

  13. 适配器模块直接应用于子层的输出,即在将输出投影回输入尺寸之后,但在将跳跃连接加回之前。

  14. 适配器模块的结构

  15. 适配器模块通常包含一个瓶颈结构(Bottleneck),其中首先将高维特征投影到一个低维空间,然后通过一个非线性层,最后再将特征投影回原始的高维空间。

  16. 这种设计限制了适配器模块的参数量,使得模型在增加新任务时,参数的增加量保持在较低水平。

  17. 适配器模块的初始化

  18. 适配器模块的参数在初始化时通常接近于零,这样它们在训练开始时对模型的影响很小,从而保证了训练的稳定性。

通过这种设计,适配器模块能够在不大幅改变原始模型结构和参数的情况下,为模型提供调整以适应新任务的能力。这种参数高效的调整方法使得模型在处理多个任务时更为灵活和高效。

3 Experiments

我们证明了适配器在文本任务中实现了参数高效的迁移。在GLUE基准测试(Wang等人,2018年)中,适配器调整与BERT的完整微调相差不到0.4%,但它仅增加了微调训练参数数量的3%。我们在另外17个公共分类任务和SQuAD问答中确认了这一结果。分析表明,基于适配器的调整自动集中在网络的更高层。

3.1 Experimental Settings

我们使用公开的、预训练的BERT Transformer网络作为我们的基线模型。为了使用BERT进行分类,我们遵循了Devlin等人(2018年)的方法。每个序列中的第一个标记是一个特殊的“classification token”。我们在这个标记的嵌入上附加了一个线性层,以预测类别标签。

我们的训练过程也遵循了Devlin等人(2018年)的方法。我们使用Adam优化器(Kingma & Ba, 2014),其学习率在前10%的步骤中线性增加,然后线性衰减至零。所有的运行都在4个Google Cloud TPUs上进行,每批大小为32。对于每个数据集和算法,我们进行超参数扫描,并根据验证集上的准确性选择最佳模型。对于GLUE任务,我们报告提交网站提供的测试指标。对于其他分类任务,我们报告测试集的准确率。

我们与微调进行比较,微调是目前大型预训练模型迁移的标准,也是BERT成功使用的一种策略。对于N个任务,完整的微调需要N倍于预训练模型参数的数量。我们的目标是在保持与微调相等的性能的同时,使用更少的总参数,理想情况下接近1倍。

3.2 GLUE benchmark

我们首先在GLUE基准测试上进行评估。对于这些数据集,我们从预训练的BERT-LARGE模型迁移,该模型包含24层,总共有3.3亿个参数,详情见Devlin等人(2018年)。我们为适配器调整进行了一个小规模的超参数扫描:我们在{3 × 10^-5, 3 × 10^-4, 3 × 10^-3}中扫描学习率,and number of epochs in {3, 20}。我们测试了使用固定适配器大小(瓶颈中的单元数)和从{8, 64, 256}中为每个任务选择最佳大小。适配器大小是我们调整的唯一特定于适配器的超参数。最后,由于训练的不稳定性,我们使用不同的随机种子重新运行5次,并在验证集上选择最佳模型

表1总结了结果。适配器达到了平均80.0的GLUE得分,而完全微调达到的得分为80.4。最优的适配器大小因数据集而异。例如,MNLI选择了256,而对于最小的数据集RTE,选择了8。始终限制为64大小,平均准确率会略有下降至79.6。要解决表1中的所有数据集,微调需要9倍于BERT总参数的数量。相比之下,适配器仅需要1.3倍的参数。

3.3 Additional Classification Tasks

为了进一步验证适配器能够产生紧凑且高效的模型,我们在其他公开可用的文本分类任务上进行了测试。这套测试包含了一系列多样化的任务:训练样本的数量从900到330,000不等,类别的数量从2到157不等,平均文本长度从57到1.9k字符不等。

我们测试了适配器大小在{2, 4, 8, 16, 32, 64}中的不同选项。由于一些数据集规模较小,对整个网络进行微调可能不是最优选择。因此,我们运行了一个额外的基线:可变微调。在这种情况下,我们只微调顶部的n层,并冻结其余部分。我们扫描n ∈ {1, 2, 3, 5, 7, 9, 11, 12}。在这些实验中,我们使用的是具有12层的BERTBASE模型,因此当n = 12时,可变微调涵盖了完全微调。

与GLUE任务不同,这组任务没有全面的最先进数字集合。因此,为了确认我们基于BERT的模型具有竞争力,我们收集了自己的基准性能数据。为此,我们对标准网络拓扑进行了大规模的超参数搜索。具体来说,我们运行了类似于Zoph & Le (2017)和Wong et al. (2018)的单任务神经自动机器学习(Neural AutoML)算法。这个算法在公开可用的TensorFlow Hub文本嵌入模块上搜索前馈和卷积网络,这些模块可以堆叠在预训练的文本嵌入上。来自TensorFlow Hub模块的嵌入可以被冻结或微调。完整的搜索空间在附录中描述。对于每个任务,我们在CPU上运行AutoML一周,使用30台机器。在这段时间内,算法平均每个任务探索超过10,000个模型。我们根据验证集的准确性选择每个任务的最佳最终模型。

表2报告了自动机器学习(AutoML)基准测试(“无BERT基线”)、微调、可变微调和适配器调整的结果。AutoML基线表明BERT模型具有竞争力。这个基线探索了数千种模型,但BERT模型平均表现更好。我们看到了与GLUE类似的结果模式。适配器调整的性能接近完全微调(落后0.4%)。为了解决所有任务,微调需要BERTBASE参数数量的17倍。可变微调的表现略优于微调,同时训练的层数更少。可变微调的最佳设置平均每个任务训练网络的52%,将总数减少到9.9倍参数。然而,适配器提供了一个更紧凑的模型。它们每个任务引入1.14%的新参数,结果使得所有17个任务的参数总数为1.19倍。

3.4 Parameter/Performance trade-off

适配器的大小控制着参数效率,更小的适配器引入的参数更少,但可能会以牺牲性能为代价。为了探索这种权衡,我们考虑了不同的适配器大小,并与两个基线进行了比较:(i) 仅微调BERTBASE模型的顶部k层。(ii) 仅调整层归一化参数。学习率是使用第3.2节中呈现的范围进行调整的。

图3展示了在每组分类任务中(GLUE和“其他”)参数/性能权衡的汇总情况。在GLUE任务中,当微调的层数减少时,性能显著下降。一些额外的任务从训练较少层数中受益,因此微调的性能下降幅度较小。在这两种情况下,适配器在参数数量比微调少两个数量级的情况下,仍然能够提供良好的性能。

以下是对 Figure 3 内容的详细介绍:

  1. 参数/性能权衡

  2. 图表展示了模型在不同参数训练数量下的性能变化。这是通过比较不同数量的训练参数与模型在任务上的性能(如准确率)之间的关系来实现的。

  3. 适配器调整(Adapter Tuning)

  4. 适配器调整方法在图中用橙色线条表示。这种方法通过在预训练模型中添加少量的新参数(适配器)来调整模型,使其适应新的下游任务。

  5. 适配器的大小(即参数数量)可以从很小(例如2%的原始模型参数)到较大(例如5%的原始模型参数)不等。

  6. 微调(Fine-tuning)

  7. 微调方法在图中用蓝色线条表示。这种方法涉及对预训练模型的顶层进行微调,图中展示了从微调顶层1层到顶层12层的不同设置。

  8. 微调的参数数量随着微调层数的增加而增加,这直接影响了模型的性能。

  9. 性能比较

  10. 图表中的线条和阴影区域表示在不同任务上的20th、50th和80th百分位数性能。这提供了一个统计视角,展示了在不同参数数量下,模型性能的变化范围。

  11. 适配器调整在参数数量远少于全量微调的情况下,仍能接近全量微调的性能。这显示了适配器调整在参数效率上的优势。

  12. 特定任务的详细分析

  13. 图表还特别展示了两个GLUE基准任务(MNLI-m和CoLA)的详细数据。这些数据点显示了在不同参数数量下,适配器调整和微调的性能对比。

  14. 例如,在MNLI-m任务中,适配器调整在训练约2M参数时,可以达到83.7%的验证准确率,而全量微调则可以达到84.4%。

  15. 结论

  16. Figure 3 强调了适配器调整在保持高性能的同时,显著减少了所需的训练参数数量。这使得适配器调整成为一种非常有效的迁移学习策略,特别适合于需要处理多个任务且资源有限的情况。

总的来说,Figure 3 通过可视化的方式展示了适配器调整相对于传统微调方法在参数效率和模型性能方面的优势。

图4为两个GLUE任务(MNLI-m和CoLA)提供了更多细节。微调顶部层数时,对于所有k > 2的情况,会训练更多的任务特定参数。当使用与适配器相同数量的任务特定参数进行微调时,性能显著下降,与适配器相比。例如,在MNLI-m任务中,仅微调顶层大约会产生900万个可训练参数和77.8% ± 0.1%的验证准确率。相比之下,大小为64的适配器调整大约会产生200万个可训练参数和83.7% ± 0.1%的验证准确率。作为比较,完全微调在MNLI-m上达到了84.4% ± 0.02%的准确率。我们在CoLA任务中观察到了类似的趋势

作为进一步的比较,我们仅调整了层归一化(Layer Normalization)的参数。这些层只包含逐点加法和乘法,因此引入的可训练参数非常少:对于BERTBASE模型只有40,000个。然而,这种策略表现不佳:在CoLA任务上性能下降了大约3.5%,在MNLI任务上性能下降了4%。

总结来说,适配器调整在参数效率上非常高,并且能够产生一个紧凑的模型,其性能强大,与全量微调相当。使用大小为原始模型的0.5%至5%的适配器进行训练,其性能与BERTLARGE模型上发表的竞争性结果相差不到1%。

3.5 SQuAD Extractive Question Answering

最后,我们通过在SQuAD v1.1(Rajpurkar等人,2018)上运行来确认适配器不仅在分类任务上有效。这项任务要求从维基百科段落中选取问题的答案段落。图5展示了在SQuAD验证集上微调和适配器的参数/性能权衡。对于微调,我们遍历了训练层数、学习率({3×10⁻⁵, 5×10⁻⁵, 1×10⁻⁴})和训练周期数({2, 3, 5})。对于适配器,我们遍历了适配器大小、学习率({3×10⁻⁵, 1×10⁻⁴, 3×10⁻⁴, 1×10⁻³})和训练周期数({3, 10, 20})。与分类任务一样,适配器在训练更少参数的情况下达到了与全量微调相当的性能。适配器大小为64(占2%参数)的最佳F1得分为90.4%,而全量微调的得分为90.7%。即使是非常小的适配器,如大小为2(占0.1%参数)的适配器,也能在SQuAD上取得89.9的F1得分,表现良好。

3.6 Analysis and Discussion

我们进行了消融实验以确定哪些适配器是有影响力的。为此,我们移除了一些训练过的适配器,并在不重新训练的情况下在验证集上重新评估模型。图6显示了从所有连续层跨度中移除适配器时性能的变化。该实验在BERTBASE模型上进行,适配器大小为64,在MNLI和CoLA数据集上执行。

首先,我们观察到移除任何单层的适配器对性能的影响很小。热图中对角线上的元素显示了从单层移除适配器的性能表现,其中最大的性能下降是2%。相比之下,当从网络中移除所有适配器时,性能显著下降:在MNLI上下降到37%,在CoLA上下降到69%——这些是通过预测多数类所达到的分数。这表明,尽管每个适配器对整个网络的影响很小,但总体效果是显著的

其次,图6表明,较低层的适配器对性能的影响小于较高层的适配器。在MNLI数据集上,从0到4层移除适配器几乎不影响性能。这表明适配器之所以表现良好,是因为它们自动优先考虑较高层。实际上,专注于上层是一种流行的微调策略(Howard & Ruder, 2018)。一个直观的理解是,较低层提取在不同任务中共享的低级特征,而较高层构建特定于不同任务的特征。这与我们的观察结果相关,即对于一些任务,仅微调顶层比完全微调表现更好,见表2

接下来,我们研究了适配器模块对神经元数量和初始化尺度的鲁棒性。在我们的主要实验中,适配器模块的权重是从均值为零的高斯分布中抽取的,标准差为[10{-2}],并截断到两个标准差。为了分析初始化尺度对性能的影响,我们测试了标准差在[10{-7}, 1]区间内的变化。图6总结了结果。我们观察到在两个数据集上,当标准差小于[10^{-2}]时,适配器的性能是鲁棒的。然而,当初始化过大时,性能会下降,在CoLA数据集上下降更为显著

为了研究适配器对神经元数量的鲁棒性,我们重新检查了第3.2节的实验数据。我们发现,不同适配器大小的模型质量是稳定的,所有任务都可以使用固定的适配器大小,对性能的影响很小。对于每种适配器大小,我们通过选择最优的学习率和训练周期数来计算八个分类任务的平均验证准确率。对于适配器大小为8、64和256,平均验证准确率分别为86.2%、85.8%和85.7%。这一信息进一步得到了图4和图5的证实,这些图表显示了几个数量级上的稳定性能。

最后,我们尝试了对适配器架构的一些扩展,但这些扩展并没有显著提高性能。为了完整性,我们在这里记录了这些尝试。我们试验了:(i) 在适配器中添加批处理/层归一化,(ii) 增加每个适配器的层数,(iii) 不同的激活函数,如tanh,(iv) 仅在注意力层内插入适配器,(v) 将适配器与主层并行添加,并可能进行乘法交互。在所有情况下,我们观察到的性能与第2.1节提出的瓶颈相似。因此,由于其简单性和强大的性能,我们推荐原始的适配器架构

4 Related Work

Pre-trained text representations 预训练的文本表示在提高自然语言处理(NLP)任务性能方面被广泛使用。这些表示通常在大型语料库上进行无监督训练,并将它们作为特征输入到下游模型中。在深度网络中,这些特征也可能在下游任务上进行微调。基于分布式信息训练的Brown聚类是预训练表示的经典例子(Brown等人,1992年)。Turian等人(2010年)表明,预训练的词嵌入优于从头开始训练的嵌入。自从深度学习变得流行以来,词嵌入已被广泛使用,并出现了许多训练策略(Mikolov等人,2013年;Pennington等人,2014年;Bojanowski等人,2017年)。长文本、句子和段落的嵌入也已被开发出来(Le & Mikolov,2014年;Kiros等人,2015年;Conneau等人,2017年;Cer等人,2019年)

为了在这些表示中编码上下文,特征是从序列模型的内部表示中提取的,比如机器翻译(MT)系统(McCann等人,2017年)和用于ELMo的双向长短期记忆(BiLSTM)语言模型(Peters等人,2018年)。与适配器一样,ELMo利用了预训练网络中除顶层之外的层。然而,这种策略仅从内部层读取信息。相比之下,适配器则向内部层写入信息,重新配置整个网络中特征的处理方式

Fine-tuning 微调整个预训练模型已成为一种流行的替代特征的方法(Dai & Le, 2015; Howard & Ruder, 2018; Radford et al., 2018)。在自然语言处理(NLP)中,上游模型通常是神经语言模型(Bengio et al., 2003)。最近在问答(Rajpurkar et al., 2016)和文本分类(Wang et al., 2018)方面取得的最先进结果,是通过微调一个Transformer网络(Vaswani et al., 2017),并使用掩码语言模型损失(Masked Language Model loss,Devlin et al., 2018)来实现的。除了性能之外,微调的一个优点是它不需要特定于任务的模型设计,这与基于表示的迁移不同。然而,传统的微调确实需要为每个新任务准备一组新的网络权重

Multi-task Learning 多任务学习(MTL)涉及同时对多个任务进行训练。早期的工作表明,跨任务共享网络参数可以利用任务之间的规律性,从而提高性能(Caruana, 1997)。在这种方法中,网络的较低层会共享权重,而较高层则使用专门的权重。许多自然语言处理(NLP)系统已经利用了多任务学习。一些例子包括:文本处理系统(词性标注、分块、命名实体识别等)(Collobert & Weston, 2008)、多语言模型(Huang et al., 2013)、语义解析(Peng et al., 2017)、机器翻译(Johnson et al., 2017)以及问答系统(Choi et al., 2017)。多任务学习能够产生一个单一的模型来解决所有问题。然而,与我们的适配器不同,多任务学习在训练期间需要同时访问所有任务。

Continual Learning 作为同时训练的替代方案,持续学习或终身学习的目标是从一系列任务中学习(Thrun, 1998)。然而,在重新训练时,深度网络往往会忘记如何执行先前的任务;这一挑战被称为灾难性遗忘(catastrophic forgetting)(McCloskey & Cohen, 1989; French, 1999)。已经提出了一些技术来减轻遗忘(Kirkpatrick et al., 2017; Zenke et al., 2017),然而,与适配器不同,记忆是不完美的。渐进式网络通过为每个任务实例化一个新的网络“列”来避免遗忘(Progressive Networks)(Rusu et al., 2016)。然而,参数数量会随着任务数量的增加而线性增长。由于适配器非常小,我们的模型在扩展性方面要有利得多。

Transfer Learning in Vision 在构建图像识别模型时,普遍采用在ImageNet(Deng等人,2009年)上预训练的模型进行微调(Yosinski等人,2014年;Huh等人,2016年)。这种技术在许多视觉任务上达到了最先进的性能,包括分类(Kornblith等人,2018年)、细粒度分类(Hermans等人,2017年)、分割(Long等人,2015年)和检测(Girshick等人,2014年)。在视觉领域,已经研究了卷积适配器模块(Rebuffi等人,2017年;2018年;Rosenfeld & Tsotsos,2018年)。这些研究通过向ResNet(He等人,2016年)或VGG网络(Simonyan & Zisserman,2014年)添加小型卷积层来实现在多个领域的增量学习。适配器的大小通过使用1×1卷积来限制,而原始网络通常使用3×3卷积。这使得每个任务的模型总体大小增加了11%。由于卷积核大小无法进一步减小,因此必须使用其他权重压缩技术来实现更大的节省。我们的瓶颈适配器可以更小,但仍然表现良好

并行的研究工作探索了与BERT相关的类似概念(Stickland & Murray, 2019)。作者引入了“Projected Attention Layers”(PALs),这是一些小的层,其作用与我们的适配器(adapters)相似。主要的区别在于:i) Stickland和Murray(2019)使用了不同的架构,ii) 他们执行的是多任务训练,同时在所有GLUE任务上对BERT进行微调。

Sina Semnani(2019)在SQuAD v2.0(Rajpurkar等人,2018)数据集上进行了我们瓶颈适配器(bottleneck Adapters)与PALs的实证比较研究。

这里,“Projected Attention Layers”是一种旨在减少计算成本的结构,而“adapters”则是另一种用于模型压缩和快速适应新任务的技术。GLUE是一个自然语言理解的评估基准,包含了多个不同的任务,用于测试模型的泛化能力。SQuAD(Stanford Question Answering Dataset)v2.0是一个阅读理解数据集,包含了问题-段落对,要求模型能够从给定的段落中找到正确答案,甚至当段落中没有明确答案时能够识别出“无法回答”。

5 Adapter Tuning 解疑

  • Adapter Tuning 优势、劣势?

优势:

  1. 参数效率

  2. Adapter Tuning只需要在预训练模型的每一层后添加一对小型的线性层,这大大减少了需要训练的参数数量。相比于完全微调整个模型,这种方法显著降低了存储和计算成本。

  3. 快速适应

  4. 由于需要调整的参数较少,Adapter Tuning可以在较短的时间内完成,这意味着模型可以更快地适应新任务,这对于资源有限或时间敏感的应用场景非常有利。

  5. 多任务学习

  6. Adapters可以独立于主模型进行训练,允许在不干扰预训练权重的情况下进行多任务学习或多领域适应。这使得模型能够在多个任务上表现良好,而不会发生灾难性的遗忘。

  7. 可扩展性

  8. 对于大型预训练模型,如GPT-3或BERT的更大版本,Adapter Tuning的低开销特性使其成为更可行的微调方法,尤其是在有限的数据集上。

  9. 模块化

  10. Adapters是可插拔的,这意味着它们可以根据需要添加或移除,为模型提供了额外的灵活性,便于实验和迭代。

劣势:

  1. 性能限制

  2. 虽然Adapter Tuning在很多情况下都能达到相当不错的性能,但在某些任务上,完全微调模型可能仍然会提供更好的结果。这是因为adapters虽然能快速适应,但可能无法充分利用预训练模型的所有潜在能力。

  3. 额外的架构复杂性

  4. 在模型中加入adapters增加了架构的复杂性,这可能使得理解和调试模型变得更加困难。

  5. 潜在的过拟合风险

  6. 尽管adapters的参数数量较少,但如果训练数据有限,adapters仍然可能会过拟合。这可能需要额外的正则化技术来控制。

  7. 优化挑战

  8. 由于adapters与主模型的交互,它们的训练可能需要特定的优化策略,比如学习率调度或初始化策略,这可能比简单微调整个模型更加复杂。

  9. 部署考虑

  10. 在实际部署中,如果模型需要在多个任务上运行,每个任务都需要一组特定的adapters,这可能增加模型管理的复杂度。

总体而言,Adapter Tuning提供了一种在保持大部分预训练模型不变的同时,针对特定任务进行有效微调的方法,适用于资源受限或需要快速适应新任务的场景。然而,它也可能带来一些性能和部署方面的挑战。

  • Adapter Tuning 为什么能起到微调的作用?

Adapter Tuning 能够起到微调的作用,主要是因为它巧妙地结合了预训练模型的强大表示能力和针对具体任务的定制化学习。以下是Adapter Tuning如何实现这一点的几个关键点:

  1. 保留预训练权重

  2. Adapter Tuning的核心思想是在预训练模型的基础上添加额外的小型神经网络模块,称为“adapters”。在微调阶段,预训练模型的大部分权重保持固定,这样可以避免破坏在大规模无监督数据上学到的通用特征表示。

  3. 任务特定的参数

  4. Adapters包含少量可训练的参数,这些参数是专门为适应新任务而设计的。它们位于预训练模型的每一层之后,允许对特定任务的输入进行转换和调整,从而在保持原有特征不变的情况下,学习任务特定的表示。

  5. 高效的参数更新

  6. 由于只有adapters中的参数被更新,而不是整个模型,这意味着计算和存储成本大大降低。这是相对于全模型微调的一个显著优势,后者需要更新模型中的所有参数。

  7. 隔离任务知识

  8. 每个任务可以拥有自己的一组adapters,这意味着模型可以为不同的任务学习不同的表示,而不会发生任务间知识的干扰。这使得多任务学习变得更为可行,同时也避免了灾难性遗忘的问题。

  9. 可插拔的设计

  10. Adapters的结构通常是简单的线性层或MLP(多层感知机),它们可以很容易地插入到预训练模型的架构中,而不会改变原始模型的基本结构。这种设计使得adapters在不同任务之间高度可移植。

  11. 灵活的微调策略

  12. Adapters可以单独训练,也可以与模型的某些层一起训练,这取决于任务的需求和可用的计算资源。这种灵活性允许研究人员根据具体情况进行调整,以达到最佳的性能和效率平衡。

通过以上机制,Adapter Tuning不仅能够在资源受限的环境下有效地对预训练模型进行微调,还能确保模型能够迅速适应新的任务,同时保留其在预训练阶段学到的广泛知识。

读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用

对于0基础小白入门:

如果你是零基础小白,想快速入门大模型是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

包括:大模型学习线路汇总、学习阶段,大模型实战案例,大模型学习视频,人工智能、机器学习、大模型书籍PDF。带你从零基础系统性的学好大模型!

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

👉AI大模型学习路线汇总👈

大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉大模型实战案例👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉大模型视频和PDF合集👈

观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉获取方式:

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

  • 16
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值