在自然语言处理(nlp)领域,利用预训练的大型模型进行微调(finetune)已成为解决各种任务的常见方法。通过对bert、gpt等在海量文本上预训练的模型在下游任务上进行微调,可以得到针对特定任务的模型。然而,这种方法的成本不容忽视,因为需要为每个任务保存一个完整的特定任务模型,随着预训练模型规模的增大,存储空间的需求也随之增加。此外,为每个任务微调如此庞大的模型,还会消耗大量的训练资源。
为了实现更加环保和经济的NLP预训练模型迁移,近年来业界提出了多种优化微调的方法,如adapter微调、mask微调等。最近颇为流行的prompt技术甚至能够在不进行微调的情况下应用于下游任务。本文将重点介绍近两年在NLP领域中几种经典的微调优化工作,包括adapter-tuning、side-tuning、mask-tuning以及prefix-tuning等。
Adapter-tuning
在迁移NLP预训练模型的方法中,主要分为微调(finetune)和基于特征的方法(feature-based)。微调方法是对原模型在下游任务上进行训练,而基于特征的方法则是使用预训练模型生成的词或句子嵌入作为输入,连接到下游的独立模型进行预测。通常情况下,微调的效果优于基于特征的方法,但其计算开销也更大。Parameter-Efficient Transfer Learning for NLP(ICML 2019)提出了一种更经济的迁移学习方法,即adapter-tuning。这种方法只需微调少量参数就能达到与微调整个模型相当的效果。具体做法是在Bert模型的每一层中间插入两个adapter。adapter首先通过全连接层对原始输入进行降维,减少参数量,经过内部的NN后再将维度恢复,形成一种瓶颈结构。在微调过程中,预训练的Bert模型参数被冻结(freeze),只更新adapter的参数,大大减少了微调阶段需要更新和保存的参数量。
AdapterFusion: Non-Destructive Task Composition for Transfer Learning(2021)在Adapter Finetune的基础上,提出了一种在存在多个下游任务时使用的两阶段微调方法。第一阶段与Adapter Finetune的思路一致,在预训练的大模型基础上添加每个任务的adapter进行微调,预训练模型参数被冻结。第二阶段,继续冻结预训练模型和第一阶段训练的adapter参数,学习一个AdapterFusion模型,这个模块的作用是融合各个adapter的信息,实现下游多个任务之间的信息共享。AdapterFusion的思路是利用当前样本在FF层的输出和各个任务的adapter输出做Attention,实现从多个Adapter产出信息中的选择和融合。这样,模型能够根据每个样本选择合适的adapter输出,综合多任务的adapter信息。
Side-Tuning
Side-tuning: A baseline for network adaptation via additive side networks(ECCV 2019)提出了一种side-tuning的方法。如下图所示,side-tuning是在原预训练模型的基础上,增加一个小的side network,然后将预训练模型的输入和side-network的输出进行融合。融合的方法是使用一个可学习的参数α进行加权融合。训练过程中,预训练模型不会被更新,只更新side-network部分的参数。Side模型的尺寸和复杂度可以根据任务的难易程度进行调整。Side-tuning与adapter-tuning有相似之处,都是通过一个附属的小模型对原预训练大模型的表示进行更精细化的调整,以适应下游任务。
Mask-tuning
Masking as an efficient alternative to finetuning for pretrained language models(2020)提出了一种简单的mask方法来实现高效微调。与一般的微调不同,该方法在微调阶段不调整参数,而是学习一个mask矩阵。对于每一个Transformer层,都会学习一个0-1的矩阵,然后用这个矩阵对该层的全连接权重进行缩放。公式如下,m表示矩阵中的某一个元素,根据一个阈值设置为1或0,再用这个矩阵和每层的全连接参数相乘进行对应元素的缩放。
Mask-tuning的出发点是,在预训练模型微调的过程中,其实不需要微调那么多参数,只要微调一些关键参数就能达到较好的效果,减少微调阶段计算的冗余性。在How fine can fine-tuning be? Learning efficient language models(2020)一文中也提出了类似的思路。
Prefix-tuning
REFORMER: THE EFFICIENT TRANSFORMER(ICLR 2020)提出了采用局部敏感哈希的方法来提升Transformer的效率。当序列较长时,QK^T的维度[batch_size, L, L]的计算量和存储开销会非常大,但由于我们关注的是softmax后的结果,并不关注QK^T本身是什么,而softmax只关注值最大的几个元素,因此我们可以只选择k个最相关的元素进行计算。
Prefix-Tuning: Optimizing Continuous Prompts for Generation(2021)提出的方法只微调0.1%的参数就能取得与微调相当的效果,并且在少样本任务上效果优于微调。本文提出了针对自然语言生成任务(如摘要生成、table-to-text等任务)的迁移预训练大模型的方法。基于Language models are few-shot learners(2020,GPT3)等文章中提出的Prompt思路,只要能给模型一个合适的上下文信息context,预训练的语言模型不需要修改参数就能很好地解决下游问题。例如,当我们想生成Obama这个词,只要上下文信息给Barack,模型就有可能生成Obama,因为模型在预训练阶段已经学到了这些信息。
该方法的具体实现是,将预训练的Transformer模型参数整体冻结(Freeze),在正常输入文本序列时,在最前端添加几个prefix id,每个prefix id都对应一个随机初始化的embedding,不同的任务有不同的prefix id。这样,在模型中,prefix之后每个时刻的表示都会受到prefix的影响,prefix代表某个对应具体任务的上下文信息。在微调过程中,模型的其他参数都被冻结,只微调prefix的embedding以及prefix后面接的一些全连接层,微调参数量只占整体模型的0.1%,远小于其他的微调方法。该方法的核心思想是利用prefix embedding去学习对于某个任务来说,需要从预训练语言模型中提取什么样的信息。
总结
NLP领域预训练大模型的发展,催生了许多关于如何提升迁移效率的研究工作。从目前的研究趋势来看,基于prompt思想的微调是未来的一个重要研究趋势,充分利用预训练模型的信息,让下游任务更贴近预训练模型,而不是让预训练模型贴近下游任务。后续我们也会对prompt进行更为详细的介绍。
END
如果觉得我的文章对你有帮助,请关注我吧~
以上就是NLP中的绿色Finetune方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号