Skip to content

微调(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 Tuningprompt 前缀极低早期 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%。

参考资料

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(开放许可),微调后才能自由商用。微调不改变许可属性。

面试怎么考

  1. "什么是微调?为什么微调比从零训练有效?" --必考。预训练给好初始化,微调在损失盆地内小范围调整(见 4.1)。
  2. "全量微调有什么痛点?" --显存爆炸 + 灾难性遗忘 + 多任务部署困难(见 4.2)。
  3. "什么是 LoRA?它的核心假设是什么?" --权重更新低秩,$\Delta W = BA$,$r \ll d$(见 4.3)。
  4. "LoRA 的 $r$ 怎么选?应用在哪些层?" --$r=8$ 通用默认,全部线性层效果更好(见 4.4)。
  5. "LoRA 相比全量微调有什么优势?" --显存低、无推理延迟、多任务热切换、抗遗忘(见 4.3 表格)。
  6. "什么是 QLoRA?为什么重要?" --4-bit 量化基础模型 + 16-bit LoRA 训练,让消费级显卡微调 70B 成为可能(见 4.5)。

延伸阅读


上一篇:预训练 -- 微调的前一阶段。下一篇:指令微调 -- 让模型学会听人话。

内容采用 CC BY-SA 4.0,代码采用 MIT。