外观
微调:SFT 与参数高效微调
微调(fine-tuning)是在预训练大模型的基础上,用少量有监督数据继续更新模型参数,把"会预测下一个词"的通用语言模型改造成"按指定指令完成任务"的可用产品。预训练决定了模型的知识上限,微调决定它能不能把知识"接对线"——预训练回答"模型有多聪明",微调回答"模型好不好用"。
本文属于后训练(post-training)主题。预训练阶段的原理见预训练:数据与目标,微调之后还有更进一步的对齐:RLHF 与 DPO阶段;动手实操见微调实战:LoRA 全流程。
一、为什么需要微调:知识与行为的分离
预训练模型学会的是"语言的统计规律":给定上文预测下一个 token。这个能力本身已经能生成通顺的文本,但它有三个明显的产品化缺陷:
- 不听话:你问它"请用一句话总结",它可能输出三段话;你让它"只输出 JSON",它输出散文。预训练目标里根本没有"遵循指令"这一项。
- 格式不对:真实产品需要对话式、结构化、带角色约束的输出,而原始基座只会"顺着上文继续写"。
- 行为不设限:基座模型不会拒绝有害请求,也不会承认自己不知道。
这些缺陷本质上不是"知识不够",而是"行为不对"。微调改变的主要是行为与风格,而不是知识——模型学到的世界知识绝大部分来自预训练阶段,靠几千条微调样本"注入新知识"(尤其是事实性知识)几乎不现实。
从技术史看,"预训练 + 微调"的组合并非新事物:GPT-1(2018)就证明了通用预训练 + 任务微调优于从头训练;BERT 时代微调是 NLP 的标配。大模型时代的变化在于参数规模爆炸后,全参微调变得昂贵,于是参数高效微调(PEFT)成为主流,但"用有监督数据调整行为"的范式一脉相承。
知识 vs 行为
可以把预训练比作"通识教育",微调比作"岗前培训":通识教育决定一个人懂多少,岗前培训决定他在岗位上怎么表现。想让模型"知道得更多",要回到预训练加数据(见规模法则);想让模型"表现得更专业",才是微调的主场。这也是为什么评测时要区分知识类基准与行为类基准。
因此微调的典型用途包括:
| 用途 | 要改变的是什么 | 典型数据 |
|---|---|---|
| 指令遵循 | 行为:听懂并执行指令 | 指令-回答对(如 Alpaca 式) |
| 对话化 | 行为+风格:多轮对话、角色扮演 | 对话树(多轮对话记录) |
| 领域风格 | 风格:法律文书、客服话术、代码注释习惯 | 领域语料 |
| 输出格式 | 行为:JSON/表格/摘要格式 | 结构化输出样本 |
| 任务适配 | 能力:分类/抽取/改写等下游任务 | 任务标注数据 |
| 注入知识 | 知识(有限,效果差) | 领域 Q&A 对 |
微调不能替代预训练
用微调给模型"喂"新事实(比如公司内部文档)效果通常很差:样本太少、信号太弱,还容易把模型的既有知识搞乱。这类需求应优先考虑检索增强生成(见RAG:检索增强生成),而不是微调。
二、SFT:监督微调
**监督微调(Supervised Fine-Tuning, SFT)**是最基础、最常用的一类微调:给定一批"输入 → 期望输出"的样本,用标准的交叉熵损失让模型学会模仿期望输出。它是后训练的第一站,也是对齐中 RLHF 的第一步(InstructGPT 的三步之一)。
1. SFT 数据长什么样
SFT 数据的核心形态是指令-回答对:
用户:用一句话解释什么是反向传播。
助手:反向传播是一种通过链式法则计算损失对网络参数梯度的算法,用于训练神经网络。更高质量的是对话树:一段多轮对话记录,每轮都要完整展开历史上下文。这样模型学到的不仅是"回答正确",还有"多轮中记住上下文、不重复不矛盾"的对话行为。
著名的开源 SFT 数据包括:Stanford Alpaca(约 52K 条,2023 年用当时最强的 API 模型生成指令-回答对)、ShareGPT(用户与 ChatGPT 的真实对话)、UltraChat 等,完整档案见数据集与基准档案。
2. SFT 的损失:还是交叉熵
SFT 的训练目标与预训练完全同构,只是数据变了——预训练是"接着写",SFT 是"照着标准答案写"。对每个指令-回答对,只对"回答部分"的 token 计算交叉熵:
text
L_SFT = -Σ log P( y_t | x, y_<t ; θ )
↑ 对回答 y 中的每个 token 求和取平均,x 是完整指令(含系统提示/历史对话)实际实现中通常用"labels 掩码":把指令部分的 token 在 loss 中屏蔽掉(label 置为 -100),只让模型学习回答部分的生成模式。
3. 数据质量远大于数据量
SFT 的规模远小于预训练:几千到几万条高质量样本往往就够了,十几万条垃圾样本可能把模型教坏。决定 SFT 效果的主要因素按重要性排序大致是:
- 质量与多样性:覆盖的指令类型、难度、领域分布比条数重要。
- 干净一致:错误、重复、自相矛盾的样本直接教坏行为。
- 数量:在质量达标后增加数量才有正收益。
质量 > 数量的判断标准
一个实用判断:如果一条样本你作为人类都不觉得它是"好的回答",就不要放进 SFT 数据。用 API 模型生成数据后要人工抽检与去重(Alpaca 后期就发现数据里有大量重复和无意义指令)。
4. 预训练 vs SFT 对比
| 维度 | 预训练 | SFT |
|---|---|---|
| 数据 | 海量网络文本(万亿 token) | 少量人工/合成数据(千~百万条) |
| 目标 | 预测下一 token(续写) | 给定指令生成期望回答 |
| 学到的 | 语言、知识、推理的底子 | 指令遵循、风格、格式 |
| 成本 | 上万 GPU 时 | 少量 GPU 即可 |
| 改变什么 | 知识上限 | 行为与表达 |
三、全参微调 vs 参数高效微调
1. 全参微调(Full Fine-Tuning)的成本与风险
全参微调指更新模型的全部参数。对 7B~70B 模型,这需要大量显存(优化器状态、梯度、激活都要驻留),且存在两个核心问题:
- 成本高:一张 80GB 的 A100/H100 只能勉强容纳 7B 级的全参训练,70B 级需要多卡甚至整机。
- 灾难性遗忘(catastrophic forgetting):模型为了拟合微调数据,可能把预训练学到的通用能力"冲掉"——典型表现是微调后数学/代码/常识推理反而变差。
灾难性遗忘是真实风险
很多团队微调后只看业务指标(涨了),不看通用能力(悄悄跌了)。上线前务必同时跑一组通用基准做回归,这正是评测与基准一页反复强调的:微调必须伴随评测闭环,否则你无法知道模型"变好"的同时"变差"了什么。
2. 参数高效微调:只改一小部分
**参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)**指冻结大部分模型参数,只训练少量新增/选中的参数,把微调成本降一到两个数量级。主流方法对比如下:
| 方法 | 代表论文/年份 | 训练什么 | 显存/成本 | 典型收益 |
|---|---|---|---|---|
| 全参微调 | — | 全部参数 | 高 | 上限最高,但遗忘风险大 |
| LoRA | Hu et al. 2021 | 注入的低秩矩阵 | 低 | 可训练参数 <1%,效果接近全参 |
| QLoRA | Dettmers et al. 2023 | 低秩矩阵 + 4-bit 基座 | 极低 | 65B 模型单卡可微调 |
| Adapter | Houlsby et al. 2019 | Transformer 层间小网络 | 低 | 每层加参数,模块化 |
| P-Tuning / Prefix | Liu et al. 2022 / Li & Liang 2021 | 可学习的连续前缀向量 | 最低 | 只动 embedding 层附近 |
| BitFit | Ben Zaken et al. 2021 | 仅 bias 项 | 最低 | 极轻量基线 |
3. LoRA 原理:低秩分解
**LoRA(Low-Rank Adaptation)**的核心假设是:微调对预训练权重的更新量 ΔW 是低秩的,不需要训练完整的大矩阵,只需训练两个小矩阵的乘积。
设预训练权重为 W₀(形状 d×d),LoRA 将其冻结,并引入两个可训练矩阵 A(d×r)和 B(r×d):
text
W = W₀ + ΔW = W₀ + (α/r) · B·A
↑ ↑ ↑
冻结 缩放系数 低秩增量,秩 r << d前向计算变为 h = W₀·x + (α/r)·B·A·x。由于 r 很小(常见 8/16/32/64),需要训练的参数从 d×d 降到 2·d·r,通常不足全参的 1%。LoRA 论文报告:在 GPT-3 175B 上可训练参数减少约 10000 倍,效果仍接近全参微调。
LoRA 的关键超参数:
| 超参 | 含义 | 实践经验 |
|---|---|---|
| 秩 r | 低秩矩阵的维度 | 8~64;任务简单用 8,复杂领域用 64;r 过大收益递减 |
| α | 缩放系数 | 常取 2r 量级;α 与 r 联动,影响学习率感受 |
| target_modules | 注入哪些层(q_proj/k_proj/v_proj/o_proj 等) | 常见做法:q/v 或全部 attention 投影 |
| 学习率 | 微调专用学习率 | 一般低于预训练(1e-4~2e-4 量级) |
| 合并 | 训练后把 BA 加回 W₀ | 推理时零额外开销 |
为什么 LoRA 有效且受欢迎
三个理由:① 可训练参数少,显存和算力需求骤降;② 冻结主干,灾难性遗忘显著减轻;③ 训练产物就是两个小矩阵,可以在一个基座上叠加多套 LoRA 按需切换(路由、多租户适配)。
QLoRA 进一步把基座权重量化为 4-bit(NF4 格式)并冻结,只对 LoRA 参数做反量化计算,使得 65B 级模型在单张高端 GPU 上即可微调(Dettmers et al., 2023)。量化的系统背景见部署与服务化。
4. 其他 PEFT 方法简述
- Adapter:在每个 Transformer 层内插入一个小型前馈网络(先降维再升维),训练时只更新这些 Adapter。缺点是多层插入、推理有一点额外延迟。
- P-Tuning v2 / Prefix Tuning:不修改权重,只在输入侧拼接一组可学习的连续向量(soft prompt)。训练极快,但对复杂任务的能力提升通常弱于 LoRA。
- BitFit:只训练所有 bias 参数,效果在部分任务上出人意料地好,是最轻量的基线。
5. PEFT 与全参微调的效果差距
一个必须诚实面对的问题是:PEFT 的"省"会不会以"弱"为代价? 从公开实验看,两者的差距在多数场景下很小,但并非为零:
| 证据 | 结论 |
|---|---|
| LoRA 原论文(GPT-3 175B) | 在多数下游任务上与全参微调接近,部分任务甚至更好 |
| QLoRA 论文(Guanaco 系列) | 4-bit 基座 + LoRA 在多个基准上与全精度微调差距在可接受范围 |
| 社区大规模实践 | 复杂生成/推理任务上,全参或更大秩 LoRA 仍有上限优势 |
综合结论:简单任务(分类、抽取、风格化)PEFT 完全够用;对上限敏感的复杂任务,先用 PEFT 验证数据与方向,再决定是否升级到全参或更大模型。这比一开始就押注全参微调稳妥得多。
四、微调工程的四个关键问题
1. 过拟合与欠拟合
微调数据量小,很容易过拟合。控制手段:降低学习率(1e-4~2e-4 起步)、限制 epoch(1~3 个即可,SFT 多跑几轮收益小)、早停(观察验证集 loss)、增加 dropout。另一个方向是欠拟合——学习率太低或 LoRA 秩太小,微调几乎无效,表现与基座无差别。
2. 灾难性遗忘的缓解
- 用 LoRA/QLoRA 冻结主干(最有效);
- 微调数据里混入 5%~10% 的通用/领域保持数据(continual learning 里的"回放"思想);
- 微调前后跑通用基准回归测试(见评测与基准);
- 必要时做模型合并(如 WEMIX 式的参数插值)来恢复通用能力。
3. 数据质量与去重
重复样本会让模型对某些输入过拟合到"背答案";低质量样本(答非所问、语法错误、有害内容)会污染行为。SFT 数据准备流程:格式清洗 → 去重(精确去重+语义去重)→ 质量筛分 → 人工抽检 → 按任务类型配比。
4. 微调后的评估闭环
微调不是"训练完就结束",必须回答三个问题:目标行为达标了吗?通用能力掉了吗?有害行为增加了吗? 分别对应业务评测集、通用基准(MMLU/GSM8K/HumanEval 等,见数据集与基准档案)、安全评测(见安全与风险)。完整方法见评估实战。
5. 常见失败模式与排查
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 训练 loss 不降 | 学习率过低、LoRA 秩太小、数据格式错 | 调高学习率、增大 r、检查指令是否被掩码 |
| 训练 loss 降但输出不变 | 只学指令部分、回答部分没参与 loss | 检查 labels 掩码是否把回答也屏蔽了 |
| 业务指标涨、通用能力暴跌 | 灾难性遗忘 | 回退到 LoRA、混入保持数据、跑通用基准回归 |
| 输出全是训练集的"标准答案" | 过拟合 / 数据太少太单一 | 降 epoch、提数据多样性、加 dropout |
| 幻觉变多 | 数据含噪声、或对齐没跟上 | 数据清洗、补对齐阶段 |
| 微调前后没差别 | 学习率太低 / r 太小 / 数据与基座能力重叠 | 先跑一次小规模全参验证数据有效性 |
五、微调与对齐、提示、RAG 的定位
1. SFT 之后还需要对齐吗
需要。SFT 解决"会模仿",对齐解决"知道该做什么、不该做什么"。InstructGPT 的实践证明:仅 SFT 的模型仍然会输出有害内容、仍然会对简单问题犯常识性错误;SFT 之后再经过对齐:RLHF 与 DPO(奖励模型 + 强化学习,或直接偏好优化),模型的帮助性与安全性才显著提升。
| 阶段 | 数据/信号 | 解决的问题 |
|---|---|---|
| 预训练 | 海量文本 | 知识与语言能力 |
| SFT | 指令-回答对 | 指令遵循与行为格式 |
| RLHF/DPO | 人类偏好排序 | 价值观、安全性、帮助性 |
| 评测 | 基准+红队 | 验证与兜底 |
2. 微调 vs 提示 vs RAG
| 手段 | 改变什么 | 成本 | 适用场景 |
|---|---|---|---|
| 提示工程 | 不改变模型 | 最低 | 行为微调、格式约束、即时生效 |
| RAG | 不改变模型,接入外部知识 | 中 | 需要新知识、可溯源、知识经常更新 |
| 微调 | 改变模型行为 | 高 | 风格/格式/任务形态固定、提示搞不定时 |
不要一上来就微调
多数业务问题先用提示工程(见提示工程),需要新知识用 RAG,这两条路都走不通——比如输出风格必须百分百稳定、提示怎么调都不听——才考虑微调。微调是投资最重的手段,也是最后的手段。常见反模式见常见陷阱与反模式。
3. 微调的成本账:什么时候不值得
微调的真实成本远不止 GPU 时间,决策前算全账:
| 成本项 | 说明 |
|---|---|
| 数据成本 | 标注/清洗/抽检的人力,通常被低估 |
| 训练成本 | GPU 租赁、试错轮次(调参 3~5 轮很常见) |
| 评估成本 | 微调前后回归、红队与安全评测 |
| 运维成本 | 模型版本管理、灰度、监控、回滚 |
什么时候明确不值得微调:需求是临时性的、数据量不足以支撑稳定行为、业务指标变化无法用评估量化、或团队没有持续迭代能力。这些情况下,提示或 RAG 是更理性的选择。
4. 微调之后怎么迭代
一个健康的微调工作流是:小数据试跑 → 评估 → 扩数据 → 再评估 → 灰度上线 → 线上反馈回流数据。微调不是一次性动作,而是像产品功能一样持续迭代的闭环。
延伸阅读
- 对齐:RLHF 与 DPO——SFT 之后的对齐阶段,RLHF 的第一步就是 SFT
- 预训练:数据与目标——微调之前的建模范式,理解两者的边界
- 评测与基准——微调必须配套的评估体系
- 微调实战:LoRA 全流程——从数据到部署的完整实操
- 提示工程——先于微调试用的低成本手段
- 数据集与基准档案——SFT 数据与评测基准清单
参考资料
- Hu et al. LoRA: Low-Rank Adaptation of Large Language Models(ICLR 2022,2021 年 10 月 arXiv 首发) —— LoRA 原始论文,低秩分解微调
- Dettmers et al. QLoRA: Efficient Finetuning of Quantized LLMs(NeurIPS 2023) —— 4-bit 量化 + LoRA,单卡微调 65B
- Taori et al. Stanford Alpaca: An Instruction-following LLaMA model(2023) —— 约 52K 条指令数据开源项目
- Houlsby et al. Parameter-Efficient Transfer Learning for NLP(ICML 2019) —— Adapter 方法
- Liu et al. P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks(2022) —— P-Tuning 系列
- Ouyang et al. Training language models to follow instructions with human feedback(InstructGPT, 2022) —— SFT 作为 RLHF 第一步的原始出处