在大模型时代,全参微调的成本过于高昂,而且会带来灾难性遗忘问题,即用特定训练数据去微调可能会把这个领域的表现变好,但是可能会把原来表现好的领域能力变差。参数高效微调(Parameter-Efficient Fine-Tuning,PEFT)技术应运而生,固定住大部分预训练参数,仅微调少量或者额外的模型参数,从而大大降低LLM的训练成本。
从训练数据以及训练方法的角度在,大模型的微调有以下几条技术路线:
- 监督式微调(Supervised Fine Tuning,SFT)
利用人工标注的数据,用传统机器学习中监督学习的方式对大模型进行微调 - 基于人类反馈的强化学习微调(Reinforcement Learning with Human Feedback,RLHF)
将人类的反馈以强化学习的方式引入到大模型微调,让大模型生成的结果更加符合人类期望 - 基于AI反馈的强化学习微调(Reinforcement Learning with AI Feedback,RLAIF)
整体和RLHF类似,只不过反馈来源是AI,主要是想解决反馈系统的效率问题,因为收集人类反馈的成本比较高,而且效率比较低
微调的最终目的是在可控成本下,尽可能提升大模型在特定领域的能力。
本文暂时只关注SFT方案,PEFT技术的主要做法包括Adapter Tuning、Prefix Tuning、Prompt Tuning和LoRA。Adapter Tuning通过设计adapter结构,只对新增的adapter结构进行微调,保证训练的高效性;Prefix Tuning是在输入token之前构造和任务相关的virtual token,即连续的embedding向量,训练时固定Transformer部分的参数,只更新和下游任务相关的前缀向量(prefix embedding);Prompt Tuning则是在输入中加入prompt tokens进行微调,也就是通过自然语言指令让模型完成相应的任务;LoRA固定住预训练权重,额外引入了可训练的低秩分解矩阵,仅训练低秩矩阵那部分参数。
Adapter Tuning
Parameter-Efficient Transfer Learning for NLP提出了针对BERT的PEFT微调方式,拉开了PEFT研究的序幕。谷歌的研究者指出,在面对特定的下游任务,全参微调过于低效;固定预训练模型的部分层,只微调接近下游任务的那几层参数又难以达到较好的效果。
他们在Transformer结构中设计了如下图所示的Adapter结构,在训练时只对新增的Adapter结构进行微调,其它模块的参数是保持不变的。

除此之外,为了尽可能少的引入更多参数,同时为了保证训练的高效性,他们将Adapter设计为这样的结构:首先是一个down-project
层将高维特征映射到低维特征,随后会经过一个非线性层,最后再用一个up-project
层将低维特征映射回原来的高维特征。还设计了一个skip-connection
结构,确保在最差情况下能够退化为原始结构。
从实验结果来看,该方法相比于原来预训练模型的参数量只额外增加了3.6%的参数规模,取得了和全参微调接近的效果(GLUE指标在0.4%以内)。
Prefix Tuning
Prefix-Tuning: Optimizing Continuous Prompts for Generation由斯坦福研究人员提出,在输入token之前构造一段任务相关的virtual tokens,训练的时候只更新prefix部分的参数,预训练模型的参数是固定的。此外,为了防止直接更新Prefix的参数导致训练不稳定的情况,他们在Prefix层前面添加了MLP结构,训练完成之后,只保留Prefix的参数。

该方法其实和构造Prompt类似,只不过Prompt是人为构造的显式提示,而且无法更新参数,Prefix则是可以学习的隐式提示。
实验结果证明了Prefix Tuning的方式可以取得不错的效果。
Prompt Tuning
The Power of Scale for Parameter-Efficient Prompt Tuning这篇文章表示只要模型规模足够大,简单加入Prompt tokens进行微调,就能取得很好的效果。
该方法可以看作是Prefix Tuning的简化版本,只对输入层添加的prompt tokens embedding进行微调,而Prefix Tuning是对virtual token对应的上游层全部进行微调。因此Prompt Tuning的微调参数量数量级要更小,且不需要修改原始模型结构。

这篇文章表明随着预训练模型参数的增加,即使是最简单的设置也能达到很好的效果。
LoRA
LoRA全称是LoRA: Low-Rank Adaptation of Large Language Models,原文链接。
微软和CMU的研究者指出,现有的一些PEFT方法存在这样的问题:
- 由于增加了模型的深度,从而额外增加了模型推理的延时,如Adapter方法
- Prompt较难训练,同时减少了模型的可用序列长度,如Prompt Tuning、Prefix Tuning和P-Tuning方法
- 往往效率和质量不可兼得,效果比全参微调要差
有研究者对语音模型的参数进行研究发现,语言模型的参数虽然很多,但是其中起到关键作用的还是低秩的本质维度(low instrisic dimension
)。受此观点的启发,微软提出了低秩适配(Low-Rank Adaption,LoRA)技术来微调大型语言模型。
微调的本质
假设网络原本的预训练参数为$W_0 \in {R}^{d \times k}$,在新的下游任务微调之后,参数变成$W \in R^{d \times k}$,那么参数的变化量$\Delta W = W - W_0$。
因为$W=W_0 + \Delta W$,所以对模型微调其实可以将原有的参数$W_0$直接冻结,只学习变化量$\Delta W$。
低秩分解
现有的预训练模型通常是过参数化的,在对这些模型进行微调时,参数的更新主要在低维子空间中。换句话说,很多高维子空间的参数在微调前后根本没有改变。基于这一点,微调所学习的$\Delta W$也就不需要那么高的维度(秩),我们可以将其降低到一个更低的维度进行优化。
当然,如果参数的更新大量发生在高维子空间中,此时进行低秩分解就会遗漏信息,导致LoRA失效。
LoRA做法
LoRA设计了如下所示的结构,冻结预训练模型的权重参数,然后在每个Transformer块引入$A$和$B$这样两个低秩矩阵模块,去模拟全参微调的过程。

其中,$B\in R^{d\times r}$,$A\in R^{r\times k}$。一般来说,$r << min(d,k)$。
矩阵A和矩阵B的初始化设置
矩阵$B$被初始化为0,矩阵$A$采用高斯初始化。初始偏移为0是为了在训练开始时维持网络的原有输出,高斯初始化则是保证在真正开始学习之后能够更好地收敛。
如果$B$和$A$全都初始化为0,那么就与神经网络初始化为0一样,容易导致梯度消失,因为初始所有神经元的功能都是等价的;如果$B$和$A$全部都高斯初始化,那么网络训练刚开始就会有概率得到一个过大的偏移值$\Delta W$,从而引入太多噪声,导致难以收敛。
在面对不同的下游任务时,仅需训练参数量很少的低秩矩阵,而预训练权重可以在这些任务之间共享;训练好的低秩矩阵可以合并到预训练权重中,多分支结构变成单分支结构,这样就不会增加额外的推理延时。
最重要的是,由于$\Delta W=BA$的参数量远小于$W$,因此相比于全参微调,LoRA显著降低了优化器状态这部分对显存资源的需求。对于梯度部分,LoRA在严格意义上并不能降低其对于显存资源的需求,甚至比起全参微调来说计算量还更大了,只不过中间状态量所占用的显存会被释放掉,降低了最终存储的需求。
【参考文献】