大模型(LLMs)参数高效微调(PEFT)面试指南
整理自:AiGC面试宝典 作者:宁静致远 日期:2023年09月18日
1. 微调方法有哪些?如何微调?
1.1 全参数微调(Full Fine-tuning,FT)
也叫 fine-tuning,是BERT时代一直使用的微调方法。训练时,全部参数权重参与更新以适配下游领域数据,效果好但显存占用大。
📝 通俗解释:就像你要把一个已经训练好的厨师改造成川菜师傅,全参数微调就是让厨师重新学习所有菜品的做法,花时间精力多(需要更新所有参数),但学习效果最全面。
1.2 参数高效微调(PEFT)
包括 P-tuning、LoRA、Prompt Tuning、AdaLoRA 等 Delta Tuning 方法,只让部分模型参数参与微调,训练速度快、显存占用少。效果与FT相比可能会有一定损失,但通常能达到接近FT的水平。
📝 通俗解释:还是把厨师改造成川菜师傅的例子,PEFT就像是只让厨师学习几道招牌川菜,不需要重新学所有菜品。这样学习速度快(只更新少量参数),但掌握的知识可能没那么全面。
1.3 实验对比数据
实验一:链家BELLE技术报告
结论:FT效果稍好于LoRA
| 模型 | 平均分数 | 额外参数量 | 训练时间(小时/epoch) |
|---|---|---|---|
| LLaMA-13B + LoRA(2M) | 0.648 | 28M | 10 |
| LLaMA-7B + LoRA(4M) | 0.624 | 17.9M | 14 |
| LLaMA-7B + LoRA(2M) | 0.609 | 17.9M | 7 |
| LLaMA-7B + LoRA(0.6M) | 0.589 | 17.9M | 5 |
| LLaMA-7B + FT(2M) | 0.710 | - | 31 |
| LLaMA-7B + FT(0.6M) | 0.686 | - | 17 |
| LLaMA-7B + FT(2M) + LoRA(math_0.25M) | 0.729 | 17.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/mm | SST-2 Acc | CoLA Mcc | QQP Acc/F1 | QNLI Acc | RTE Acc | MRPC Acc | STS-B Corr | 平均分 |
|---|---|---|---|---|---|---|---|---|---|---|
| Full FT | 184M | 89.90/90.12 | 95.63 | 69.19 | 92.40/89.80 | 94.03 | 83.75 | 89.46 | 91.60 | 88.09 |
| BitFit | 0.1M | 89.37/89.91 | 94.84 | 66.96 | 88.41/84.95 | 92.24 | 78.70 | 87.75 | 91.35 | 86.02 |
| HAdapter | 1.22M | 90.13/90.17 | 95.53 | 68.64 | 91.91/89.27 | 94.11 | 84.48 | 89.95 | 91.48 | 88.12 |
| PAdapter | 1.18M | 90.33/90.39 | 95.61 | 68.77 | 92.04/89.40 | 94.29 | 85.20 | 89.46 | 91.54 | 88.24 |
| LoRA(r=8) | 1.33M | 90.65/90.69 | 94.95 | 69.82 | 91.99/89.38 | 93.87 | 85.20 | 89.95 | 91.60 | 88.34 |
| AdaLoRA | 1.27M | 90.76/90.79 | 96.10 | 71.45 | 92.23/89.74 | 94.55 | 88.09 | 90.69 | 91.84 | 89.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有什么优点?
- 大幅降低训练成本:只更新少量参数,显存占用和训练时间都大幅减少
- 效果出色:部分PEFT方法能达到接近甚至超过全参数微调的效果
- 缓解灾难性遗忘:保留原始模型能力,避免微调后遗忘了预训练学到的知识
- 降低使用门槛:让更多人能够参与到深度学习研究中来
📝 通俗解释:PEFT就像给汽车装了一个智能辅助系统,不用更换整个发动机(预训练模型),只加装一个小装置(少量可训练参数),就能让汽车适应新的赛道(下游任务),省油(显存)又省时(训练时间)。
5. 不同微调方法的显存与速度对比
| 方法 | batch size | 精度 | 显存占用 | 推理速度 |
|---|---|---|---|---|
| LoRA (r=8) | 16 | FP16 | 28GB | 8 ex/s |
| LoRA (r=8) | 8 | FP16 | 24GB | 8 ex/s |
| LoRA (r=8) | 4 | FP16 | 20GB | 8 ex/s |
| LoRA (r=8) | 4 | INT8 | 10GB | 8 ex/s |
| LoRA (r=8) | 4 | INT4 | 8GB | 8 ex/s |
| P-Tuning v2 (p=16) | 4 | FP16 | 20GB | 8 ex/s |
| P-Tuning v2 (p=16) | 4 | INT8 | 16GB | 8 ex/s |
| P-Tuning v2 (p=16) | 4 | INT4 | 12GB | 8 ex/s |
| Freeze (l=3) | 4 | FP16 | 24GB | 8 ex/s |
| Freeze (l=3) | 4 | INT8 | 12GB | 8 ex/s |
📝 通俗解释:从这个表格可以看到,使用INT4量化的LoRA只需要8GB显存就能运行,这在消费级显卡上就能实现!精度从FP16降到INT4,显存减少到原来的1/3到1/4,但推理速度基本不变。
6. PEFT和全量微调的区别
Fine-tuning只能改变风格,不能改变知识,原因在于:
- LoRA等方法本质上是低秩近似,是对原始权重矩阵的微小调整,无法对模型产生根本性的改变
- 全量微调可以改变知识,因为所有参数都参与更新,模型能够学习到全新的知识
📝 通俗解释:这就像给一幅画做滤镜(PEFT)vs 重画整幅画(全量微调)。加滤镜可以改变风格色调,但无法改变画面内容;而重画则可以完全改变主题和细节。
7. 多种高效微调方法对比
7.1 方法选择建议
- 显存资源有限:推荐 QLoRA(LoRA + 量化)
- 简单任务场景:可以考虑 P-Tuning、Prompt Tuning
- 综合评估优秀的:P-Tuning v2、LoRA
7.2 方法对比表(五个维度)
| 方法 | 类型 | 存储高效 | 内存高效 | 减少反向传播 | 推理开销 |
|---|---|---|---|---|---|
| Adapters | A | yes | yes | no | 额外FFN层 |
| AdaMix | A | yes | yes | no | 额外FFN层 |
| SparseAdapter | AS | yes | yes | no | 额外FFN层 |
| BitFit | S | yes | yes | no | 无 |
| DiffPruning | S | yes | no | no | 无 |
| Prompt Tuning | A | yes | yes | no | 额外输入 |
| Prefix-Tuning | A | yes | yes | no | 额外输入 |
| LoRA | R | yes | yes | no | 无 |
| AdaLoRA | R | yes | yes | no | 无 |
| QLoRA | R | yes | yes | no | 无 |
| (IA)³ | A | yes | yes | no | 额外门控 |
| UniPELT | AR | yes | yes | no | 额外FFN和输入 |
📝 通俗解释:
- 类型列:A=Additive(添加参数),S=Selective(选择参数),R=Reparametrization(重参数化)
- 推理开销:无开销的方法(如LoRA、BitFit)更适合生产环境,因为不需要额外的计算
- 存储高效:指保存微调后的模型需要额外的磁盘空间
7.3 参数量对比表
| 方法 | 可训练参数占比 | 改变参数占比 | <1B模型 | <20B模型 | >20B模型 |
|---|---|---|---|---|---|
| Adapters | 0.1-6% | 0.1-6% | ✓ | ✓ | ✓ |
| BitFit | 0.05-0.1% | 0.05-0.1% | ✓ | ✓ | ✓ |
| Prompt Tuning | 0.1% | 0.1% | ✓ | ✓ | ✓ |
| Prefix-Tuning | 0.1-4% | 0.1-4% | ✓ | ✓ | ✓ |
| LoRA | 0.01-0.5% | ~0.5%或~30% | ✓ | ✓ | ✓ |
| AdaLoRA | 0.05-0.5% | ~0.5% | ✓ | ✓ | ✓ |
| QLoRA | 0.01-0.5% | ~0.5% | ✓ | ✓ | ✓ |
| (IA)³ | 0.02% | 0.02% | ✗ | ✓ | ✗ |
📝 通俗解释:从表格可以看出,Prompt Tuning、Prefix Tuning、LoRA 是目前应用最广泛的方法,因为它们在不同参数规模的模型上都经过验证过。LoRA的改变参数占比有时会到30%,这是因为重参数化后需要合并到原模型中。
8. 当前高效微调技术存在的问题
8.1 参数计算口径不一致
参数计算可分为三类:
- 可训练参数数量:梯度优化更新的参数数量
- 改变参数数量:微调后模型与原始模型的差异
- 差异等级:模型之间差异的程度
例如:DiffPruning实际更新0.5%的参数,但参与训练的参数数量是200%。
📝 通俗解释:这就像描述一本书的修改量,可以说"修改了10个字"(可训练参数),也可以说"修改了5%的内容"(改变参数),这两种说法完全不一样,容易造成混淆。
8.2 缺乏模型大小的考虑
已有研究表明,大模型在微调中需要更新的参数量更小。因此,模型大小在比较不同PEFT方法时也需要考虑。
8.3 缺乏测量基准和评价标准
不同方法使用的模型/数据集组合都不一样,评价指标也不一样,难以得到有意义的结论。
8.4 代码实现可读性差
很多开源代码都是简单拷贝Transformer代码库后小修小补,不使用git fork,难以找出改动位置,可复用性也比较差。
📝 通俗解释:这就相当于不同厨师做同一道菜,有的放盐,有的放酱油,调料用量也不一样,我们很难比较谁的菜做得更好吃。
9. 高效微调技术最佳实践
针对以上问题,建议按照以下最佳实践实施:
- 明确指出参数数量类型:区分可训练参数和改变参数
- 使用不同大小的模型进行评估:小模型、中模型、大模型都要测试
- 和类似方法进行公平比较:使用相同的模型、数据集、评价指标
- 标准化PEFT测量基准:建立统一的评测框架
- 重视代码清晰度:以最小化方式实现,便于复现和复用
10. PEFT存在的问题?
相比全参数微调,大部分PEFT技术目前存在以下两个问题:
- 推理速度会变慢:部分方法需要额外的计算(如Adapter需要额外的FFN层)
- 模型精度可能变差:虽然差距在缩小,但部分场景下仍不如全参数微调
📝 通俗解释:这世界上没有免费的午餐。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》
(本文持续更新中...)