参数高效微调方法详解(PEFT,Parameter Efficient Fine-Tuning)

目录

PEFT

LoRA

prompt tuning

训练大型语言模型(Large Language Models, LLM)在计算上是非常密集的。完全微调需要的内存,不仅用于存储模型,还需要存储在训练过程中需要的各种其他参数。即使你的计算机可以容纳模型权重,对于最大的模型而言,现在模型权重的大小已经达到了数百GB的量级,你还必须能够分配内存来存储优化器状态、梯度、前向激活以及整个训练过程中的临时内存。这些额外的组件往往比模型大很多倍,很快就会变得对普通硬件难以处理。

PEFT

与完全微调不同,完全微调中每个模型权重在监督学习过程中都会被更新,而参数高效微调方法(PEFT,Parameter Efficient Fine-Tuning)只会更新一小部分参数。一些方法会冻结大部分模型权重,重点是微调现有模型参数的一部分,比如特定的层或组件。其他方法根本不会触及原始模型权重,而是添加少量的新参数或层,仅微调新组件。

在参数高效微调中,大部分甚至全部LLM权重都会被保持冻结。因此,训练的参数数量远远小于原始LLM中的参数数量。在某些情况下,训练得到的参数仅为原始LLM权重的15-20%。这使得训练的内存需求更加可控。事实上,参数高效微调通常可以在单个GPU上完成。而且由于原始LLM只是轻微修改或保持不变,因此参数高效微调不太容易出现完全微调的灾难性遗忘问题。

你可以使用几种方法进行参数高效微调,每种方法在参数效率、内存效率、训练速度、模型质量和推断成本方面都有权衡。让我们来看看参数高效微调的三类主要方法。

选择性方法(Selective)只微调原始LLM参数的一个子集。你可以采取几种方法来确定你想要更新的参数。你可以选择仅训练模型的某些组件或特定层,甚至是单独的参数类型。研究人员发现,这些方法的性能参差不齐,参数效率和计算效率之间存在显著的权衡。我们不详细介绍这种方法。

重新参数化方法(Reparameterization)也使用原始LLM参数,但通过创建原始网络权重的新的低秩转换来减少需要训练的参数数量。这类方法中常用的技术是LoRA。

LoRA

低秩适应(Low-rank Adaptation,LoRA)是一种参数高效微调技术,属于重新参数化类别。让我们来看看它是如何工作的。以transformer架构为例,输入提示被转换成标记,然后转换为嵌入向量,并传递到transformer的编码器和/或解码器部分。在这两个组件中,有两种类型的神经网络:自注意力和前馈网络。这些网络的权重是在预训练期间学习的。在创建嵌入向量之后,它们被馈送到自注意力层,其中一系列权重被应用来计算注意力分数。在完全微调中,这些层中的每个参数都会被更新。LoRA是一种策略,通过冻结所有原始模型参数,然后在原始权重旁边注入一对低秩分解矩阵,来减少微调过程中需要训练的参数数量。较小矩阵的维度被设置得使它们的乘积成为与它们修改的权重具有相同维度的矩阵。然后保持LLM的原始权重冻结,使用同样的监督学习过程来训练较小的矩阵。在推断过程中,两个低秩矩阵被相乘在一起,以创建一个与冻结权重具有相同维度的矩阵。然后将这个新的总权重矩阵添加到原始权重中,并在模型中用这些更新后的值替换它们。现在你有了一个经过LoRA微调的模型,可以执行你的特定任务。因为这个模型的参数数量与原始模型相同,对推断延迟几乎没有影响。研究人员发现,将LoRA应用于模型的自注意力层通常足以对任务进行微调并获得性能提升。然而,原则上,你也可以在其他组件,比如前馈层上使用LoRA。但由于大多数LLM的参数位于自注意力层中,通过将LoRA应用于这些权重矩阵,你可以在可训练参数中获得最大的节省。

让我们以一个实际的例子来看看,使用《Attention is All You Need》论文中描述的transformer架构。该论文规定transformer权重的维度是512乘以64。这意味着每个权重矩阵有32768个可训练参数。如果你使用LoRA作为微调方法,且秩等于8,你将训练两个小的低秩分解矩阵,其较小的维度为8。这意味着矩阵A将具有8乘以64的维度,共512个参数。矩阵B将具有512乘以8,或4096个可训练参数。通过更新这些新的低秩矩阵的权重,而不是原始权重,你将训练4608个参数,而不是32768个,减少了86%。由于LoRA允许你显著减少可训练参数的数量,你通常可以使用单个GPU执行这种参数高效微调方法,避免需要分布式GPU集群。由于秩分解矩阵很小,你可以为每个任务微调不同的矩阵,并在推断时进行权重替换。假设你为特定任务训练了一对LoRA矩阵;我们称之为任务A。要在这个任务上进行推断,你将这些矩阵相乘,然后将结果矩阵添加到冻结权重中。然后,你将这个新的总权重矩阵替换模型中的原始权重。然后你可以使用这个模型来执行任务A的推断。如果你想执行另一个任务,比如任务B,你只需取出为该任务训练的LoRA矩阵,计算它们的乘积,然后将这个矩阵添加到原始权重中,再次更新模型。存储这些LoRA矩阵所需的内存非常小。因此,原则上你可以使用LoRA来训练许多任务,需要使用时切换权重,避免存储多个LLM的全尺寸版本。这些模型有多好呢?LoRA微调训练的模型结果一般比完全微调略低一些,但差距不大。然而,LoRA微调训练的参数数量要比完全微调少得多,计算资源也明显减少,因此这种性能上的小折衷可能是很值得的。

也许你会想知道如何选择LoRA矩阵的秩。这是一个很好的问题,也是一个仍在研究的活跃领域。原则上,秩越小,可训练参数数量就越少,计算资源的节约就越大。然而,还有一些与模型性能相关的问题需要考虑。在最初提出LoRA的论文中,微软的研究人员探讨了不同秩选择对语言生成任务模型性能的影响。你可以在这里看到结果的摘要表。表格中显示了LoRA矩阵的秩在第一列,模型的最终损失值,以及不同指标的分数,包括BLEU和ROUGE。粗体数值表示每个指标所达到的最佳分数。研究人员发现,对于大于16的秩,损失值会出现平台期。换句话说,使用更大的LoRA矩阵并没有提高性能。这里的结论是,秩在4-32的范围内,可以在减少可训练参数和保持性能之间提供一个良好的折衷方案。优化秩的选择是一个正在研究的领域,随着更多的从业者使用LoRA,最佳实践可能会发展演变。LoRA是一种强大的微调方法,能够取得出色的性能。该方法的原理不仅对于训练LLM很有用,对于其他领域的模型也很有帮助。

最后,加法方法(Additive)通过保持所有原始LLM权重冻结,引入新的可训练组件进行微调。这里有两种主要方法。适配器方法将新的可训练层添加到模型的架构中,通常是在注意力或前馈层之后的编码器或解码器组件内部。另一种是软提示方法,它保持模型架构不变并冻结,重点是通过操纵输入以获得更好的性能。这可以通过向提示嵌入添加可训练参数或保持输入不变并重新训练嵌入权重来实现。

下面我们详细讲解一种名为prompt tuning的特定软提示技术。

prompt tuning

prompt tuning听起来有点像prompt engineering,但它们之间有很大的不同。在prompt engineering中,你努力让你的提示语言得到你想要的完成。这可能是尝试不同的词语或短语,也可能更复杂,比如包含一个或少量示例。其目标是帮助模型理解你要求它执行的任务的性质,并生成更好的完成。然而,prompt engineering也有一些局限性,因为它可能需要大量手动工作来编写和尝试不同的提示语。你还受到上下文窗口长度的限制,而且最终你可能仍然无法达到你任务所需的性能。

在prompt tuning中,你向你的提示语中添加额外的可训练标记,并让监督学习过程来确定它们的最佳值。这组可训练的标记被称为软提示,并且会被添加到代表你的输入文本的嵌入向量之前。软提示向量与语言标记的嵌入向量具有相同的维度。在其中包含大约20到100个虚拟标记可能足以获得良好的性能。代表自然语言的标记是固定的,因为它们每个都对应于嵌入向量空间中的一个固定位置。然而,软提示不是自然语言的固定离散词。相反,你可以将它们视为可以在连续多维嵌入空间中取任何值的虚拟标记。通过监督学习,模型学习这些虚拟标记的值,以最大化给定任务的性能。

Prompt tuning是一种非常参数高效的策略,因为只有少量参数被训练。与完全微调中的数百万到数十亿个参数相比,它只有少量参数。你可以为每个任务训练不同的软提示集,然后在推断时轻松地互换它们。你可以为一个任务训练一组软提示,为另一个任务训练另一组。要在推断中使用它们,你只需在输入提示前加上学习到的标记,要切换到另一个任务,只需更改软提示。软提示在磁盘上非常小,因此这种微调非常高效和灵活。你会注意到相同的LLM用于所有任务,你所需要做的就是在推断时更换软提示。

那么,prompt tuning的性能如何呢?在原始论文《Exploring the Method》中,Google的Brian Lester和合作者将prompt tuning与几种其他方法进行了比较,针对一系列模型大小。从论文中可知,对于较小的LLM,prompt tuning的性能不如完全微调。然而,随着模型大小的增加,prompt tuning的性能也会增加。一旦模型的参数大约达到100亿,prompt tuning就可以与完全微调一样有效,并且比仅使用prompt engineering获得了显著的性能提升。

有一个需要考虑的潜在问题是学习到的虚拟标记的可解释性。记住,因为软提示标记可以在连续的嵌入向量空间中取任何值。所以训练得到的标记并不对应于LLM词汇表中的任何已知标记、单词或短语。然而,对软提示位置的最近邻标记进行分析显示它们形成了紧凑的语义集群。换句话说,最接近软提示标记的单词具有类似的含义。通常,识别出的单词都有一些与任务相关的含义,这表明提示正在学习类似单词的表示。

本文主要讲解了参数高效微调方法的三类中的两类的两种方法,LoRA 和 prompt tuning,大家有什么问题可以留言讨论哈。

  • 16
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在实战操作中,PEFT库可以用来微调BERT模型,以进行文本情感分类任务。首先,我们需要准备一个包含大量文本和标签的数据集,用于训练和验证BERT模型。然后,我们需要利用PEFT库中提供的工具和接口,将数据集转换成BERT模型可接受的格式,并进行数据预处理,如分词和填充等操作。 接着,我们可以利用PEFT库中提供的预训练模型,加载BERT模型的参数和网络结构,并在数据集上进行微调微调的过程中,我们可以通过调整学习率、批大小和训练轮数等超参数,来优化模型的性能。在每个训练轮数结束后,我们可以利用PEFT库中的评估工具对模型进行评估,以了解模型在验证集上的性能表现。 最后,当模型在验证集上的性能达到满意的水平后,我们可以使用PEFT库提供的保存模型工具,将微调后的BERT模型保存下来,以备在实际应用中使用。通过PEFT库的实战操作,我们可以有效地利用BERT模型进行文本情感分类任务,提高模型的准确性和泛化能力,从而更好地满足实际应用的需求。 PEFT库的实战操作不仅帮助我们更好地理解和使用BERT模型,也为我们提供了一套完整的工具和流程,使得模型训练和应用变得更加简单和高效。 PEFT库实战(一): lora微调BERT(文本情感分类) 的操作流程清晰,易于上手,为我们在文本情感分类任务中的应用提供了有力的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值