一、背景
目前NLP主流范式是在大量通用数据上进行预训练语言模型训练,然后再针对特定下游任务进行微调,达到领域适应(迁移学习)的目的。
Context Learning v.s. SFT
指令微调是预训练语言模型微调的主流范式,其目的是尽量让下游任务的形式尽量接近预训练任务。
从而减少下游任务和预训练任务之间的Gap, 实现预训练语言模型适应下游任务,而非下游任务去适应模型
指令微调的效果要优于基于Zero/Few-shot的提示词工程的上下文学习。
但随着预训练语言模型进入LLM时代,其参数量愈发庞大。全量微调模型所有参数所需的显存早已水涨船高。
例如:
全参微调Qwen1.5-7B-Chat预估要2张80GB的A800,160GB显存 全参微调Qwen1.5-72B-Chat预估要20张80GB的A800,至少1600GB显存
而且,通常不同的下游任务还需要LLM的全量参数,对于算法服务部署来说简直是个灾难(当然,一种折衷做法就是全量微调后把增量参数进行SVD分解保存,推理时再合并参数 )。
为了寻求一个不更新全部参数的廉价微调方案,之前一些预训练语言模型的高效微调(Parameter Efficient, PEFT)工作,要么插入一些参数或学习外部模块来适应新的下游任务。
接下来将介绍如下4个PEFT方法(重点是主流的LoRA):
- Adatper Tuning
- Prompt Tuning
- Prefix Tuning
- LoRA
二、参数高效微调
2.1 Adapter Tuning
Adapter Tuning试图在Transformer Layer的Self-Attetion+FFN之后插入一个先降维再升维的MLP(以及一层残差和Laye