您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
   
 
     
   
 
 订阅
四两拨千斤,训练大模型的PEFT方法
 
 
   次浏览      
 2024-1-12
 
编辑推荐:
本文主要介绍了训练大模型的PEFT方法相关知识。希望对你的学习有帮助。
本文来自于CSDN,由火龙果软件Linda编辑,推荐。

自然语言处理进入大语言模型(Large Language Model, LLM)时代之后,模型的参数量级越来越庞大,以稍早之前的GPT-3为例,它有175B即1千7百5十万亿参数,而ChatGPT及后续模型则更大。一方面大语言模型解决自然语言处理任务所需的涌现能力确实需要如此量级的参数,另一方面如此巨大的参数会引起训练成本的急剧增加,甚至从消费级硬件角度来讲,用户全量训练大语言模型的参数的成本令人望而却步。大语言模型已经过pre-training阶段,于是就有学者提出是否能通过finetune一部分少量参数实现下游任务的精调,这催生了一系列PEFT(Parameter-Efficient Fine Tuning,PEFT,可译为参数高效精调)方法。

截止目前(2023年7月),PEFT一共有三类方法,不同的方法在以不同的形式在固定预训练模型参数的前提下添加少量的新参数来实现对下游任务的适配。三类方法列举如下:

Adapter-Tuning:在预训练模型的每一层新增浅层前馈网络或模块作为adapter以适配下游任务,训练时仅更新adapter的参数,存储时每个下游任务仅存储对应的adapter的参数。

Prefix/Prompt:在预训练模型的输入层或者一层增加一些可训练的虚拟tokens(也称作Prompt),只训练这些token的参数,存储时每个下游任务仅存储对应的token的参数。

LoRA:通过引入低秩矩阵参数参与模型前向传播(与原有部分参数产生的及或者相加)来适配下游任务,训练时仅更新低秩矩阵参数,存储时每个下游任务仅存储对应的低秩矩阵参数。

Adapter Tuning

Bert时代,自然语言处理范式为Pre-Training + Finetuning:即首先使用超大型语料库预训练一个通用语言模型,然后在各下游任务精调参数。我们可以将预训练模型(Pre-Training Model, PTM)到下游任务模型看作是一个迁移学习的过程。这种模式使得模型在不同的下游任务均能取得良好效果,但存在一个问题是训练每一个下游任务都相当于训练了一个新模型(预训练模型迁移学习时参数低效),这样比较繁琐且有训练有比较大的开销。那有没有可能存在更高效的迁移学习方式使得预训练模型能在不损失性能的前提下一次性高效迁移到所有下游任务呢,答案时有的。

Google研究人员在2019年的ICML上发表了一篇题为Parameter-Efficient Transfer Learning for NLP的论文,提出了Adapter tuning(可译为转换器微调)作为一种高效的迁移学习方法。该方法并不复杂,它在原始tranformer的基础上增加了一个新的模块Adapter module,Adapter module的架构可选,但论文提出一个非常简单的架构却可以实现非常好的效果。

原论文提出的架构如下图,作者在每一个transformer的2个前馈层之后加入一个新的组件Adapter module,每个adapter module包含三个部分:

Feedforward down-project层将输入的维度放缩到非常小的级别,以减少训练参数量

Nonlinearity引入非线性特征,矩阵运算 + 非线性等价于一层FFW

Feedforward up-project层将输入还原到原始维度,以参与后续计算

记输入原始维度为d dd,放缩后的维度为m mm,则Feedforward down-project层参数量为d ∗ m + m d*m+md∗m+m, Feedforward up-project层的参数量为m ∗ d + d m*d+dm∗d+d, 总参数量为2 m d + d + m 2md+d+m2md+d+m,但是m mm可以设置得非常小,即m ≪ d m\ll dm≪d,最终达到的效果是仅使用相当于原始模型参数总量的% 0.5 − % 8 \%0.5\ - \%8%0.5 −%8的新参数,却可以实现在全部下游任务上流式训练后公用一套参数,取得和每个任务都finetune一遍全量参数差不多的效果:

更多详细比较和其他信息参见原论文,需要补充说明的是,用来执行分类任务的最后一层,也是可训练参数的一部分。

Prefix Tuning

Generation

Finetuning在下游任务精调阶段更新预训练模型的所有参数,并为每一个任务保存一份预训练模型参数副本(如下图上半部分)。

红色部分表示更新,灰色部分参数不更新

Prefix-Tuning在模型执行不同的任务时添加不同的前缀(prefix),训练时固定预训练模型的原始参数,仅更新前缀部分的参数(上图下半部分)。前缀其实是连续的向量序列形式的可训练参数,从逻辑上可以认为是人为在输入前加入了一些虚拟token,前缀表示这些虚拟token产生的激活值。这使得不同的任务仅需要存储一份预训练模型参数加上每个任务对应的前缀,节省了可观的存储空间。

Prompt Tuning

Tuning

Prompt Tuning可以看作是Prefix Tuning的简化版本,仅在输入层加入了可训练的prompt token,无需引入MLP(如上图)。作者主要的目的是想说明只要模型的参数规模持续增大到一定量级(1 0 1 0 , 100 亿 10^10,100亿101

0,100亿)时,那么固定预训练模型的参数,仅需在输入文本前加入少量的可更新的token(称为prompt)就能够达到Finetuning的效果:

作者在论文中列出了一系列消融实验,比较了prompt长度、prompt初始化方法,预训练任务目标调整、LM adaptation(即下游任务finetuning)步数对模型最终效果的影响,感兴趣的读者可以打开论文一窥究竟,这里不再赘述。

P-Tuning

P-Tuning方法的提出是为了让GPT类模型可以更好的应用于自然语言理解(Natural Language Understanding,NLU)任务,它引入了可训练的的连续的embedding层参数作为prompt代替人工设计的prompt,prompt参见GPT-3原论文: Language Models are Few-Shot Learners。

作者通过实验证明了通过P-Tuning的方法可以是的GPT类模型在NLU方面达到BERT同样水平的效果,偶尔甚至能有更好的表现。

从方法上来讲,P-Tuning也是固定了预训练模型的参数,通过引入一部分额外参数加一个Bi-LSTM加DNN的简单Encoder(Encoder本身的参数也属于额外增加的部分)来实现NLU任务的训练,它跟Prefix有一下不同点:

Prefix-Tuning将额外的参数加在输入embedding开头,更像是一种Instruction;而P-Tuning则加在输入的一部分构成的prompt token embedding的左右两边。

Prefix Tuning在每个transformer前馈层都加入了Prefix Embedding,通过MLP来encoding;而P-Tuning则仅在输入层加入额外的embedding,并通过Bi-LSTM和MLP来进行初始化。

P-Tuning V2

P-Tuning V2版本则跟Prefix-Tuning一样将额外添加的token加入到了网络的每一层,训练时更新每一层的prompt token embedding,它同样也是仅适配NLU任务。这样的改动也使得相较于初版,P-Tuning V2具备以下2点优势:

(1) 拥有更多的可训练参数,表征能力更强,但总体仍维持少量 (初版0.1%,0.1%~3%)。

(2) 加入到更深层的网络结构中,对模型最终预测带来更直接的影响,能取得更好的效果。

从论文标题就能够看出,作者的目的是希望在不同参数规模的预训练模型、针对不同的下游任务都可以使用P-Tuning V2达到Fine-Tuning同等水平的效果。

LoRA

LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

核心思路是对模型参数做低秩分解,仅训练分解后的参数,模型部署也需额外保存低秩参数,计算时加上低秩参数部分。

LoRA的提出在上述PEFT方法之后,来自微软的研究者认为,现有的Adapter Tuning和Prefix Tuning这两种方法均有缺点:

Adapter Layers Introduce Inference Latency:

虽然Adapter后续又有很多变种,但无论如何额外添加的Adapter层都会拖慢推理速度

Directly Optimizing the Prompt is Hard:

应用Prefix-Finetuning时,直接优化prompt非常困难,而且其效果也不是随着训练参数的增加而单调递增

Aghajanyan等研究者在论文Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning提出了关于大模型的一个核心观察点:预训练模型存在一个低秩的“内在维度”(intrinsic dimension)使得其在被随机映射到一个更小的子空间时仍然可以高效学习。基于这种想法,作者假设预训练模型在转换到下游模型过程中也有一个内在维度,提出了下面的方法。

图中的A,B均为可训练参数,参数A=正态分布,B=0是初始化参数的方法

 

开源第三方库

huggingface开源了peft库,支持LoRA、Prefix Tuning、P-Tuning、Prompt Tuning、AdaLoRA等方法,并可以结合 Accelerate的DeepSpeed一起使用,实现高效训练。

git地址:https://github.com/huggingface/peft

 

pip install peft

 

LLM-Adapters在peft库基础上增加了adapter变种AdapterP、Parallel的支持。

git地址:https://github.com/AGI-Edgerunners/LLM-Adapters

 

 

 
   
次浏览       
相关文章

基于图卷积网络的图深度学习
自动驾驶中的3D目标检测
工业机器人控制系统架构介绍
项目实战:如何构建知识图谱
 
相关文档

5G人工智能物联网的典型应用
深度学习在自动驾驶中的应用
图神经网络在交叉学科领域的应用研究
无人机系统原理
相关课程

人工智能、机器学习&TensorFlow
机器人软件开发技术
人工智能,机器学习和深度学习
图像处理算法方法与实践

最新活动计划
QT应用开发 11-21[线上]
C++高级编程 11-27[北京]
LLM大模型应用与项目构建 12-26[特惠]
UML和EA进行系统分析设计 12-20[线上]
数据建模方法与工具 12-3[北京]
SysML建模专家 1-16[北京]
 
 
最新文章
AIGC技术与应用全解析
详解知识图谱的构建全流程
大模型升级与设计之道
自动驾驶和辅助驾驶系统
ROS机器人操作系统底层原理
最新课程
人工智能,机器学习和深度学习
人工智能与机器学习应用实战
人工智能-图像处理和识别
人工智能、机器学习& TensorFlow+Keras框架实践
人工智能+Python+大数据
成功案例
某综合性科研机构 人工智能与机器学习应用
某银行 人工智能+Python+大数据
北京 人工智能、机器学习& TensorFlow框架实践
某领先数字地图提供商 Python数据分析与机器学习
中国移动 人工智能、机器学习和深度学习