微信扫码
与创始人交个朋友
我要投稿
国内外目前有很多大语言模型,如GPT3、GPT4、ChatGLM、Llama、Baichuan、PanGu等,在自然语言处理任务中各有千秋。在面对具体的任务时,我们需要对大语言模型在已有的基础上进行,通过相应的监督语料进行训练、微调等,以获得适应下游任务的模型。
自从GPT、EMLO、BERT的相继提出,以Pre-training + Fine-tuning 的模式在诸多自然语言处理(NLP)任务中被广泛使用。
首先是预训练阶段,使用大量的无监督语料库来训练通用的预训练语言模型(PLM),此时尚未设定特定任务目标。这一阶段的目的在于使模型掌握语言的基本特征,例如,语法、上下文关联及词义等。
然后是微调阶段,我们将经过预训练的模型应用于具体的下游任务,使模型适应这些具体的任务,如情感分析、问答系统或文本分类等。在微调过程中,模型的参数会被针对性地调整以适应特定的任务。
这种模式在诸多任务的表现上超越了传统的监督学习方法,不论在工业生产、科研创新还是竞赛中均作为新的主流方式。然而,这套模式也存在着一些问题。例如,在大多数的下游任务微调时,下游任务的目标与预训练的目标差距过大导致提升效果不明显,微调过程中依赖大量的监督语料等。
以GPT-3、PET(Pattern-Exploiting Training)为首提出一种基于预训练语言模型的通过Prompt进行微调的新范式,通过添加模板的方法来避免引入额外的参数,从而让语言模型可以在小样本 (Few-shot) 或零样本(Zero-shot) 场景下达到理想的效果。旨在解决目前传统Fine-tuning的两个痛点问题:
降低语义差异(Bridge the gap between Pre-training and Fine-tuning) :预训练任务主要以Masked Language Modeling(MLM)为主,而下游任务则重新引入新的训练参数,因此两个阶段的目标通常有较大差异。由此需要解决如何缩小Pre-training和Fine-tuning两个阶段目标差距过大的问题。
避免过拟合(Overfitting of the head) :由于在Fine-tuning阶段需要新引入额外的参数以适配相应的任务需要,因此在样本数量有限的情况容易发生过拟合,降低了模型的泛化能力。因此需要面对预训练语言模型的过拟合问题。
下面按时间线分别介绍Prefix-tuning、P-tuning、Prompt Tuning、P-Tuning v2这几个常用的微调方法以及PEFT统一框架。
Prefix-tuning最早于2021年由斯坦福大学研究团队提出,是一种轻量级的微调方法。该方法在固定预训练语言模型参数的前提下,添加一个前缀,通过优化该前缀的少量参数,就能够达到不错的微调效果。
由于人工设计/自动化搜索的离散型Prompt对模型优化的鲁棒性很差,因此Prefix-tuning使用了连续可调的矩阵来调整Prompt。在训练时,Prefix-tuning在模型输入前添加一个连续且任务特定的向量序列(即Prefix),固定PLM的所有参数,只更新优化特定任务的Prefix。其中,Prefix可以通过训练得到。
例如,对于Decoder-only的GPT,Prefix只加在句首,模型的输入表示为:
而对于Encoder-Decoder的BART,不同的Prefix同时加在编码器和解码器的开头:
在下游微调时,LM的参数被冻结,只有Prefix部分的参数进行更新。
Prefix-tuning将Prefix参数(可训练的张量)添加到所有的transformer层,如下图。
机制:将多个prompt vectors 放在每个multi-head attention的key矩阵和value矩阵之前。注意,P-Tuning是加在embedding矩阵上。
计算方式:相当于原始的token要多和这些soft prompt token计算相似度,然后聚合。
其中是一个标量,表示Prefix上的归一化注意力权重之和:
通过上面等式的变换,等式的前部分是不加入Prefix向量的初始attention计算的公式,后半部分则是上下文向量无关的部分。通过一个类似门的机制来计算前后两部分的比重,如果用h表示原本的attention模块输出,则Prefix-tuning的attention计算可以写成如下形式:
那么,加入Prefix的attention模块输出等于原本attention模型输出和一个与上下文无关的增量之间的加权平均。
作者发现直接更新多个虚拟token的参数效果不稳定,因此在Prefix层加了MLP,分解成了更小的embedding层 更大的MLP层。原始的embedding层参数是n_prefix emb_dim,调整后变为n_prefix n_hidden + n_hidden * emb_dim。训练完成后这部分就不再需要只保留MLP输出的参数进行推理即可。
prefix部分到底使用多少个虚拟token,直接影响模型微调的参数量级,以及处理长文本的能力。默认的prefix长度为10,作者在不同任务上进行了微调,整体上prompt部分的参数量都在原模型的~0.1%。
Prefix-tuning会针对不同的用户数据提供特定的Prefix进行训练,避免数据交叉污染,且支持在单个批处理任务中处理来自多个用户/任务的示例。
Prefix Tuning的主要贡献如下:
相较于Full fine-tuning而言,大幅度减少了需要存储的副本参数量。
在少量数据的微调上,效果优于Full fine-tuning。
相较于其他PEFT技术而言,Prefix-tuning支持在单个批处理任务中处理来自多个用户/任务的示例。
但对于一些特定领域的复杂任务而言,可能需要更加复杂的模型结构和更加精细的微调方法。在这种情况下,Prefix-tuning可能无法达到最佳的模型微调效果。
清华大学的研究者于2021年发表论文《GPT Understands, Too》提出P-Tuning方法,其与Prefix Tuning类似,比如考虑到神经网络本质上是连续的,故离散提示可能不是最优的,从而也采取连续的提示,而P-Tuning方法是将可训练的连续提示嵌入与离散提示相结合,以提高稳定性和性能。
论文实验结果表明,P-Tuning最大限度地减少了不同离散提示之间的性能差距,并在各种 NLU 任务(包括 LAMA 和 SuperGLUE)上实现了显着改进,这颠覆了在那年之前“GPT不擅长NLU”的结论,也是该论文命名的缘由。
下图是一个Prompt Search针对“The capital of Britain is [MASK]”(英国的首都是哪个城市)的例子。即给定上下文(蓝色区域,“英国”)和目标(红色区域,“[MASK]”),橙色区域指的是提示符号Prompt tokens。
在(a)中,Prompt Generator(提示生成器)只收到离散的奖励;在(b)中,Pseudo Prompts(伪提示)和Prompt Encoder可以以可微的方式进行优化,有时,在(b)中添加少量与任务相关的Anchor tokens(如“capital”)将带来进一步的改进。
由此可见,P-Tuning做法是用一些伪提示代替这些显式的Prompt也就是将自然语言提示的token,替换为可训练的嵌入。
具体的做法是可以用预训练词表中的unused token作为伪提示,然后通过训练去更新这些token的参数,P-Tuning的Prompt不是我们可以看得懂的字符,而是一些隐式的、经过训练的、模型认为最好的Prompt tokens。
而相比Prefix Tuning,P-Tuning加了可微的virtual token,但是仅限于输入,没有在每一层都加;另外virtual token的位置也不一定是前缀,插入的位置是可选的,这里的出发点实际是把传统人工设计模版中的真实token替换成可微的virtual token。
经过预训练的LM的词嵌入已经变得高度离散,如果随机初始化virtual token,容易优化到局部最优值,这些virtual token理论是应该有相关关联的,如何建模这种关联也是问题,因此,论文作者通过实验发现用一个Prompt Encoder来编码会收敛更快,效果更好。即用一个LSTM+MLP去编码这些virtual token以后,再输入到模型。换言之,P-Tuning并不是随机初始化几个新token然后直接训练的,而是通过一个小型的LSTM模型把这几个Embedding算出来,并且将这个LSTM模型设为可学习的。
当预训练模型足够大的时候可能无法Fine-tune整个模型,而P-Tuning可以选择只优化几个token的参数,因此优化所需要的显存和算力都会大大减少,训练也会变快,同时效果也与Fine-tune基本持平,所以P-Tuning提供了一种在有限算力下调用大型预训练模型的思路。主要贡献如下:
P-Tuning大大减少了不同离散提示之间的性能差距,从而提高了语言模型适配的稳定性。
Prompt Tuning由谷歌在2021年论文《The Power of Scale for Parameter-Efficient Prompt Tuning》中提出。Prompt-Tunning是prefix-Tunning的简化版本,与LM微调(Language Model Fine-tuning)相比,Prompt Tuning是一种更加简单高效的方法,只需要在输入文本前添加少量可训练的“软提示”(soft prompts),而不需要对整个模型进行微调。这种方法可以在保留预训练模型通用能力的同时,针对特定任务进行高效的定制和迁移,在大型语言模型上取得了与完全微调相当的性能。
Prompt Tuning是一种简单有效的机制,用“soft prompts”来调节预训练的语言模型,使其能够执行特定的下游任务。与GPT-3使用的离散文本提示不同,“soft prompts”通过反向传播进行学习,可以利用任意数量的标注样本来进行调整。与完全微调相比,Prompt Tuning只需要更新少量的提示参数,而不需要对整个预训练模型进行微调。这种参数高效性使得Prompt Tuning的性能能够接近完全微调,且在大规模语言模型上表现更加出色。
论文中,对比Prefix-Tunning,Prompt Tuning使用100个prefix token作为默认参数,大于以上prefix-tuning默认的10个token。不过差异在于prompt-Tunning只对输入层(Embedding)进行微调,而Prefix是对虚拟Token对应的上游layer全部进行微调。因此Prompt tuning的微调参数量级要更小,且不需要修改原始模型结构,相当于进行了简化。
相同的prefix长度,Prompt Tuning(<0.01%)微调的参数量级要比Prefix-tuning(0.1%~1%)小10倍以上,如下图所示。
为什么上面prefix-tuning只微调embedding层效果就不好,放在Prompt Tuning这里效果就好了呢?因为评估的任务不同无法直接对比,主要有两个因素,一个是模型规模,另一个是继续预训练,前者的可能更大些,在下面的实验中会提到。
在SuperGLUE任务上,随着模型参数的上升,Prompt Tuning快速拉近和模型微调的效果,110亿的T5模型(上面prefix-tuning使用的是15亿的GPT2),已经可以打平在下游多任务联合微调的LM模型,并且远远的甩开了Prompt Design(GPT3 few-shot)。
作者也做了全面的消融实验,包括以下4个方面,最核心的感受就是随着模型规模的增大,Prompt Tuning与完全微调的性能差距逐渐缩小,最终达到了相当的水平。
1. prompt长度(a):固定其他参数,作者尝试了{1,5,20,100,150},当模型规模到百亿后,只要prompt长度大于1,更长的prompt并不能带来效果提升。
2. Prompt初始化(b):作者尝试了随机uniform初始化,用标签文本空间初始化,和用Top5K高频词采样初始化,在10^8规模,标签词初始化效果最好。作者发现预测label也会在对应prompt空间内。不过到百亿规模后,初始化带来的影响就会消失。
3. T5继续预训练(c):作者认为T5本身的Span Corruption预训练目标和掩码词,并不适合冻结LM的场景,因为在微调中模型可以调整预训练目标和下游目标的差异,而只使用prompt可能无法弥合差异。其实这里已经能看出En-Dn框架在生成场景下没有GPT这样的Decoder来的自然。因此作者基于LM目标对T5进行继续预训练。
4. 继续预训练step(d):以上的继续预训练steps,继续预训练步数越高,模型效果在不同模型规模上越单调。
Prompt Tuning为大型预训练语言模型的高效复用和迁移提供了一种有效的解决方案,具有重要的理论和实践意义。主要优势和贡献贡献如下:
1. 参数高效性:与其他方法相比,Prompt Tuning 只需要更新少量的提示参数,而不需要对整个预训练模型进行微调。
2. 性能接近完全微调:通过在T5模型上的实验,随着模型规模的增大,Prompt Tuning 的性能越来越接近完全微调,在某些任务上甚至能超过完全微调。
3. 泛化能力强:通过将任务特定的信息编码在提示中,同时保持模型参数不变,Prompt Tuning 在领域迁移问题上表现更好。
4. 高效推理:由于只需要更新少量的提示参数,Prompt Tuning 保留了预训练模型的高效推理能力。
5. 可解释性:学习到的提示参数具有一定的可解释性,可以帮助理解模型的行为。
6. 提示集成:通过学习多个提示并进行集成,可以进一步提高性能,且更加高效。
总的来说,Prompt Tuning 在参数高效性、性能、泛化能力、推理效率以及可解释性等方面都展现出了优势。
P-Tuning在规模通用性(规模较小的模型P-Tuning和Fine-tune表现仍有很大差异)、任务通用性(对硬序列标记任务的有效性尚未得到验证)存在局限性,且缺少深度Prompt优化,因此清华大学的研究者于2022年发表论文《P-Tuning v2:Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks》提出了P-Tuning的v2版本,利用并改进深度Prompt优化(如Prefix Tuning),提供一个跨规模和NLU任务的通用解决方案。
P-Tuning v2方法不仅仅在输入层,而是在每一层都加入了Prompt tokens作为输入,这样做有两方面好处:
加入到更深层结构中的Prompt能给模型预测带来更直接的影响。
如下图所示,橙色块(即h0, ..., hi)指的是可训练的Prompt嵌入;蓝色块是由冻结的预训练语言模型存储或计算的嵌入。
可以看作是将文本生成的Prefix Tuning技术适配到NLU任务中,然后做了如下具体改进:
1. 移除重参数化的编码器
以前的方法利用重参数化功能来提高训练速度和鲁棒性(如:Prefix Tuning中的MLP、P-Tuning中的LSTM)。在P-Tuning V2中,作者发现重参数化的改进很小,尤其是对于较小的模型,同时还会影响模型的表现,所以去掉了重参数化的编码器。
2. 针对不同任务采用不同的Prompt长度
Prompt长度在P-Tuning V2方法中起着核心作用。在实验中,作者发现不同的NLU任务通常用不同的Prompt长度来实现其最佳性能,其实这与Prefix-Tuning中的发现一致,不同的文本生成任务可能有不同的最佳Prompt长度。
3. 引入可选的多任务学习
先在多任务的Prompt上进行预训练,然后再适配下游任务。多任务学习对P-Tuning v2来说是可选的,但可能是相当有帮助的。一方面,连续提示的随机惯性给优化带来了困难,这可以通过更多的训练数据或与任务相关的无监督预训练来缓解;另一方面,连续提示是跨任务和数据集的特定任务知识的完美载体。实验表明,在一些困难的序列任务中,多任务学习可以作为P-Tuning v2的有益补充。
4. 回归传统的分类标签范式,而不是映射器
标签词映射器(Label Word Verbalizer)一直是Prompt Tuning(提示优化)的核心组成部分,它将one-hot类标签变成有意义的词,但在全数据监督设置中Verbalizer并不是必须的。它阻碍了Prompt Tuning在无实际意义的标签和句子嵌入的场景中的应用。因此,P-Tuning v2回归传统的CLS标签分类范式,采用随机初始化的分类头(Classification Head)应用于tokens之上,以增强通用性,可以适配到序列标注任务。
P-Tuning v2是一种在不同规模和任务中都可与Fine-Tuning相媲美的方法。P-Tuning v2对从330M到10B的模型显示出一致的改进,并在序列标注等困难的序列任务上以很大的幅度超过了Prompt Tuning和P-Tuning。主要贡献如下:
lPrompt Tuning通过仅优化冻结语言模型的连续提示来减少每个任务的存储和内存使用量。
P-Tuning v2可以作为Fine-Tuning的替代方案,并为未来的研究提供强有力的基线。
近年来,随着ChatGPT的爆火,大语言模型以其出色的自然语言处理能力和语言生成能力在科技领域引起了巨大的关注。使得人们再次看见了实现人工智能的希望。虽然,大语言模型能够产生流畅、连贯的文本,回答复杂的问题,进行有趣的对话,并提供各种实用的功能,并且在多个领域的应用也取得了突破性进展。但是,其前所未有的规模也带来了巨大的计算成本。这些模型通常由数十亿个参数组成,需要大量计算资源才能执行。特别是在为特定领域或者任务定制模型时,其庞大的算力需求带来了很大的挑战。那么,在有限的资源下如何微调巨大的语言模型?
参数高效微调(Parameter-efficient fine-tuning, PEFT)为大家提供了一个解决方案。PEFT是指通过最小化微调参数的数量和计算复杂度,来提高预训练模型在新任务上的性能,从而缓解大型预训练模型的训练成本。如此,即使计算资源受限,也可以利用预训练模型的知识来迅速适应新任务,实现高效的迁移学习。其相较于对预训练语言模型(PLM)进行全量微调的高代价,仅需要微调少量模型参数,可以显著降低了算力成本。PEFT优势如下所示:
灵活性和适应性:其可以在各种任务和领域中对大型语言模型进行微调,如自然语言处理和计算机视觉等。
当前,PEFT方法可以分为三类,不同的方法在预训练模型的不同位置添加参数进行下游任务的适配:
如上图,使用虚线边框来表示这些方法添加的模块。绿色部分是 Adapter ,其将Adapter模块插入到预训练模型的中间层;蓝色部分是 Prefix Tuning ,其在输入或者隐层添加多个可学习的前缀tokens;红色部分是 LoRA,其通过学习两个小参数的低秩矩阵来近似权重矩阵的参数更新。
当前,Huggface开源社区中的高效微调大模型的库已支持LoRA、IA3、P-tuning、Prefix tuning、Prompt tuning等方法。
笔者实践了xTuring、LLaMA-Factory等一些大模型微调工具,基本都可以通过简单的操作高效地完成微调任务。
xTuring项目团队Stochastic由机器学习工程师、博士后和哈佛研究生组成,旨在提供快速、高效和简单的大模型微调,例如LLaMA、GPT-J、GPT-2、OPT、Cerebras-GPT、Galactica 等。通过提供一个易于使用的界面来将大模型定制为你自己的数据和应用程序,xTuring 使构建和控制LLM变得简单。整个过程可以在本地的计算机或私有云中完成,确保数据隐私和安全。
LLaMA-Factory集合了多种常见的大模型、微调方法和微调参数,有一个强大完善的用户界面。用户只需要按格式要求准备好自己的训练数据集,选择好所需的大模型、微调方法和微调参数,即可一键执行大模型微调,过程中还可以实时查看loss的变化情况。训练完可以基于自己的验证数据集进行验证,还能直接加载微调后的模型,在对话界面直接验证微调后的问答效果。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-12-22
Hugging Face 发布免费开放课程,微调本地LLMs模型
2024-12-22
我对Multi-Agent集成业务场景设计
2024-12-21
一文回顾OpenAI系列发布会:从工具到AGI,OpenAI的12天进化论
2024-12-19
强化微调技术详解:开启AI模型定制的新篇章
2024-12-18
OpenAI 年底「百亿补贴」来了,满血 o1 API 开放,成本暴跌,定制升级
2024-12-18
腾讯AI团队:用Ray分布式计算效率提升800%
2024-12-18
OpenAI 新货详解:大量接口更新,还有 Go/Java SDK
2024-12-18
聊聊对强化微调(RFT)的理解及看法
2024-09-18
2024-07-11
2024-07-11
2024-07-09
2024-06-11
2024-10-20
2024-07-23
2024-07-20
2024-07-26
2024-07-12