Skip to content

微调:SFT 与参数高效微调

本页速览 微调是在预训练基座上用有监督数据继续训练,把"会生成"变成"会按指令干活"。本文系统讲清 SFT 的数据与目标、全参微调与 LoRA/QLoRA/Adapter/P-Tuning 的对比、LoRA 低秩分解原理,以及灾难性遗忘与数据质量等关键工程问题。

微调:SFT 与参数高效微调

微调(fine-tuning)是在预训练大模型的基础上,用少量有监督数据继续更新模型参数,把"会预测下一个词"的通用语言模型改造成"按指定指令完成任务"的可用产品。预训练决定了模型的知识上限,微调决定它能不能把知识"接对线"——预训练回答"模型有多聪明",微调回答"模型好不好用"。

本文属于后训练(post-training)主题。预训练阶段的原理见预训练:数据与目标,微调之后还有更进一步的对齐:RLHF 与 DPO阶段;动手实操见微调实战:LoRA 全流程

一、为什么需要微调:知识与行为的分离

预训练模型学会的是"语言的统计规律":给定上文预测下一个 token。这个能力本身已经能生成通顺的文本,但它有三个明显的产品化缺陷:

  1. 不听话:你问它"请用一句话总结",它可能输出三段话;你让它"只输出 JSON",它输出散文。预训练目标里根本没有"遵循指令"这一项。
  2. 格式不对:真实产品需要对话式、结构化、带角色约束的输出,而原始基座只会"顺着上文继续写"。
  3. 行为不设限:基座模型不会拒绝有害请求,也不会承认自己不知道。

这些缺陷本质上不是"知识不够",而是"行为不对"。微调改变的主要是行为与风格,而不是知识——模型学到的世界知识绝大部分来自预训练阶段,靠几千条微调样本"注入新知识"(尤其是事实性知识)几乎不现实。

从技术史看,"预训练 + 微调"的组合并非新事物: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 效果的主要因素按重要性排序大致是:

  1. 质量与多样性:覆盖的指令类型、难度、领域分布比条数重要。
  2. 干净一致:错误、重复、自相矛盾的样本直接教坏行为。
  3. 数量:在质量达标后增加数量才有正收益。

质量 > 数量的判断标准

一个实用判断:如果一条样本你作为人类都不觉得它是"好的回答",就不要放进 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)**指冻结大部分模型参数,只训练少量新增/选中的参数,把微调成本降一到两个数量级。主流方法对比如下:

方法代表论文/年份训练什么显存/成本典型收益
全参微调全部参数上限最高,但遗忘风险大
LoRAHu et al. 2021注入的低秩矩阵可训练参数 <1%,效果接近全参
QLoRADettmers et al. 2023低秩矩阵 + 4-bit 基座极低65B 模型单卡可微调
AdapterHoulsby et al. 2019Transformer 层间小网络每层加参数,模块化
P-Tuning / PrefixLiu et al. 2022 / Li & Liang 2021可学习的连续前缀向量最低只动 embedding 层附近
BitFitBen 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. 微调之后怎么迭代

一个健康的微调工作流是:小数据试跑 → 评估 → 扩数据 → 再评估 → 灰度上线 → 线上反馈回流数据。微调不是一次性动作,而是像产品功能一样持续迭代的闭环。

延伸阅读

参考资料