微调(Fine-tuning)
一句话 TL;DR:在 预训练 模型基础上,用少量任务特定数据继续训练,让通用模型变成专用模型。现代微调的主流是 PEFT(如 LoRA)--只更新极少量附加参数,达到接近全量微调的效果,但成本低一两个数量级。
L1 · 一句话点破
微调的本质是:拿一个预训练好的基础模型,用少量标注数据"再训一会儿",让它在某个具体任务上更专精。
它和预训练的关系:预训练是"通识教育"(读万卷书),微调是"岗前培训"(专精一项)。预训练产出通用能力,微调把通用能力导向特定任务、风格或领域。
现代微调的关键演化:从"全量微调"(更新所有参数,成本高)到"参数高效微调"(PEFT,如 LoRA,只更新 <1% 参数,成本低)。这让普通开发者也能微调百亿参数模型。
L2 · 通俗类比
预训练完的模型像一个"通识毕业生":知识广博,但不精通任何具体岗位。
- 全量微调:让他重新读一遍大学,但这次教材全是某个岗位的专业课。效果最好,但成本极高(要重新走一遍训练流程)。
- PEFT / LoRA:不重新读大学,而是给他一本"岗位速成手册"(少量附加参数),让他边工作边查手册。手册很薄(<1% 参数量),但配合原有知识足够胜任岗位。成本极低,效果接近全量微调。
LoRA 的妙处在于:它假设"任务适配"只需要在原模型权重上做一个低秩修正--不是改写大脑,而是加一个小补丁。这个小补丁存得下、传得快、换得容易,让"一个基础模型 + N 个 LoRA 补丁服务 N 个任务"成为可能。
L3 · 正经定义
微调(Fine-tuning) 是在预训练模型参数基础上,用任务特定数据继续训练的过程。形式化地,预训练模型参数 $\theta_0$ 作为初始值,在下游任务数据 $D_{task}$ 上最小化任务损失:
$$ \theta^* = \arg\min_\theta \mathcal{L}{task}(\theta; D), \quad \theta \text{ 初始化为 } \theta_0 $$
微调的主要变体:
| 类型 | 更新参数量 | 显存 | 代表 |
|---|---|---|---|
| 全量微调(Full FT) | 100% | 高 | BERT 时代标准 |
| 参数高效微调(PEFT) | <1% | 低 | 当前主流 |
| - LoRA | 附加低秩矩阵 | 低 | 最流行 |
| - Prefix Tuning | prompt 前缀 | 极低 | 早期 PEFT |
| - Adapter | 层间小模块 | 低 | 经典 PEFT |
| 指令微调(SFT) | 全量或 PEFT | 看实现 | ChatGPT 的 S 阶段 |
LoRA(Low-Rank Adaptation, Hu et al. 2021) 是当前最主流的 PEFT 方法。它将权重更新 $\Delta W$ 分解为两个低秩矩阵的乘积:
$$ W' = W_0 + \Delta W = W_0 + B A, \quad B \in \mathbb{R}^{d \times r}, A \in \mathbb{R}^{r \times d}, r \ll d $$
训练时只更新 $A$ 和 $B$(共 $2dr$ 个参数),原权重 $W_0$ 冻结。$r$ 通常取 8-64,参数量约为全量的 0.1%-1%。
参考资料:
- Hu et al., 2021 - LoRA 原始论文
- Houlsby et al., 2019 - Adapter
- Li & Liang, 2021 - Prefix Tuning
- Dettmers et al., 2023 - QLoRA
L4 · 原理深挖
4.1 为什么微调有效:预训练给的是"好初始化"
理解微调为什么有效,关键是理解预训练参数 $\theta_0$ 是一个极好的初始化。
传统监督学习从随机初始化开始训练,需要大量数据才能收敛到好的局部最优。预训练后的 $\theta_0$ 已经在"参数空间的好区域"--它学过语言的通用规律,离大多数下游任务的最优解只差"一小步"。
数学上,预训练把参数带到了一个平坦、宽泛的损失盆地(loss basin)附近,微调只需在这个盆地内做小范围调整就能找到任务最优。这就是为什么:
- 微调只需千-万条数据(预训练要千亿 token)
- 微调只需几小时-几天(预训练要几周-几月)
- 微调后效果远超从零训练
这也是 迁移学习 的底层机理--预训练学到的表示是通用的,可迁移到下游任务。
4.2 全量微调的痛点:成本与灾难性遗忘
全量微调(更新所有参数)有几个工程痛点:
① 显存爆炸
全量微调的显存不止要存参数,还要存:
- 梯度(与参数等大)
- 优化器状态(Adam 需要存 momentum 和 variance,每个参数 2 份)
- 激活值(用于反向传播)
一个 7B 模型,FP16 参数 14GB,加上梯度和 Adam 状态,全量微调需要约 80-100GB 显存。这就是为什么全量微调大模型门槛高。
② 灾难性遗忘(Catastrophic Forgetting)
全量微调会让模型"忘了"预训练学到的通用能力。在任务 A 上微调后,原本擅长的任务 B 性能可能大幅下降。这是因为更新所有参数会破坏预训练建立的通用表示。
③ 多任务部署困难
全量微调的产物是一个完整模型副本。如果要在 10 个任务上服务,需要存 10 个完整模型(每个几十 GB),存储和切换成本高。
PEFT(尤其 LoRA)正是为解决这三个痛点而生。
4.3 LoRA 的核心假设:权重更新是低秩的
LoRA 的关键洞察来自一个经验观察:预训练模型在适配下游任务时,权重的更新 $\Delta W$ 是低秩的--即 $\Delta W$ 可以用两个小矩阵的乘积 $BA$ 近似,且 $r \ll d$ 时效果几乎无损。
为什么这个假设成立?一种解释是:预训练已经让权重 $W_0$ 学到了"通用模式",下游任务只需要在通用模式上做"小幅定向调整",这种调整的内在维度(intrinsic dimension)远小于参数总量。相关研究(Aghajanyan et al., 2020)实测发现,RoBERTa 在多数任务上的内在维度只有几百到几千,远小于 125M 参数量。
LoRA 的工程优势:
| 优势 | 说明 |
|---|---|
| 显存大幅下降 | 只需存 $A, B$ 和它们的梯度/优化器状态,约为全量的 1% |
| 无推理延迟 | 训练后 $BA$ 可合并进 $W_0$,推理时和原模型完全一样 |
| 多任务热切换 | 不同任务的 LoRA 补丁可即时加载/卸载,不用换大模型 |
| 抗遗忘 | $W_0$ 冻结,预训练能力保留更好 |
4.4 LoRA 的实践细节:调什么、怎么调
① 应用到哪些层?
Transformer 里可以加 LoRA 的线性层有:Q、K、V、O 投影和 FFN 的两个投影。原论文只在 Q、V 上加,效果已经很好。后续实践发现全部线性层都加 LoRA(含 FFN)效果更好,参数量略增但远低于全量。
② 秩 $r$ 怎么选?
$r$ 是 LoRA 的核心超参。$r$ 越大表达力越强但参数越多:
- $r=8$:通用默认,多数任务够用
- $r=16-32$:复杂任务或风格迁移
- $r=64+$:极少需要,过大会接近全量微调
经验上 $r$ 不必太大,因为任务适配的内在维度有限。
③ $\alpha$ 缩放因子
LoRA 的输出乘以 $\alpha/r$ 缩放,用于解耦 $r$ 和学习率的调参。$\alpha$ 通常设为 $r$ 的 2 倍(如 $r=8, \alpha=16$),让不同 $r$ 下学习率可统一。
④ 学习率
LoRA 学习率通常比全量微调高 10 倍左右(如 1e-4 vs 1e-5),因为只训小部分参数,需要更激进的更新。
4.5 QLoRA:让消费级显卡微调大模型成为可能
QLoRA(Dettmers et al., 2023) 把 LoRA 推到极致:把冻结的基础模型量化到 4-bit(NF4),只在 LoRA 附加参数上做 16-bit 训练。
效果:
- 70B 模型可在单张 48GB 显卡上微调(全量微调需要 8 张 H100)
- 效果接近全量 16-bit 微调,损失极小
- 关键技巧:NF4 量化 + 双重量化 + paged optimizer
QLoRA 是"开源大模型民主化"的关键技术--它让普通开发者也能微调 70B 级模型,不再是大公司的专利。
4.6 何时用全量微调,何时用 PEFT
| 场景 | 推荐 |
|---|---|
| 资源充足 + 任务和预训练差异大 | 全量微调 |
| 资源受限 / 多任务部署 | LoRA |
| 模型超大(70B+) | QLoRA |
| 风格/格式调整 | LoRA(小 $r$) |
| 领域知识大幅扩展(如医学/法律) | 全量或继续预训练 + LoRA |
注意:PEFT 不是"全量微调的廉价替代"那么简单。很多场景下 LoRA 效果与全量持平甚至更好(因为抗遗忘)。但若任务需要模型学大量新知识(而非新格式),全量或继续预训练更合适。
L5 · 沿革与坑
沿革
- 2013-2017:CV 领域用 ImageNet 预训练 + 全量微调是标准做法,效果显著。
- 2018:BERT、GPT 把"预训练 + 全量微调"带入 NLP,全量微调是当时唯一选择。
- 2019:Adapter(Houlsby et al.)提出在层间插入小模块,只训这些模块,标志 PEFT 概念诞生。
- 2021:Prefix Tuning(Li & Liang)和 LoRA(Hu et al.)相继发表。LoRA 因实现简洁、无推理延迟,逐渐成为主流。
- 2022-2023:大模型时代到来,全量微调成本爆炸,LoRA 成为事实标准。Stable Diffusion 社区用 LoRA 做风格/角色定制,让 LoRA 出圈。
- 2023:QLoRA 发表,让 70B 模型在消费级显卡上微调成为可能,推动开源大模型生态爆发。
- 2024:LoRA 变体涌现(DoRA、MoLoRA 等),但 LoRA 仍是 baseline。
常见误解
❌ 误解:LoRA 效果一定不如全量微调。 ✅ 真相:在很多场景下 LoRA 效果与全量持平甚至更好(因为抗遗忘、过拟合风险低)。只在需要学大量新知识时,全量才有明显优势。LoRA 不是"廉价降级",是另一种范式。
❌ 误解:LoRA 的 $r$ 越大越好。 ✅ 真相:$r$ 过大会接近全量微调,失去 PEFT 优势且容易过拟合。多数任务 $r=8$ 就够,内在维度有限。
❌ 误解:微调就是"让模型学会新知识"。 ✅ 真相:微调更擅长让模型学"新行为/新格式/新风格",而非"新事实知识"。学新知识更适合用 RAG 或继续预训练。把微调当知识注入工具会失望。
❌ 误解:QLoRA 因为量化所以效果差很多。 ✅ 真相:QLoRA 用 NF4 量化 + 精心设计的技巧,效果损失极小(通常 <1%)。论文里 QLoRA 微调的模型在多个基准上接近全量 16-bit 微调。"量化"听起来吓人,但工程做得好损失可控。
❌ 误解:微调过的模型就是"自己的模型"了,可以随便商用。 ✅ 真相:微调产物的商用许可继承自基础模型。基础模型是 LLaMA(受限许可),微调后仍受其约束;基础模型是 Qwen(开放许可),微调后才能自由商用。微调不改变许可属性。
面试怎么考
- "什么是微调?为什么微调比从零训练有效?" --必考。预训练给好初始化,微调在损失盆地内小范围调整(见 4.1)。
- "全量微调有什么痛点?" --显存爆炸 + 灾难性遗忘 + 多任务部署困难(见 4.2)。
- "什么是 LoRA?它的核心假设是什么?" --权重更新低秩,$\Delta W = BA$,$r \ll d$(见 4.3)。
- "LoRA 的 $r$ 怎么选?应用在哪些层?" --$r=8$ 通用默认,全部线性层效果更好(见 4.4)。
- "LoRA 相比全量微调有什么优势?" --显存低、无推理延迟、多任务热切换、抗遗忘(见 4.3 表格)。
- "什么是 QLoRA?为什么重要?" --4-bit 量化基础模型 + 16-bit LoRA 训练,让消费级显卡微调 70B 成为可能(见 4.5)。
延伸阅读
- 📄 Hu et al., 2021 - LoRA
- 📄 Dettmers et al., 2023 - QLoRA
- 📄 Houlsby et al., 2019 - Adapter
- 📄 Aghajanyan et al., 2020 - Intrinsic Dimensionality
- 🔧 PEFT 库(HuggingFace) - LoRA 工程实现
- 🚀 进阶专题·高效微调:LoRA / QLoRA / Adapter / Prefix/Prompt Tuning / PEFT 总览 -- 本词条只讲了 PEFT 的轮廓,5 篇进阶专题拆到骨头