Skip to content

大模型(LLMs)参数高效微调(PEFT)面试指南

整理自:AiGC面试宝典 作者:宁静致远 日期:2023年09月18日


1. 微调方法有哪些?如何微调?

1.1 全参数微调(Full Fine-tuning,FT)

也叫 fine-tuning,是BERT时代一直使用的微调方法。训练时,全部参数权重参与更新以适配下游领域数据,效果好但显存占用大。

📝 通俗解释:就像你要把一个已经训练好的厨师改造成川菜师傅,全参数微调就是让厨师重新学习所有菜品的做法,花时间精力多(需要更新所有参数),但学习效果最全面。

1.2 参数高效微调(PEFT)

包括 P-tuningLoRAPrompt TuningAdaLoRADelta Tuning 方法,只让部分模型参数参与微调,训练速度快、显存占用少。效果与FT相比可能会有一定损失,但通常能达到接近FT的水平。

📝 通俗解释:还是把厨师改造成川菜师傅的例子,PEFT就像是只让厨师学习几道招牌川菜,不需要重新学所有菜品。这样学习速度快(只更新少量参数),但掌握的知识可能没那么全面。

1.3 实验对比数据

实验一:链家BELLE技术报告

结论:FT效果稍好于LoRA

模型平均分数额外参数量训练时间(小时/epoch)
LLaMA-13B + LoRA(2M)0.64828M10
LLaMA-7B + LoRA(4M)0.62417.9M14
LLaMA-7B + LoRA(2M)0.60917.9M7
LLaMA-7B + LoRA(0.6M)0.58917.9M5
LLaMA-7B + FT(2M)0.710-31
LLaMA-7B + FT(0.6M)0.686-17
LLaMA-7B + FT(2M) + LoRA(math_0.25M)0.72917.9M-
LLaMA-7B + FT(2M) + FT(math_0.25M)0.738-4

📝 通俗解释:从这个表格可以看出,LoRA训练速度很快(10小时 vs 31小时),但效果确实比全参数微调差一点(0.648 vs 0.710)。不过LoRA的参数量非常少(28M vs 全模型13B),性价比很高。

实验二:AdaLoRA论文(DeBERTaV3-base模型)

结论:AdaLoRA效果稍好于FT

方法参数量MNLI m/mmSST-2 AccCoLA MccQQP Acc/F1QNLI AccRTE AccMRPC AccSTS-B Corr平均分
Full FT184M89.90/90.1295.6369.1992.40/89.8094.0383.7589.4691.6088.09
BitFit0.1M89.37/89.9194.8466.9688.41/84.9592.2478.7087.7591.3586.02
HAdapter1.22M90.13/90.1795.5368.6491.91/89.2794.1184.4889.9591.4888.12
PAdapter1.18M90.33/90.3995.6168.7792.04/89.4094.2985.2089.4691.5488.24
LoRA(r=8)1.33M90.65/90.6994.9569.8291.99/89.3893.8785.2089.9591.6088.34
AdaLoRA1.27M90.76/90.7996.1071.4592.23/89.7494.5588.0990.6991.8489.31

📝 通俗解释:在这个实验中,AdaLoRA只用了1.27M参数(相当于全参数微调的0.07%),效果却超过了全参数微调(89.31 vs 88.09)!这说明合适的PEFT方法不仅省资源,还能取得更好的效果。


2. 为什么需要PEFT?

在面对特定的下游任务时,如果进行 Full Fine-tuning(对预训练模型的所有参数都进行微调),会存在以下问题:

  • 计算成本高:需要更新数十亿参数,显存占用大
  • 训练时间长:全参数反向传播计算量大
  • 资源消耗大:普通开发者难以承担

而如果采用固定预训练模型的某些层,只微调接近下游任务的那几层参数的方式,又难以达到较好的效果。

📝 通俗解释:想象你要修改一本百科全书中的一章内容。全参数微调就像是重印整本书,成本很高;而只改几页又可能让内容不连贯。PEFT就像是找到了一个巧妙的书签方法,既不用重印全书,又能准确修改内容。


3. PEFT是什么?

PEFT(Parameter-Efficient Fine-Tuning)技术旨在通过最小化微调参数的数量和计算复杂度,来提高预训练模型在新任务上的性能,从而缓解大型预训练模型的训练成本。

这样一来,即使计算资源受限,也可以利用预训练模型的知识来迅速适应新任务,实现高效的迁移学习。

📝 通俗解释:PEFT的核心思想是"借力"——利用预训练模型已经学到的知识,通过少量参数的调整来适应新任务,就像是在巨人肩膀上摘苹果,不需要从零开始种树。


4. PEFT有什么优点?

  1. 大幅降低训练成本:只更新少量参数,显存占用和训练时间都大幅减少
  2. 效果出色:部分PEFT方法能达到接近甚至超过全参数微调的效果
  3. 缓解灾难性遗忘:保留原始模型能力,避免微调后遗忘了预训练学到的知识
  4. 降低使用门槛:让更多人能够参与到深度学习研究中来

📝 通俗解释:PEFT就像给汽车装了一个智能辅助系统,不用更换整个发动机(预训练模型),只加装一个小装置(少量可训练参数),就能让汽车适应新的赛道(下游任务),省油(显存)又省时(训练时间)。


5. 不同微调方法的显存与速度对比

方法batch size精度显存占用推理速度
LoRA (r=8)16FP1628GB8 ex/s
LoRA (r=8)8FP1624GB8 ex/s
LoRA (r=8)4FP1620GB8 ex/s
LoRA (r=8)4INT810GB8 ex/s
LoRA (r=8)4INT48GB8 ex/s
P-Tuning v2 (p=16)4FP1620GB8 ex/s
P-Tuning v2 (p=16)4INT816GB8 ex/s
P-Tuning v2 (p=16)4INT412GB8 ex/s
Freeze (l=3)4FP1624GB8 ex/s
Freeze (l=3)4INT812GB8 ex/s

📝 通俗解释:从这个表格可以看到,使用INT4量化的LoRA只需要8GB显存就能运行,这在消费级显卡上就能实现!精度从FP16降到INT4,显存减少到原来的1/3到1/4,但推理速度基本不变。


6. PEFT和全量微调的区别

Fine-tuning只能改变风格,不能改变知识,原因在于:

  • LoRA等方法本质上是低秩近似,是对原始权重矩阵的微小调整,无法对模型产生根本性的改变
  • 全量微调可以改变知识,因为所有参数都参与更新,模型能够学习到全新的知识

📝 通俗解释:这就像给一幅画做滤镜(PEFT)vs 重画整幅画(全量微调)。加滤镜可以改变风格色调,但无法改变画面内容;而重画则可以完全改变主题和细节。


7. 多种高效微调方法对比

7.1 方法选择建议

  • 显存资源有限:推荐 QLoRA(LoRA + 量化)
  • 简单任务场景:可以考虑 P-TuningPrompt Tuning
  • 综合评估优秀的P-Tuning v2LoRA

7.2 方法对比表(五个维度)

方法类型存储高效内存高效减少反向传播推理开销
AdaptersAyesyesno额外FFN层
AdaMixAyesyesno额外FFN层
SparseAdapterASyesyesno额外FFN层
BitFitSyesyesno
DiffPruningSyesnono
Prompt TuningAyesyesno额外输入
Prefix-TuningAyesyesno额外输入
LoRARyesyesno
AdaLoRARyesyesno
QLoRARyesyesno
(IA)³Ayesyesno额外门控
UniPELTARyesyesno额外FFN和输入

📝 通俗解释

  • 类型列:A=Additive(添加参数),S=Selective(选择参数),R=Reparametrization(重参数化)
  • 推理开销:无开销的方法(如LoRA、BitFit)更适合生产环境,因为不需要额外的计算
  • 存储高效:指保存微调后的模型需要额外的磁盘空间

7.3 参数量对比表

方法可训练参数占比改变参数占比<1B模型<20B模型>20B模型
Adapters0.1-6%0.1-6%
BitFit0.05-0.1%0.05-0.1%
Prompt Tuning0.1%0.1%
Prefix-Tuning0.1-4%0.1-4%
LoRA0.01-0.5%~0.5%或~30%
AdaLoRA0.05-0.5%~0.5%
QLoRA0.01-0.5%~0.5%
(IA)³0.02%0.02%

📝 通俗解释:从表格可以看出,Prompt TuningPrefix TuningLoRA 是目前应用最广泛的方法,因为它们在不同参数规模的模型上都经过验证过。LoRA的改变参数占比有时会到30%,这是因为重参数化后需要合并到原模型中。


8. 当前高效微调技术存在的问题

8.1 参数计算口径不一致

参数计算可分为三类:

  • 可训练参数数量:梯度优化更新的参数数量
  • 改变参数数量:微调后模型与原始模型的差异
  • 差异等级:模型之间差异的程度

例如:DiffPruning实际更新0.5%的参数,但参与训练的参数数量是200%。

📝 通俗解释:这就像描述一本书的修改量,可以说"修改了10个字"(可训练参数),也可以说"修改了5%的内容"(改变参数),这两种说法完全不一样,容易造成混淆。

8.2 缺乏模型大小的考虑

已有研究表明,大模型在微调中需要更新的参数量更小。因此,模型大小在比较不同PEFT方法时也需要考虑。

8.3 缺乏测量基准和评价标准

不同方法使用的模型/数据集组合都不一样,评价指标也不一样,难以得到有意义的结论。

8.4 代码实现可读性差

很多开源代码都是简单拷贝Transformer代码库后小修小补,不使用git fork,难以找出改动位置,可复用性也比较差。

📝 通俗解释:这就相当于不同厨师做同一道菜,有的放盐,有的放酱油,调料用量也不一样,我们很难比较谁的菜做得更好吃。


9. 高效微调技术最佳实践

针对以上问题,建议按照以下最佳实践实施:

  1. 明确指出参数数量类型:区分可训练参数和改变参数
  2. 使用不同大小的模型进行评估:小模型、中模型、大模型都要测试
  3. 和类似方法进行公平比较:使用相同的模型、数据集、评价指标
  4. 标准化PEFT测量基准:建立统一的评测框架
  5. 重视代码清晰度:以最小化方式实现,便于复现和复用

10. PEFT存在的问题?

相比全参数微调,大部分PEFT技术目前存在以下两个问题:

  1. 推理速度会变慢:部分方法需要额外的计算(如Adapter需要额外的FFN层)
  2. 模型精度可能变差:虽然差距在缩小,但部分场景下仍不如全参数微调

📝 通俗解释:这世界上没有免费的午餐。PEFT省了训练时的显存和时间,但可能在推理时需要付出一点代价。不过随着技术发展,这个差距正在越来越小。


11. 总结:参数高效微调方法分类

11.1 增加额外参数(Additive)

  • Prefix Tuning:在输入前添加可学习的虚拟token
  • Prompt Tuning:类似Prefix Tuning,但更轻量
  • P-Tuning:使用LSTM/MLP对prompt进行编码
  • P-Tuning v2:在每一层都添加可学习参数
  • Adapter Tuning:在Transformer层中添加瓶颈层

11.2 选取一部分参数更新(Selective)

  • BitFit:只微调模型的偏置项(bias)
  • Freeze:冻结大部分层,只训练少量层

11.3 引入重参数化(Reparametrization-based)

  • LoRA:通过低秩矩阵近似进行微调
  • AdaLoRA:自适应调整LoRA的秩
  • QLoRA:LoRA + 量化,进一步降低显存

11.4 混合高效微调

  • MAM Adapter:混合使用多种Adapter技术
  • UniPELT:结合LoRA、Prefix-Tuning、Adapter

📝 通俗解释:PEFT方法可以类比成不同的"健身方式":

  • 增加额外参数 = 穿一件功能外套(额外加东西)
  • 选取部分参数 = 只锻炼某些部位(选择性训练)
  • 重参数化 = 换个姿势发力(改变训练方式)
  • 混合方法 = 综合健身(组合多种方式)

参考资料

  • BELLE技术报告:《A Comparative Study between Full-Parameter and LoRA-based Fine-Tuning on Chinese Instruction Data for Instruction Following Large Language Model》
  • PEFT论文:《ADAPTIVE BUDGET ALLOCATION FOR PARAMETER-EFFICIENT FINE-TUNING》

(本文持续更新中...)

基于 MIT 许可发布