万物负阴而抱阳,冲气以为和
——《道德经·第四十二章》
从Bert时代一路过来的朋友们应该还记得,对于仅仅只有1亿参数的Bert,在特定任务上做一个全参数微调(Full Parameter Fine-tuning,FPFT),那简直是再正常不过的操作。即使想不开要对Bert重新做个预训练(Pretraining),也无碍乎是“几张卡+几天”的事情,根本无伤大雅。
随着模型参数规模逐渐从1亿扩大到现在的百亿、千亿,全参数微调,哪怕是LoRA等仅更新部分参数的参数高效微调方法(Parameter Efficient Fine-Tuning,PEFT)也已经变成了一种奢侈的事情,因此我们开始转入对“尽可能影响更少的参数、让模型变得更快、资源消耗变得更低”的“小型化”追求。
今天要介绍的这篇文章,在LoRA的基础上,把模型训练时的参数更新量进一步缩小了将近20倍!不但如此,甚至还获得了相对更好的表现。这对我们众多资源匮乏党来说,无疑是一个巨大惊喜,就让我们来看看,它到底是怎么做到的!
论文标题:
LaMDA: Large Model Fine-Tuning via Spectrally Decomposed Low-Dimensional Adaptation
论文链接:
https://arxiv.org/pdf/2406.12832.pdf
高效!还要更高效!
大模型(LLMs)由于其在大量数据上训练后所表现出的泛化能力,在NLP的多种任务中都取得了惊人的性能。然而,要充分发挥LLMs的潜力,仍然需要对它们进行微调以适应特定的应用场景。尽管微调可以显著提升模型在特定任务上的表现,但对大型模型进行全面微调的成本非常高,这不仅包括计算资源,还包括内存需求,尤其在边缘设备上进行微调几乎是不可能的。
此外,全参数微调LLM还可能导致过拟合和灾难性遗忘,即模型在更新参数以适应新任务时,可能会忘记其在预训练阶段学到的有用信息。为了解决这些问题,研究者们提出了参数高效的微调(PEFT)技术,这些技术只更新模型参数的一小部分,或者训练任务特定的软提示。在这些PEFT技术中,低秩适应技术(LoRA)就是其中的杰出代表。
LoRA通过在模型冻结参数的主路径旁添加两个可训练的低秩适配矩阵(即下图A和B,通过秩分解预训练权重获得;𝛼用于平衡主路径和适配路径贡献的超参;W为主路径被冻结参数)来实现微调,从而减少了GPU内存需求和可训练参数数量。但是,LoRA的可训练参数数量可能仍然比预训练LLM的低内在维度要大,而且随着模型嵌入维度的增加,对可训练参数的需求也会增加,导致计算成本上升。
为了克服LoRA的这些限制,本文提出了LaMDA,利用低维适应(low-dimensional adapter,LDA)来显著减少可训练参数和峰值GPU内存占用,从而为LLMs提供一个更为高效和可扩展的微调框架,使其能够在资源受限的环境中得到有效应用。
方法
LaMDA
Low-Dimensional Adapter (LDA) 是LaMDA方法的核心组件,它通过在微调过程中引入一个低维的可训练方阵来显著减少参数数量和内存占用。LDA的引入是基于这样的理念:通过在一个较小的参数空间内进行调整,可以在保持模型性能的同时减少所需的计算资源。
具体来说,LDA是一个的方阵S,它被集成到模型的适配路径中,与两个映射矩阵() 和()结合使用。与LoRA不同,首先对方W进行奇异值分解,得到U,Σ,V然后利用与最大奇异值对应的奇异向量初始化和。这种初始化方法确保了在微调开始时,主路径和适配路径的组合能够近似于预训练权重,从而提高了微调的效率。
在LaMDA方法中,A在微调开始时就被冻结,而B在微调的早期阶段逐步冻结。这么做的目的是在微调的初始阶段,通过将B保持可训练状态,允许模型适应新任务。随着微调的进行,将根据奇异值的大小逐步冻结,随后S成为了唯一可训练的矩阵,从而在保持模型性能的同时减少计算成本。
通过这种设计,LaMDA将可训练参数的数量从LoRA中的减少到 𝑟2, 由于这里的r远小于模型的嵌入维度d。这种参数数量的减少带来了两个主要优势:首先,它有效限制了参数数量,降低了过拟合的风险,增强了模型的泛化能力;其次,由于需要更新的参数数量减少,微调过程中的计算和内存需求也随之降低。
此外,LDA的使用还减少了在反向传播过程中需要存储的激活数量。在LoRA中,需要存储的激活数量与模型的嵌入维度d成正比,而在LaMDA中,由于A被冻结,所需的激活存储空间降低到了维空间,这导致了显著的内存使用减少。
LaMDA++
由于奇异值本身代表了矩阵的重要程度或“能量”,较大的奇异值意味着它们在矩阵中占据了更重要的角色。因此,本文定义了矩阵的能量得分(Energy-score),其为矩阵奇异值的平方和。随后,归一化能量分数(normalized energy-score)则为单个层的能量分数与模型中所有层能量分数总和的比例。这提供了一种衡量每层相对于其他层重要性的方法,使得模型能够更有效地分配其有限的参数预算。
LaMDA++正是基于这一思想的LaMDA增强版本,它在原有的基础上引入了自适应秩分配的概念,允许在不同网络层之间动态调整可训练参数的数量。这种机制的目的是更有效地利用模型的参数预算,将更多的参数分配给那些在预训练权重中具有更高能量成分的层,同时减少对那些能量较低层的参数分配。
在LaMDA++的实现中,首先定义了一个秩预算集合Rs,其中包含了可能的秩候选值,并且𝑟1<𝑟2<...<𝑟𝑆,LaMDA++的目标是将这些秩分配给不同的层,使得所有层的秩之和等于目标秩𝑟𝑇。对于每一层𝑙,LaMDA++计算了一个候选分数𝑣𝑙,该分数通过该层的能量分数与最低和最高能量分数之间的差异进行计算。即:
然后,LaMDA++根据候选分数vl,所有层进行排序,并按照分数从低到高的顺序分配秩,即排名靠前的层获得较高的秩,而排名靠后的层则获得较低的秩。例如,对于排名前1/S的层,LaMDA++为他们分配秩rs,对于排名在第二个1/S部分的层,LaMDA++为他们分配秩rs-1,以此类推。
通过这种自适应秩分配策略,LaMDA++能够在保持参数总数不变的情况下,更合理地在不同层之间分配参数,从而提高了模型微调的效率和性能。这种方法不仅能够减少不必要的参数更新,降低计算成本,还能够确保关键层获得足够的参数来适应新任务,从而在各种自然语言处理任务中取得更好的性能。LaMDA++的这种灵活性和效率使其成为一种在资源受限的情况下微调大语言模型的有力工具。
实验
实验设置
本文实验的目的是验证LaMDA和LaMDA++方法在不同NLP任务中的有效性,包括自然语言理解(NLU)、自然语言生成(NLG)和复杂推理任务。
对于NLU任务,本文选择了只有编码器(Encoder)的DeBERTa-V3模型,并在包含了多种文本分类和自然语言推理任务的GLUE基准测试上进行了评估。对于NLG任务中,本文使用了同时具备编码器(Encoder)和解码器(Decoder)的BART-large模型,并在XSUM和CNN/DailyMail数据集上进行了文本摘要的评估。
此外本文还评估了只有解码器的LLaMA2系列模型在复杂推理任务GSM8K,文本生成任务Wikitext-2,以及常识推理任务Commonsense170K上的表现。
LaMDA被应用于所有模型层的多头自注意力和前馈网络块中的线性模块,同时选择了全参数微调,以及LoRA、LoRA-FA、AFLoRA和VERA等现有PEFT方法作为基线。
DeBERTa-V3实验
首先,本文对DeBERTa-V3使用了LaMDA和LaMDA++进行了微调,并在GLUE基准测试上进行了评估。实验结果显示,LaMDA和LaMDA++在显著减少可训练参数数量的同时,能够与现有的微调方法相媲美或甚至取得更好的性能。
具体来说,LaMDA在保持性能的同时,将可训练参数的数量减少了17.7倍。与LoRA方法相比,LaMDA在GLUE基准测试的各个任务上都展现出了相似或略低的性能,但参数数量大幅减少。例如,在CoLA、SST-2、MRPC、QNLI、STS-B、RTE、MNLI和QQP等任务上,LaMDA的参数数量仅为0.075M,远低于LoRA的1.33M,而性能上仅略有下降,平均性能与LoRA相当。
LaMDA++作为LaMDA的增强版本,通过自适应秩分配进一步优化了微调过程。LaMDA++在参数数量上略有增加,但仍然远低于LoRA,并且在某些任务上取得了比LoRA更好的性能。例如,在CoLA、SST-2、MRPC、QNLI、STS-B、RTE、MNLI和QQP任务上,LaMDA++的参数数量为0.078M,平均性能略高于LoRA,显示出在参数效率和模型性能之间取得了良好的平衡。
BART-large实验
在XSUM数据集上,与LoRA相比,LaMDA在ROUGE-1、ROUGE-2和ROUGE-L指标上取得了相似或略低的分数,但参数数量大幅减少,而LaMDA++则以对比LaMDA少量的参数代价超过了LoRA的效果。在CNN/DailyMail数据集上,LaMDA和LaMDA++同样展现出了良好的性能。LaMDA和LaMDA++的ROUGE分数均接近或与LoRA相当。
LLaMA2实验
在GSM8K数据集上,LaMDA和LaMDA++都表现出了优越的性能。具体来说,LaMDA使用的适配器路径的秩(r)设置为32,其参数数量为4.37M,而LoRA在同一秩设置下参数数量为28M。LaMDA在GSM8K任务上的准确率达到了37.9%,与LoRA的36.9%相比有所提高。当使用LaMDA++方法,并且目标秩(rT)设置为32时,参数数量略有增加到5.12M,但准确率提升到了38.2%,进一步超越了LoRA的性能。
在Wikitext-2数据集上,LaMDA和LaMDA++同样展现出了良好的性能。LaMDA的困惑度(perplexity)非常接近LoRA,而LaMDA++的困惑度为5.41,略低于LoRA,表明其在文本生成任务上也具有竞争力。值得注意的是,尽管LaMDA++在Wikitext-2任务上的参数数量比LoRA少了5.5倍,但其性能仍然能够与LoRA相媲美或更好。
此外,作者们还对LaMDA在常识推理任务上进行了评估。使用Commonsense170K数据集作为训练样本,并在包括BoolQ、PIQA、SIQA、HellaSwag、WinoGrande、ARC-e、ARC-c和OBQA等多个任务的验证集上进行了评估。LaMDA在这些任务上的平均准确率超过了LoRA,同时微调的参数数量大约是LoRA的11.5倍。
消融实验
本文探讨了初始化选择对LaMDA性能的影响。在LaMDA中,A和B通过使用与预训练权重W的奇异值对应的奇异向量来初始化。在消融实验中,作者们尝试了不同的初始化策略,包括使用与最大奇异值对应的奇异向量、与最小奇异值对应的奇异向量,以及随机初始化。实验结果表明,使用与最大奇异值对应的奇异向量进行初始化的LaMDA模型在GSM8K和Wikitext-2数据集上的性能优于其他初始化方法,这验证了在微调过程中对模型中高能量成分进行更新的重要性。
其次,本文研究了逐步冻结B的迭代次数LaMDA性能的影响。在LaMDA中,在微调的前ti迭代中保持可训练状态,然后根据预定的线性调度逐步冻结。通过改变ti值并观察其对GSM8K任务准确率和参数数量的影响,作者们发现,分配足够的迭代次数来训练对于模型超越LoRA的性能是至关重要的。特别是,当设置为总迭代次数的30%时,LaMDA模型表现出了相对于LoRA的最佳性能。
最后,本文评估了LaMDA++中排名机制的有效性,分别比较了按照LaMDA++的排名分配秩和相反顺序分配秩的效果。实验结果显示,按照LaMDA++排名分配秩的模型在Wikitext-2数据集上展现出了更低的训练损失和更好的性能,而相反顺序分配秩的模型则表现出更嘈杂的训练行为和更高的最终损失。
结论与展望
由于不需要对整个模型进行大规模的调整,而是仅通过一些小巧的改动,就能让模型适应新任务,因此自大模型时代以来,参数高效微调技术便受到了广泛重视。这就像是给超级电脑装了一个智能的内存管理系统,只更新那些真正需要更新的部分,从而切实提高效率,减少资源损耗。本文提出的LaMDA正是其中的杰出代表,它在LoRA的基础上更进一步,用更少的参数改动,实现了相近乃至部分更优的效果。
目前,LaMDA主要在一些中小规模的模型上进行了测试。未来的工作还可以把它应用到更大的模型上,或者探索它在不同类型的任务上的表现,例如视觉-语言模型。
总的来说,当第一次看到LoRA的时候,总会为其实用而简洁的设计所叹服。同样,通过对线性代数原理的应用,LaMDA为在资源受限的环境中部署和应用LLM提供了新的可能和更优的选择。相信在参数高效微调的方向上,还将会大更多的潜力等待我们去发掘。