人工智能咨询培训老师叶梓 转载标明出处
迁移学习技术,尤其是针对大型预训练模型的微调(fine-tuning),在诸多下游任务中展现出了卓越的性能。然而,当面临众多任务时,传统的微调方法存在参数效率低下的问题,因为它需要为每个新任务训练一个全新的模型。为了解决这一问题,本文提出了一种使用适配器模块(Adapter Modules)进行迁移学习的新方法,该方法由Neil Houlsby、Andrei Giurgiu、Stanisław Jastrzebski等研究者共同提出。
论文链接:https://arxiv.org/pdf/1902.00751
代码地址:GitHub - google-research/adapter-bert
图 1: 展示了适配器调整(Adapter tuning)和微调(Fine-tuning)在训练特定任务参数数量和准确率之间的权衡。图中的y轴以全参数微调的性能为基准进行了归一化,x轴表示每个任务训练的参数数量。显示了在GLUE基准的九个任务上,适配器调整能够以更少的参数数量达到与全参数微调相似的性能。
方法
适配器调整(Adapter Tuning)策略主要针对大型文本模型在多个下游任务上的调整,具有三个关键特性:良好的性能表现、支持任务顺序训练、以及每个任务只增加少量额外参数。这些特性在云计算服务中尤为重要,因为云服务常常需要在一系列下游任务上训练多个模型,而高度的参数共享是理想的状态。
为了实现这些特性,研究者提出了一种新的瓶颈适配器模块(bottleneck adapter module)。与传统的深度网络微调不同,适配器调整策略通过在原始网络中注入新的层来实现,这些新层被称为适配器层。在适配器调整过程中,原始网络的权重保持不变,而新的适配器层则随机初始化。这种设计允许原始网络的参数在多个任务中共享,从而提高了参数效率。
适配器模块的两大特点:
- 参数数量少:适配器模块相比于原始网络的层要小得多,这意味着当添加更多任务时,模型大小的增长相对较慢。
- 近恒等初始化:为了模型训练的稳定性,适配器模块需要进行近恒等初始化。初始化时,适配器对原始网络的影响很小,但在训练过程中可以激活适配器来改变网络中激活的分布。
Transformer网络因其在多种NLP任务中的优异表现而受到青睐。适配器模块被设计为可以插入到Transformer的每个层中。具体来说,每个Transformer层包含两个主要的子层:注意力层(attention layer)和前馈层(feed-forward layer)。在这两层之后,会立即进行一个投影,将特征尺寸映射回该层输入的大小。每个子层的输出会进入层归一化(Layer Norm)。
在每个子层之后,研究者插入了两个串联的适配器。适配器直接应用于子层的输出,在将尺寸投影回输入大小之后,但在将跳过连接(skip connection)加回来之前。适配器的输出随后直接进入下一层归一化。为了限制参数数量,适配器采用了瓶颈架构,首先将原始的d维特征投影到更小的维度m,应用非线性激活,然后再投影回d维。每层增加的总参数数量(包括偏置)是2md+d+m。通过设置m≪d,限制了每个任务增加的参数数量;实际操作中使用的参数数量大约是原始模型的0.5-8%。
图2展示了适配器的架构以及其与Transformer的集成方式。适配器模块被添加到每个Transformer层的两个位置:多头注意力(multi-headed attention)后的投影和两个前馈层之后。适配器由一个瓶颈组成,其参数数量相对于原始模型中的注意力层和前馈层要少得多。适配器还包含一个跳过连接。在适配器调整期间,绿色层(包括适配器、层归一化参数和最终分类层)是在下游数据上训练的。
瓶颈维度m 在适配器模块的设计中扮演着至关重要的角色。它为研究者提供了一个权衡性能和参数效率的简单工具。通过调整 m 的值,可以控制每个任务增加的参数数量,从而在保持模型性能的同时减少参数的增加。这种设计使得适配器模块在引入新任务时,对原始模型的改动保持在最低限度,从而有效控制了模型复杂度的增长。
适配器模块内部的跳过连接(skip-connection)是另一个关键设计。这种连接允许模型在处理信息时绕过适配器模块,维持了一定程度的原始网络特性。当适配器的投影层参数初始化接近零时,整个适配器模块初始化为一个近似的恒等函数,这意味着在训练开始时,适配器模块对网络的影响很小。随着训练的进行,适配器模块可以根据任务需求逐渐调整其参数,以优化模型性能。
除了适配器模块本身,研究者还为每个任务训练了新的层归一化参数。层归一化是一种有效的技术,可以稳定和加速神经网络的训练过程。在适配器模块的上下文中,层归一化参数的引入,类似于条件批量归一化(Conditional Batch Normalization)、FiLM和自调制(Self-modulation)等技术,进一步增强了模型对新任务的适应能力。通过这种方式,每层只需要增加 2d 个参数,就能实现有效的特征归一化和模型性能提升。
尽管层归一化参数的引入提高了模型的适应性,但仅依靠这些参数并不足以保证模型在所有任务上都能取得良好的性能(在后面的实验验证了这一点)。尽管层归一化参数有助于模型的调整,但如果不结合适配器模块中的其他参数进行联合训练,模型的整体性能将受到影响。这说明了适配器模块中各部分参数的协同作用对于实现高性能的迁移学习至关重要。
想要掌握如何将大模型的力量发挥到极致吗?叶老师带您深入了解 Llama Factory —— 一款革命性的大模型微调工具。9月22日晚,实战专家1小时讲解让您轻松上手,学习如何使用 Llama Factory 微调模型。
加助理微信提供直播链接:amliy007,29.9元即可参加线上直播分享,叶老师亲自指导,互动沟通,全面掌握Llama Factory,关注享粉丝福利,限时免费CSDN听直播后的录播讲解。
LLaMA Factory 支持多种预训练模型和微调算法。它提供灵活的运算精度和优化算法选择,以及丰富的实验监控工具。开源特性和社区支持使其易于使用,适合各类用户快速提升模型性能。
实验
研究者们使用了公开的预训练BERT Transformer网络作为基础模型。在进行分类任务时,遵循了Devlin等人(2018)的方法,将每个序列中的第一个标记作为一个特殊的“分类标记”,并在该标记的嵌入上附加一个线性层来预测类别标签。训练过程也遵循了Devlin等人(2018)的方法,使用Adam优化器,学习率在前10%的步骤中线性增加,然后线性衰减至零。所有实验都在4个Google Cloud TPUs上进行,批量大小为32。对于每个数据集和算法,研究者们进行了超参数扫描,并根据验证集的准确率选择最佳模型。对于GLUE任务,报告了提交网站提供的测试指标。对于其他分类任务,则报告测试集准确率。
研究者们首先在GLUE基准测试上进行评估。对于这些数据集,他们从预训练的BERT LARGE模型开始迁移,该模型包含24层,总共有330M参数。对于适配器调整,他们进行了小范围的超参数扫描:学习率在{3·10^−5, 3·10^−4, 3·10^−3}中选择,训练周期在{3, 20}中选择。他们测试了使用固定适配器大小(瓶颈中的单元数)和根据任务选择最佳大小{8, 64, 256}。适配器大小是唯一需要调整的适配器特定超参数。由于训练不稳定,他们使用不同的随机种子重跑了5次,并在验证集上选择了最佳模型。表 1汇总了在GLUE测试集上的实验结果,使用GLUE评估服务器的得分。
为了进一步验证适配器产生的模型是否紧凑且性能良好,研究者们在额外的公开可用的文本分类任务上进行了测试。这些任务包含了多样化的数据集:训练样本数量从900到330k不等,类别数量从2到157不等,平均文本长度从57到1.9k字符不等。对于这些数据集,他们使用了32的批量大小。由于数据集的多样性,他们扫描了广泛的学习率范围:{1·10^−5, 3·10^−5, 1·10^−4, 3·10^−3}。由于数据集数量众多,他们根据验证集学习曲线的检查,从集合{20, 50, 100}中手动选择了训练周期的数量。他们为微调和适配器选择了最优值。表 2: 展示了在额外的文本分类任务上的测试准确率。
图4为两个GLUE任务(MNLIm和CoLA)上,训练参数数量与验证集准确率的关系。比较了适配器调整、微调顶层以及仅调整层归一化参数的三种方法。 适配器大小控制了参数效率,较小的适配器引入的参数更少,但可能会影响性能。为了探索这种权衡,研究者们考虑了不同的适配器大小,并与两个基线进行了比较:(i) 微调BERTBASE的顶层k层。(ii) 仅调整层归一化参数。学习率是使用方法中介绍的范围进行调整的。
研究者们通过在SQuAD v1.1上运行来确认适配器不仅在分类任务上有效。给定一个问题和维基百科段落,这项任务要求从段落中选择问题的答案跨度。图5显示了在SQuAD验证集上微调和适配器的参数/性能权衡。对于微调,他们扫描了训练层数、学习率在{3·10^−5, 5·10^−5, 1·10^−4}中选择,以及训练周期在{2, 3, 5}中选择。对于适配器,他们扫描了适配器大小、学习率在{3 · 10^−5, 1 · 10^−4, 3 · 10^−4, 1 · 10^−3}中选择,以及训练周期在{3, 10, 20}中选择。与分类一样,适配器在训练更少参数的同时,达到了与全参数微调相当的性能。大小为64(2%参数)的适配器达到了90.4%的最佳F1分数,而微调达到了90.7%。即使是很小的适配器,如大小为2(0.1%参数)的适配器也达到了89.9的F1分数。
为了确定哪些适配器是具有影响力的,研究者移除了一些训练过的适配器,并在不重新训练的情况下在验证集上重新评估模型。图6显示了在移除所有连续层跨度的适配器时性能的变化。实验是在BERTBASE上使用适配器大小64对MNLI和CoLA进行的。首先,他们观察到移除任何单层的适配器对性能的影响很小。热图的对角线上的元素显示了移除单层适配器的性能,其中最大的性能下降是2%。相比之下,当从网络中移除所有适配器时,性能显著下降:在MNLI上下降到37%,在CoLA上下降到69%——这是通过预测大多数类别得到的分数。这表明尽管每个适配器对整个网络的影响很小,但总体效应是大的。
另外图6表明,较低层次的适配器比高层次的适配器影响要小。在MNLI上移除0-4层的适配器几乎不影响性能。这表明适配器之所以表现良好,是因为它们自动优先考虑更高层次。事实上,专注于上层是一种流行的微调策略。一种直觉是,较低层提取的是不同任务间共享的较低级别的特征,而较高层构建的则是特定于不同任务的特征。这与他们的观察结果相关,即对于一些任务,仅微调顶层的性能就超过了全参数微调,如表2所示。
研究者们调查了适配器模块对神经元数量和初始化规模的鲁棒性。在主要实验中,适配器模块的权重是从均值为零、标准差为10^−2的高斯分布中抽取的,截断到两个标准差。为了分析初始化规模对性能的影响,他们测试了在区间[10^−7, 1]内的标准差。图6总结了结果。他们观察到,在两个数据集上,适配器的性能对于低于10^−2的标准差是鲁棒的。然而,当初始化过大时,性能会下降,在CoLA上更为显著。
为了研究适配器对神经元数量的鲁棒性,研究者们重新检查了实验数据。他们发现,跨适配器大小的模型质量是稳定的,可以在对性能影响很小的情况下为所有任务使用固定的适配器大小。对于每个适配器大小,他们通过选择最优的学习率和训练周期,计算了八个分类任务的平均验证准确率。对于适配器大小8、64和256,平均验证准确率分别为86.2%、85.8%和85.7%。这一信息得到了图4和图5的进一步证实,这些图显示了在几个数量级上稳定的性能。
研究者最后尝试了适配器架构的一些扩展,但没有获得显著的性能提升。他们在这里记录了这些尝试,以供完整性。他们尝试了(i)在适配器中添加批/层归一化,(ii)增加每个适配器的层数,(iii)不同的激活函数,如tanh,(iv)仅在注意力层内插入适配器,(v)将适配器并行添加到主层,并可能与乘法交互。在所有情况下,他们观察到的结果性能与第前面提出的瓶颈相似。因此,由于其简单性和强大的性能,他们推荐原始的适配器架构。
适配器模块为自然语言处理中的迁移学习提供了一种新的视角,它通过在预训练模型中插入轻量级的模块,实现了对新任务的高效适应。这种方法不仅减少了模型的存储和计算需求,还保持了优异的性能,对于需要处理大量任务的应用场景具有重要的实际意义。随着自然语言处理技术的不断进步,适配器模块有望在未来的NLP任务中发挥更大的作用。