微调方法全景
大模型微调主要有三种技术路线,各有适用场景:
- 全参微调(Full Fine-tuning):更新所有参数,效果上限最高,但成本最高
- LoRA:冻结主干参数,仅训练低秩适配矩阵,性价比极高
- QLoRA:在LoRA基础上对基座模型4bit量化,进一步降低显存需求
LoRA技术详解
原理
LoRA(Low-Rank Adaptation)的核心思想是:模型适配过程中的参数变化具有低秩特性。具体做法:
将原始权重矩阵W∈R^(d×d)的更新分解为两个小矩阵的乘积:
W' = W + ΔW = W + B × A
其中A∈R^(r×d),B∈R^(d×r),r远小于d(通常取8-64)。
参数量从d²降低到2rd,以r=16、d=4096为例,参数量从16.7M降到131K,缩减了127倍。
关键超参数
- rank (r):秩大小。r越大表达能力越强但训练越慢。推荐8-64起步
- alpha:缩放系数,实际缩放为α/r。推荐设为r的2倍
- target_modules:应用LoRA的层。至少q_proj和v_proj,推荐all-linear
适用场景
- 风格定制(让模型用特定语气说话)
- 领域适配(法律、医疗等垂直领域)
- 任务适配(将通用模型适配到特定任务格式)
QLoRA:极致显存优化
QLoRA在LoRA基础上增加了两个优化:
4-bit NormalFloat量化
将基座模型权重量化为4-bit NF4数据类型。NF4是一种正态分布感知的量化方案,比均匀量化精度更高:
原始: W ∈ FP16 (每参数2字节)
量化: W → NF4 (每参数0.5字节)
训练: 仅LoRA参数为FP32
双重量化
对LoRA的适配矩阵本身也进行量化,进一步压缩梯度检查点的显存占用。
页面优化器
将优化器状态在CPU/GPU之间分页,避免显存峰值溢出。
效果对比
| 方法 | 7B模型显存 | 70B模型显存 | 效果损失 |
|---|---|---|---|
| 全参 | 120GB+ | 1200GB+ | 0% |
| LoRA | 20GB | 160GB | <1% |
| QLoRA | 6GB | 48GB | 1-2% |
QLoRA让单张消费级显卡(如RTX 3090, 24GB)就能微调7B模型,极大降低了定制化门槛。
全参微调:何时仍然需要?
尽管LoRA/QLoRA效果接近全参,但以下场景仍需全参微调:
- 能力跃迁:不是适配风格而是注入新能力(如让模型学会多步推理)
- 跨语言迁移:将英文模型迁移到低资源语言
- 持续训练:继续预训练(continued pretraining)
全参微调的工程要点:
- 使用DeepSpeed ZeRO-3或FSDP进行参数分片
- 梯度检查点(gradient checkpointing)减少激活值显存
- 混合精度训练(BF16)
- 学习率热身+余弦衰减
数据准备:微调的真正瓶颈
“微调效果不好,90%是数据问题”。数据质量比数据量更重要:
数据格式
{
"messages": [
{"role": "system", "content": "你是一个法律顾问"},
{"role": "user", "content": "劳动合同试用期最长多久?"},
{"role": "assistant", "content": "根据《劳动合同法》第十九条..."}
]
}
数据质量检查清单
- 去重(语义去重,不只是精确匹配)
- 过滤低质量样本(用reward model或强模型打分)
- 格式统一(system prompt一致)
- 长度分布合理(不要全是短回答)
- 难度多样化(简单和复杂问题混合)
- 拒答样本(教会模型对不当请求说不)
训练监控
关键指标:
- loss曲线:正常应平滑下降,抖动过大说明学习率过高或batch太小
- eval loss:训练集loss下降但验证集loss上升→过拟合
- 梯度范数:突然飙升可能是梯度爆炸的信号
总结
微调方法的选择本质上是一个"效果-成本"的权衡:
- 快速验证/资源有限:QLoRA,单卡即可
- 生产部署/中等预算:LoRA,多卡训练
- 极致效果/充足资源:全参微调+DeepSpeed
但无论选哪种方法,数据质量都是决定性因素。在投入计算资源之前,先花时间打磨数据集——这是微调工作流中最被低估也最值得投入的环节。