大模型微调技术方法综述
在深度学习领域,微调(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$。
最终得到的权重文件会是各层的 $BA$,在推理时需要计算 $W = W_0 + BA$。该方法的好处如下:
- 减少了需要推理的参数量。
- 相较于添加 Adapter 层的方式,没有添加额外层,微调前后模型的推理时间不变。
- 生成的权重相当于插件,即插即用,可为多个不同任务生成各自的 LoRA 权重值,方便存储。
一般在使用 LoRA 去对模型进行微调的时候需要注意的参数就两个:r 和 lora_target_modules。前者决定了构造的矩阵的秩的大小,后者模块的具体名称需依据不同的模型决定。
4. 人类反馈强化学习 (RLHF)
RLHF 的思想是使用强化学习的方式直接优化带有人类反馈的语言模型,使得语言模型能和复杂的人类价值观对齐。RLHF 是一项涉及多个模型和不同训练阶段的复杂概念,一般分为三步:
Step 1. 监督微调 (Supervised Fine-tuning)
使用上文提到的数据集进行模型微调,预训练一个语言模型 (LM)。这一步可以用额外的文本或者条件对这个 LM 进行微调,例如 OpenAI 对'更可取'的人工生成文本进行了微调。虽然使用了昂贵的增强数据,但这并不是 RLHF 必须的一步。
Step 2. 训练奖励模型 (Reward Model)
RM 的训练是 RLHF 区别于旧范式的开端。这一模型接收一系列文本并返回一个标量奖励,数值上对应人的偏好。关于训练文本方面,RM 的提示 - 生成对文本是从预定义数据集中采样生成的,并用初始的 LM 给这些提示生成文本。关于训练奖励数值方面,需要人工对 LM 生成的回答进行排名。起初可能会认为应该直接对文本标注分数,但是由于标注者的价值观不同导致这些分数未经过校准并且充满噪音。通过排名可以比较多个模型的输出并构建更好的规范数据集。一种成功的方式是对不同 LM 在相同提示下的输出进行比较,然后使用 Elo 系统建立一个完整的排名。
Step 3. 用强化学习微调
目前多个组织找到的可行方案是使用策略梯度强化学习算法、近端策略优化 (Proximal Policy Optimization, PPO) 微调初始 LM 的部分或全部参数。因为微调整个 10B~100B+ 参数的成本过高,相关工作参考低秩适应 LoRA。PPO 算法是一种信赖域优化算法,它使用梯度约束确保更新步骤不会破坏学习过程的稳定性。
5. 分布式训练优化 (DeepSpeed ZeRO)
DeepSpeed 是微软的大规模分布式训练工具,专门用于训练超大模型。其具有的 3D 并行同时解决了训练万亿参数模型的两个基本挑战:显存效率和计算效率。因此,DeepSpeed 可以扩展至在显存中放下最巨大的模型,而不会牺牲速度。
使用 DeepSpeed+Zero 的结合方式就可以实现全参数的微调。DeepSpeed ZeRO-2 主要用于训练,ZeRO-3 后也可用于推理,因为它允许在多个 GPU 上加载大型模型。在 Python 中,Accelerate 库提供了简单的 API,使我们可以在任何类型的单节点或分布式节点上运行。
示例配置中需要提前知道梯度累积步骤 gradient_accumulation_steps 和梯度累积计算逻辑。
6. 方法对比与选型建议
为了更清晰地选择微调方法,以下是对比总结:
| 方法 | 参数量变化 | 显存需求 | 训练速度 | 适用场景 |
|---|---|---|---|---|
| Full Fine-tuning | 100% | 高 | 慢 | 数据充足,资源充裕,追求极致性能 |
| Prompt Tuning | <1% | 低 | 快 | 简单任务,快速原型验证 |
| Prefix Tuning | <1% | 低 | 快 | 序列生成任务,多任务学习 |
| LoRA | ~1% | 中 | 较快 | 垂直领域微调,资源受限,推荐首选 |
| RLHF | 可变 | 高 | 慢 | 对齐人类价值观,安全合规要求高 |
实施建议
- 资源评估:如果显存有限,优先选择 LoRA 或 P-tuning v2。如果显存充足且追求 SOTA 性能,考虑 Full Fine-tuning。
- 任务类型:对于分类任务,P-tuning v2 表现优异;对于生成任务,LoRA 和 Prefix Tuning 更为合适。
- 对齐需求:如果需要对齐人类价值观(如聊天机器人),RLHF 是必经之路,但成本较高。
- 部署考量:LoRA 生成的权重文件较小,便于分发和切换,适合多租户或多场景部署。
7. 总结
大模型微调技术正在快速发展,从全参数微调到低秩适应,再到强化学习对齐,每种方法都有其独特的优势和应用场景。开发者应根据实际业务需求、数据规模和硬件资源,灵活选择合适的微调策略。随着技术的演进,参数高效微调(PEFT)将成为主流,降低大模型落地的门槛。


