大模型微调技术方法综述
在深度学习领域,微调(Fine-tuning)是改进预训练模型性能的关键技术。随着开源大模型的日益增多,掌握微调基础知识对于在实际工作中应用这些模型至关重要。除了 ChatGPT,许多预训练模型均可通过微调适应特定任务。
1. 全参数微调 (Full Fine-tuning)
全参数微调是将预训练模型的所有层都参与训练,以适应新的任务。这种方法通常能获得最佳的性能表现,但计算成本和显存占用极高,需要大量的 GPU 资源。
- 微调所有层:更新模型全部参数。
- 冻结底层:固定预训练模型的底层参数,仅微调顶层或特定层。
- 迁移学习:将预训练知识迁移到新任务,常结合冻结底层或微调顶层使用。
目前常用的策略包括前三种。简单来说,模型参数好比大学生在大学学到的通用知识,而微调则是毕业后从事特定行业工作,需要学习具体的工作内容来产出成果。
2. 提示微调 (Prompt Tuning & Variants)
2.1 Prompt Tuning
Prompt tuning 是参数高效性微调(PEFT)中实现最简单的方法之一。它固定模型的前馈层参数,仅更新部分 embedding 参数即可实现低成本微调。
经典的 Prompt tuning 不涉及对底层模型的任何参数更新,侧重于精心制作输入提示或模板。主要结构利用了一个 prompt encoder(BiLSTM+MLP),将一些伪提示(pseudo prompt)先 encode(离散 token)再与 input embedding 进行拼接,同时利用 LSTM 进行重参数化(Reparameterization)加速训练,并引入少量自然语言提示的锚字符(Anchor)进一步提升效果。
然而,P-tuning v1 存在两个显著缺点:任务不通用和规模不通用。在一些复杂的自然语言理解(NLU)任务上效果较差,且预训练模型的参数量不能过小。
2.2 Prefix Tuning
Prefix Tuning 针对不同的模型结构设计不同模式。以自回归模型为例,不再使用 token 作为前缀,而是直接使用参数作为前缀。例如一个 l×d 的矩阵 P 作为前缀,但直接使用这样的前缀效果不稳定,因此使用一个 MLP 层重参数化并放大维度 d。除了在 embedding 层加入这个前缀之外,还在其他的所有层都添加这样一个前缀。最后微调时只调整前缀的参数,大模型的参数保持不变。保存时只需要为每个任务保存重参数的结果即可。
2.3 P-tuning v2
V2 版本基于 P-tuning 和 Prefix-tuning 技术,引入了 Deep Prompt Encoding 和多任务学习等策略进行优化。
实验表明,仅精调 0.1% 参数量,在 330M 到 10B 不同参数规模的 LM 模型上,均取得和 Full Fine-tuning 相比肩的性能。
P-tuning v2 的主要改进包括:
- 将 continuous prompt 加在序列前端,并且每一层都加入可训练的 prompts。
- 移除了 Reparameterization 加速训练方式。
- 采用了多任务学习优化:基于多任务数据集的 Prompt 进行预训练,然后再适配下游任务。
- 舍弃了词汇 Mapping 的 Verbalizer 的使用,重新利用 [CLS] 和字符标签,增强通用性,适配序列标注任务。
总而言之,P-tuning v2 是将 Prefix-tuning 应用到 NLU 任务上的一种方法。由于每层插入了 token,增大了模型训练的改变量,更加适用于小一点的模型。
3. 低秩适应 (LoRA)
LoRA 的本质是对所有权重矩阵套了一层'壳',这些壳会对原来的预训练权重矩阵进行加减使其更加适合下游任务。其假设前提是预训练语言模型具有低的'内在维度',因此在模型适配下游任务的过程中,权重更新也应该具有低的'内在秩'。
在对大语言模型进行微调的公式可以简化为: $$W = W_0 + \Delta W$$ 其中 $W$ 是微调后的矩阵权重,$W_0$ 是预训练的权重,$\Delta W$ 是通过微调而更新的梯度。将 $\Delta W$ 变换为两个矩阵相乘: $$\Delta W = BA$$ 在里面引入了秩 $r$,$r \ll \min(d, k)$。在训练过程中 LoRA 会冻结预训练权重 $W_0$,只训练 $A$ 和 $B$,减少了需要训练的参数的量。一般来讲,对于 LoRA 微调模型来讲 $r$ 设置的越大其微调效果会越好。
LoRA 算法的核心思想是将原始矩阵分解为两个低秩矩阵的乘积形式。具体地,LoRA 算法会首先对原始矩阵进行 SVD 分解,得到矩阵 $A=U\Sigma V^T$,然后取 $U$ 的前 $k$ 列和 $V$ 的前 $k$ 行,得到低秩矩阵 $X$ 和 $Y$,近似矩阵 $A_k = X \cdot Y$。


