【云驻共创】走进PEFT

举报
龙腾九州 发表于 2024/04/15 18:38:05 2024/04/15
【摘要】 PEFT是一种高效的微调方法,用于提高模型在特定任务上的性能,同时减少需要调整的参数数量。本文将带大家一起学习PEFT的方法和具体用法,会重点介绍常用的PEFT方法,并用相应示例来进行演示说明。

在深度学习研究中,我们会遇到各种大型预训练模型,比如GPT、BERT等。毫无疑问这些模型在自然语言处理任务中取得了非常优异的表现,然而巨大的数据量和高昂的训练成本一直是它的通病,因此有一项新的技术叫做Parameter-Efficient Fine-Tuning (PEFT)就诞生了。本文将带大家一起学习PEFT的方法和具体用法,会重点介绍常用的PEFT方法,并用相应示例来进行演示说明。

一、微调概述

1.什么是微调

微调是指采用一个已经在某些任务上训练过的模型,然后对其进行调整以执行类似任务的过程。当新的数据集或任务需要模型进行一些修改时,或者当模型在特定任务上表现不佳时,通常使用它。例如,一个训练用来生成故事的模型可以被微调成生成诗歌。这是可能的,因为模型已经学会了如何生成休闲语言和写故事,如果模型被适当调整,这种技能也可以用来生成诗歌。

2.微调是如何工作的

微调是一种机器学习技术,用于在一个预训练模型的基础上进一步训练,以适应新的特定任务或数据集。微调的主要目的是利用已经在大型数据集上预训练过的模型,通过对其进行小范围的调整,使其能够更好地适应新的特定任务或数据集。这样做的好处是显著减少了训练时间和计算资源的需求,因为不需要从头开始训练一个全新的模型。

在具体操作上,微调通常包括以下几个步骤:

1.预训练模型:首先需要一个在大型数据集上预训练好的模型,这个模型已经学会了提取通用特征和执行基本任务的能力。

2.创建目标模型:然后创建一个新模型,通常称为目标模型,它复制了源模型的大部分结构及其参数,但不包括输出层。这是因为输出层通常与源数据集的标签紧密相关,而我们的目标是让模型适应新的任务。

3.添加输出层:为目标模型添加一个新的输出层,其大小与目标数据集的类别数相匹配,并随机初始化该层的参数。

4.训练目标模型:最后,使用目标数据集对模型进行训练。在这个过程中,输出层会被重新训练,而其他层的参数则会基于源模型的参数进行微调。

3.为什么要使用微调

那么,为什么要使用微调呢?主要有三点原因:更大的模型可以很好地推广到下游任务,比训练整个模型更便宜,适合在线培训。

当你得到一些数据时,使用大型语言模型

什么情境下使用大型语言模型?

在人工智能领域中,当提示工程并不总是有效,查找一个好的提示符很繁琐时;

当在数据上对整个LM进行调优价格是昂贵的,小数据集上的过拟合/灾难性遗忘,每个任务需要存储一套完整的模型权重;

参数高效微调。

二、PEFT

1.什么是PEFT

PEFT是一种参数有效的微调。它是一套技巧或者方法来细化调整一个大模型使其最具计算能力和省时成为可能。你可以进行完整的微调,并不失去任何性能。

2.PEFT方法

PEFT通过仅微调模型中的关键部分,而不是全部参数,来实现对下游任务的高效适应。具体来说,PEFT的关键优势在于:

资源成本降低:PEFT通过选择性微调,显著减少了计算资源的消耗,使得模型能够更经济地适应新任务。

适应性强:PEFT能够有效地将预训练模型适应到各种不同类型的下游应用中,无需对整个模型进行全量微调。

避免灾难性遗忘:与传统的微调方法相比,PEFT在减少参数微调的同时,还能够在一定程度上避免灾难性遗忘,保持模型的稳定性。

补充:如果我们向神经网络引入额外的可训练参数,然后只训练这些参数会怎么样?

说明:如果我们选择神经网络参数的一小部分并对其进行调整会怎么样?

重新参数化:如果我们将模型重新参数化,使其更有效地训练呢?

如果我们给神经网络引入额外的可训练参数,然后只训练这些参数呢?有这些方法:提示调优、前缀调优、适配器和压实工具。

3.提示调优

1.微调T5,使其更像传统的语言模型。

• 这只需要做一次,并且根据经验可以使即时调优工作得更好。

• 这可能是因为T5最初训练的跨域破坏,使目标不适合提示。

2.冻结T5的权重。将前k个输入嵌入设置为可学习的。

• K是由实现者选择的超参数。

3.初始化k个可学习嵌入。一些选项包括:

• 随机初始化

• 初始化值来自词汇表嵌入矩阵。

4.训练你的任务特定数据。

4.前缀调优

前缀调优是一种自然语言生成任务中的微调技术。前缀调优(Prefix Tuning)是一种新的模型微调方法,它旨在通过添加一系列连续的、特定于任务的向量(称为前缀)到输入中,以此来改善模型在特定任务上的性能。这种方法的核心思想是在保持预训练语言模型的参数不变的情况下,仅优化这些前缀向量。以下是前缀调优的几个关键点:

可训练张量的添加:前缀调优通过向每个变换器块添加可训练的张量,而不是仅在输入嵌入层添加,这样可以让模型在不改变原有结构的前提下,学习到新的任务相关信息。

冻结语言模型参数:在进行前缀调优时,语言模型的参数会被冻结,即在调优过程中保持不变。这意味着只有添加的前缀向量会参与训练和更新,从而减少了计算成本。

适用于多种任务:前缀调优可以应用于多种自然语言处理任务,包括但不限于文本生成、语言理解等。它提供了一种灵活的方式来适应不同的任务需求。

效率与效果的平衡:相比于全参数微调(Fine-tune),前缀调优能够在保持较低计算成本的同时,达到相对较好的性能表现。虽然可能与传统的全参数微调相比有一定程度的效果损失,但在许多情况下,前缀调优的效果已经足够接近,同时具有更高的计算效率。

处理多任务:前缀调优的架构允许在单个批处理中处理来自多个用户或任务的示例,这在其他轻量级微调方法中可能难以实现。这种灵活性使得前缀调优在某些场景下更为适用。

总的来说,前缀调优是一种高效且灵活的微调技术,特别适合于资源受限或者需要快速部署的场景。

5.适配器

• 适配器是在预训练网络层之间添加的新模块。

• 原来的模型权重是固定的,只是调整了适配器模块。

• 对适配器进行初始化,使适配器插入模块的输出类似于原始模型。

5.1基于适配器方法的优点

• 已被证明在多任务环境下非常有效。

有一些方法可以训练特定于任务的适配器,然后将它们组合起来以利用跨任务知识。

• 往往比全模型微调更快。

可能对调校数据的对抗性扰动更具鲁棒性。

5.2陷阱或适配器方法

• 添加新层意味着使推理变慢。

• 它还使模型更大(可能更难适应可用的加速器,如gpu、npu)。

• 适配器层需要在推理时按顺序处理,这可能会破坏模型的并行性。

如果我们选择神经网络的一小部分参数,然后调整它们呢?有方法:层冻结、BitFit、diff剪枝。

6.层冻结

研究表明,Transformer的较早层倾向于捕获语言现象和基本语言理解;较晚的层是特定于任务的学习发生的地方。这意味着我们应该能够通过冻结较早的层并调整较晚的层来学习新任务。

7.BitFit:偏项微调

• 只调整偏差项和最终分类层(如果进行分类)。

• 回想多头注意力方程式。

8.对DiffPruning的直觉

• 在前面我们讨论过的方法中,选择要冻结的参数和要调优的参数是手动完成的。

• 为什么不学习这个呢?

• 主要思想:

对于每个参数,微调一个可学习的“增量”,将其添加到原始参数值中。

使用低规范惩罚来鼓励delta的稀疏性。

如果我们将模型重新参数化,使其更容易训练呢?方法:LoRa, (IA)3。

9.重新参数化模式的直觉

微调具有较低的内在维数,即为达到令人满意的性能而需要修改的最小参数数量不是很大。

这意味着,我们可以用低维代理参数重新参数化原始模型参数的子集,并优化代理。


10.LoRA

10.1 LoRA——低阶适应

10.2稳定扩散中的LoRA

11.抑制和放大内激活的(IA)3注入适配器


重参数化方法的优点:训练往往更节省内存,因为我们只需要计算梯度并维护少量参数的优化器状态;这些方法的调优速度比标准的全模型调优要快;在任务之间进行交换是很直接的,只需交换调整后的权重。

三、MindNLP演示

通过相关代码演示了一个例子。

综上所述,PEFT是一种高效的微调方法,用于提高模型在特定任务上的性能,同时减少需要调整的参数数量。本文带大家一起学习了PEFT的方法和具体用法,重点熟悉了常用的PEFT方法。

本文参与华为云社区【内容共创】活动第26期

任务14:昇思MindSpore技术公开课 大模型专题(第二期)第十一讲:PEFT


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。