LLM 参数高效微调技术
- LLM 高效微调技术
- Adapter Tuning (2019 google,在Transformer 结构中嵌入adapter,tuning on BERT)
- Prefix Tuning (2021.01 斯坦福,通过virtual token构造连续型隐式prompt)
- Prompt Tuning(2021.04,google)
- P-Tuning V1/V2 (清华,2021.03)
- P-Tuning V2 (2022,)
- LoRA(2021)
- QLoRA (2023.05)
- 其他:
参数高效微调是指冻结LLM的大部分模型参数,微调少量的或者额外新增的模型参数。目前高效微调技术主要由:Prefix Tuning、P-Tuning V1/V2、LoRA、QLoRA.
微调技术的发展:
adapter tuning -> prefix tuning ->P-Tuning v1/v2 -> LoRA -> QLoRA.
Adapter Tuning (2019 google,在Transformer 结构中嵌入adapter,tuning on BERT)
- Parameter-Efficient Transfer Learning for NLP
- 谷歌的研究人员于2019年在论文《Parameter-Efficient Transfer Learning for NLP》提出针对 BERT 的 PEFT 微调方式,拉开了 PEFT 研究的序幕。他们指出:在面对特定的下游任务时,如果进行 Full-fintuning(即预训练模型中的所有参数都进行微调),太过低效, 而如果采用固定预训练模型的某些层,只微调接近下游任务的那几层参数,又难以达到较好的效果. 于是设计了如下结构:
- 如上图左侧所示,将其嵌入 Transformer 的结构里面,在训练时,固定住原来预训练模型的参数不变,只对新增的 Adapter 结构进行微调
- 如上图右侧所示,同时为了保证训练的高效性(也就是尽可能少的引入更多参数),他们将 Adapter 设计为这样的结构:
- 首先是一个 down-project 层将高维度特征映射到低维特征,然后过一个非线形层之后,再用一个 up-project 结构将低维特征映射回原来的高维特征;
- 同时也设计了 skip-connection 结构,确保了在最差的情况下能够退化为 identity。
- 从实验结果来看,该方法能够在只额外对增加的3.6%参数规模(相比原来预训练模型的参数量)的情况下取得和Full-finetuning接近的效果(GLUE指标在0.4%以内)
Prefix Tuning (2021.01 斯坦福,通过virtual token构造连续型隐式prompt)
在prefix-tuning之前的工作主要是人工设计离散的template或者自动化搜索离散template,问题在于最终的性能对人工设计的template的特别敏感:加一个词或者少一个词,或者变动位置,都会造成很大的变化,所以这种离散化的token的搜索出来的结果可能并不是最优的.
坦福的研究人员于2021年年初通过此论文《Prefix-Tuning:Optimizing Continuous Prompts for Generation》提出Prefix Tuning方法,其使用连续的virtual token embedding来代替离散的token,且与Full-finetuning更新所有参数的方式不同,如下图所示
- 在输入token之前构造一段任务相关的virtual tokens作为Prefix,训练时冻结Transformer参数,只更新prefix参数。
下图是在自回归模型和encoder-decoder模型的例子
框架可以理解为如下:
对于上述这个过程,有以下几点值得注意
- 该方法其实和构造Prompt类似,只是Prompt是人为构造的“显式”的提示,并且无法更新参数,而Prefix则是可以学习的“隐式”的提示
- 同时,为了防止直接更新Prefix的参数导致训练不稳定的情况,特在Prefix层前面加了MLP结构(相当于将Prefix分解为更小维度的Input与MLP的组合后输出的结果),训练完成后,只保留Prefix的参数
- prefix-prompt的效果优于adapter tuning 和 finetune最上面的两层,最终和全参数finetune差不多,且在低资源情况下,效果优于finetune
- 更长的前缀意味着更多的可微调参数,效果也变好,不过长度还是有阈值限制的(table-to-text是10,summarization是200)
- 可调参数作为前缀,比作为中缀更好一点。毕竟对于自回归模型,每个位置只能关注到它之前的位置,如果在中间的话 前面部分无关关注到中间。
Prompt Tuning(2021.04,google)
2021年4月,google research 在论文 The Power of Scale for Parameter-Efficient Prompt Tuning中提出Prompt Tuning.
Prompt Tuning原理如下图所示:冻结主模型全部参数,在训练数据前加入一小段Prompt,只训练Prompt的表示层,即一个Embedding模块。论文实验表明,只要模型规模够大,简单加入 Prompt tokens 进行微调,就能取得很好的效果。
大体框架如下:
-
该方法可以看做是对Prefix tuning的简化版本 。
-
Prefix tuning 是在每次前面都添加前缀token来学习。Prompt Tuning是使用single prompt representation prepended to the embeded input. 需要的参数更少,并且也允许transformer 更新中间层的任务表示。
-
Prefix Tuning 依赖于 前缀的reparameterization 来稳定学习,这需要大量的参数。PromptTuning 不要reparamterization 并且在模型尺寸和SuperGLUE任务上都很鲁棒。
-
PromptTuning 冻结整个预训练模型,只允许每个下游任务在输入文本前添加额外的k个可调tokens(意味着它给每个任务都定义了自己的Prompt,在输入层加入prompt tokens,即We freeze the entire pre-trained model and only al-low an additional k tunable tokens per downstreamtask to be prepended to the input text)
-
Model tuning需要为每个下游任务生成整个预训练模型的任务特定副本,并且推理必须分批执行
-
Prompt tuning只需要为每个任务存储一个小的特定于任务的提示,并使用原始的预训练模型支持混合任务推理
-
对于T5“XXL”模型,对tuned model而言,每个副本需要110亿个参数,相比之下,对tuned prompts而言,每个任务只需要20,480个参数—假设提示长度为5个tokens,则减少了5个数量级以上
-
且通过实验发现,随着预训练模型参数量的增加,Prompt Tuning的方法会逼近全参数微调的结果
P-Tuning V1/V2 (清华,2021.03)
将自然语言的离散模版转化为可训练的隐式prompt (连续参数优化问题)
清华大学的研究者于2021年3月通过此篇论文《GPT Understands, Too》提出P-Tuning,其与prefix tuning类似:比如考虑到神经网络本质上是连续的,故离散提示可能不是最优的(sinceneural networks are inherently continuous, discrete promptscan be sub-optimal ),从而也采取连续的提示
总之,P-Tuning成功地实现了模版的自动构建,且借助P-tuning,GPT在SuperGLUE上的成绩首次超过了同等级别的BERT模型,这颠覆了在那年之前“GPT不擅长NLU”的结论,也是该论文命名的缘由
P-Tuning是在Prompt-Tuning的基础上,对Prompt部分进行进一步的编码计算,加速收敛。具体来说,PEFT中支持两种编码方式,一种是LSTM,一种是MLP。与Prompt-Tuning不同的是,Prompt的形式只有Soft Prompt。
P Tuning将Prompt转换为可以学习的Embedding层,并用MLP+LSTM的方式来对Prompt Embedding进行一层处理。
- 相比Prefix Tuning,P Tuning仅限于输入层,没有在每一层都加virtual token。
- 经过预训练的LM的词嵌入已经变得高度离散,如果随机初始化virtual token,容易优化到局部最优值,而这些virtual token理论是应该有相关关联的。因此,作者通过实验发现用一个prompt encoder来编码会收敛更快,效果更好。即用一个LSTM+MLP去编码这些virtual token以后,再输入到模型。
- 实验中发现,相同参数规模,如果进行全参数微调,Bert的在NLU(自然语言理解)任务上的效果,超过GPT很多;但是在P-Tuning下,GPT可以取得超越Bert的效果
P-Tuning V2 (2022,)
Prompt Tuning和P-Tuning等方法存在两个主要的问题:
- 第一,缺乏模型参数规模和任务通用性。
- 缺乏规模通用性:Prompt Tuning论文中表明当模型规模超过100亿个参数时,提示优化可以与全量微调相媲美。但是对于那些较小的模型(从100M到1B),提示优化和全量微调的表现有很大差异,这大大限制了提示优化的适用性。
- 缺乏任务普遍性:尽管Prompt Tuning和P-tuning在一些 NLU 基准测试中表现出优势,但对硬序列标记任务(即序列标注)的有效性尚未得到验证。
- 第二,缺少深度提示优化。我们知道在Prompt Tuning和P-tuning中,只被插入transformer第一层的输入embedding序列中,在接下来的transformer层中,插入Prompt的位置的embedding是由之前的transformer层计算出来的。
- 由于序列长度的限制,可调参数的数量是有限的。
- 输入embedding对模型预测只有相对间接的影响。
考虑到这些问题,作者提出了P-Tuning v2。
Prefix Tuning原理如下图所示:相较于Prompt-Tuning和P-tuning,Prefix-Tuning不是将Prompt加在输入的Embedding层,而是将其作为可学习的前缀,放置在Transformer模型中的每一层中,具体表现形式为past_key_values。
P-Tuning V2和Prefix Tuning的区别主要在于:移除重参数化的编码器,即没有MLP。
P-Tuning V2具体做法基本同Prefix Tuning,可以看作是将文本生成的Prefix Tuning技术适配到NLU任务中,然后做了一些改进:
1、移除重参数化的编码器。以前的方法利用重参数化功能来提高训练速度和鲁棒性(如:Prefix Tuning中的MLP、P-Tuning中的LSTM)。在作者发现重参数化的改进很小,尤其是对于较小的模型,同时还会影响模型的表现。
2、针对不同任务采用不同的提示长度。
提示长度在提示优化方法的超参数搜索中起着核心作用。在实验中,作者发现不同的理解任务通常用不同的提示长度来实现其最佳性能。
从图3中,可以观察到,针对简单任务:较短的Prompt(20)即可取得不错的效果。针对复杂任务:如阅读理解,需要更长的Prompt(100)。
重参数化与最佳提示长度有密切关联。例如,在RTE、CoNLL04和BoolQ中,MLP重参数化比嵌入更早达到最佳结果。
3、引入多任务学习(MPT-2)。先在多任务的Prompt上进行预训练,然后再适配下游任务
P-Tuning v2是一种在不同规模和任务中都可与微调相媲美的提示方法。P-Tuning v2对从330M到10B的模型显示出一致的改进,并在序列标注等困难的序列任务上以很大的幅度超过了Prompt Tuning和P-Tuning。
LoRA(2021)
参考LLM指令微调
QLoRA (2023.05)
To be added more details about 模型量化
本质是对LoRA的改进,相比LoRA进一步降低显存消耗.
- LoRa为LLM的每一层添加了少量的可训练参数(适配器),并冻结了所有原始参数。这样对于微调,只需要更新适配器权重,这可以显著减少内存占用
- 而QLoRa更进一步,引入了4位量化、双量化和利用nVidia统一内存进行分页
- 所有这些步骤都大大减少了微调所需的内存,同时性能几乎与标准微调相当
(QLoRA通过将模型量化到4位精度并使用分页优化器管理内存峰值来改进LoRA)
其他:
- Prompt Tuning 和 P-Tuning 有啥区别呢?
这两个文章发布时间相差1个月,差不多是同一时间段的工作。整体思想差不多 都是只插入第一层的输入embedding序列中。只是P-Tuning在Prompt-Tuning的基础上,对Prompt部分进行进一步的编码计算,加速收敛。具体来说,PEFT中支持两种编码方式,一种是LSTM,一种是MLP。与Prompt-Tuning不同的是,Prompt的形式只有Soft Prompt。 - P-TuningV2 和 prefix 有啥区别?
参考:
参数高效微调PEFT(二)快速入门P-Tuning、P-Tuning V2
Prompt-Tuning——深度解读一种新的微调范式
参考:https://blog.csdn.net/v_JULY_v/article/details/132116949?spm=1001.2014.3001.5501