跳到主要内容

第16章:监督微调(SFT)

预训练结束后,你得到了一个见多识广的"百科全书"——它能流畅地续写任何文本,却不太会回答问题。让它变成一个听话的助手,需要另一道工序:监督微调(Supervised Fine-Tuning,SFT)


16.1 指令微调的目标

预训练模型会做什么,不会做什么

预训练的目标是语言建模:给定前文 x1:tx_{1:t},预测下一个 token xt+1x_{t+1}。模型在海量文本上优化这一目标后,学会了世界知识、语言规律,乃至推理能力——但它学到的是"文本续写"的反射,而非"回答问题"的行为。

举例说明:给预训练模型输入

问题:法国的首都是哪里?

它可能输出:

问题:法国的首都是哪里?
答案:巴黎。
问题:德国的首都是哪里?
答案:柏林。

因为训练语料里充斥着 Q&A 列表,模型的"本能"是续写更多 Q&A,而不是停下来只回答你的问题。

SFT 教什么

SFT 的目的是让模型学会按指令行事(instruction following)

  • 理解用户意图,而不是机械续写
  • 用合适的格式和语气作答
  • 在该停止时停止

:::info 直觉 SFT 不是在给模型灌输新知识——知识在预训练时已经编码进权重。SFT 教的是"行为规范":何时该回答、如何组织答案、什么格式更有用。 :::

数据格式:Prompt + Response 对

SFT 的训练数据是(指令,回复)对,常见格式为:

{
"instruction": "请用一句话解释什么是黑洞。",
"response": "黑洞是宇宙中引力极强的天体,连光都无法逃脱其引力范围。"
}

训练时,模型仅在 response 部分计算 loss,instruction 部分作为上下文输入但不参与梯度更新:

LSFT=tresponselogPθ(xtx<t)\mathcal{L}_{\text{SFT}} = -\sum_{t \in \text{response}} \log P_\theta(x_t \mid x_{<t})

与预训练的核心区别

维度预训练SFT
数据量万亿 token1 万 ~ 100 万条
数据来源互联网爬取(低过滤)人工标注/精心筛选
训练目标无监督语言建模有监督指令跟随
学到的是世界知识 + 语言能力行为规范 + 输出格式
计算成本极高(千卡·周)较低(数卡·小时)

16.2 全参数微调 vs 参数高效微调

全参数微调(Full Fine-Tuning)

最直接的方案:用 SFT 数据更新模型的全部参数,梯度从 loss 反向传播,覆盖每一层每一个权重。

对于参数量为 NN 的模型,全参数微调需要存储:

  • 模型权重:NN 个参数(FP16 约 2N2N 字节)
  • 梯度:NN 个(2N2N 字节)
  • 优化器状态(AdamW):2N2N 个(8N8N 字节,FP32)

总显存约 12N12N 字节。对于 7B 模型,约需 84 GB 显存——单张 A100(80 GB)都装不下。

:::warning 显存墙 70B 模型全参数微调约需 840 GB 显存,相当于 10 张 A100。大多数研究者和工程团队根本负担不起。 :::

PEFT:参数高效微调

PEFT(Parameter-Efficient Fine-Tuning) 的核心思路是:只更新少量参数,冻结绝大多数权重

早期方案包括:

  • Adapter:在每个 Transformer 层内插入小型瓶颈网络(bottleneck),只训练 Adapter 参数,约占总参数的 0.5%~3%
  • Prefix Tuning:在每层的 Key/Value 前拼接可训练的"前缀向量",不改动原始权重
  • Prompt Tuning:只在输入层加入可训练的软提示(soft prompt),其余全部冻结

这些方案验证了 PEFT 的可行性,但各有局限:Adapter 在推理时引入额外的串行计算;Prefix/Prompt Tuning 在小模型上效果不稳定。

直到 LoRA 出现,PEFT 才真正走向工业实践。


16.3 LoRA:低秩适配

核心思想

LoRA(Low-Rank Adaptation) 的出发点是一个经验观察:

预训练模型的权重更新矩阵 ΔW\Delta W 在实践中呈现出低内在秩(intrinsic rank)

换句话说,微调所需的"知识增量"并不需要占满整个高维空间——它通常分布在一个低维子空间里。

既然如此,与其直接学习一个 d×kd \times k 的稠密更新矩阵,不如将其分解为两个低秩矩阵的乘积

W=W+ΔW=W+ABW' = W + \Delta W = W + A \cdot B

其中:

  • WRd×kW \in \mathbb{R}^{d \times k} 是冻结的原始权重
  • ARd×rA \in \mathbb{R}^{d \times r}BRr×kB \in \mathbb{R}^{r \times k}
  • rmin(d,k)r \ll \min(d, k),称为秩(rank)

参数量对比

d=k=4096d = k = 4096(典型的 LLaMA-2 7B 注意力投影层)为例:

方案参数量相对全参数
全参数 ΔW\Delta W4096×4096=16.7M4096 \times 4096 = 16.7M100%
LoRA r=8r=84096×8+8×4096=65K4096 \times 8 + 8 \times 4096 = 65K0.39%
LoRA r=64r=644096×64+64×4096=524K4096 \times 64 + 64 \times 4096 = 524K3.1%

参数量减少 30~250 倍,显存需求随之大幅下降——梯度和优化器状态只需针对 A,BA, B 两个小矩阵计算。

初始化策略

LoRA 对初始化有讲究:

  • AA 用高斯随机初始化
  • BB 初始化为全零

这样在训练开始时 ΔW=AB=0\Delta W = AB = 0,模型行为与原始预训练权重完全一致,避免了训练初期的不稳定。

缩放因子 α\alpha 控制 LoRA 分支的贡献强度:

W=W+αrABW' = W + \frac{\alpha}{r} A B

通常设 α=r\alpha = rα=2r\alpha = 2r,实践中对结果影响不大。

推理时无额外延迟

LoRA 最优雅的特性是推理零开销:训练结束后,将 ABAB 直接加回原始权重:

Wmerged=W+ABW_{\text{merged}} = W + AB

合并后的模型与标准 Transformer 结构完全相同,无需任何额外的前向计算路径,推理速度无损失。

:::tip 应用在哪些层? LoRA 通常应用于注意力层的 Wq,WvW_q, W_v(Query/Value 投影矩阵),有时也扩展到 Wk,WoW_k, W_o 以及 FFN 层。原论文仅对 Wq,WvW_q, W_v 做 LoRA 也能取得良好效果。 :::

QLoRA:在量化模型上做 LoRA

LoRA 已经大幅降低了显存,但对于 70B 模型,即便是 LoRA 的可训练参数本身也需要大量激活内存。QLoRA 进一步将基础模型量化为 NF4(4-bit NormalFloat) 格式,再在其上做 LoRA:

方案70B 模型显存估算
全参数微调(FP16)~840 GB
LoRA(FP16 基础)~160 GB
QLoRA(NF4 + LoRA)~48 GB

QLoRA 使得用 4 张 A100(80 GB × 4 = 320 GB 总显存)微调 70B 模型成为可能,大幅降低了大模型微调的门槛。

NF4 量化的关键:它并非均匀量化,而是根据正态分布的分位数(quantile)分配 16 个离散值,能在 4-bit 精度下最大化信息密度:

qi=Φ1 ⁣(i+0.516),i=0,1,,15q_i = \Phi^{-1}\!\left(\frac{i + 0.5}{16}\right), \quad i = 0, 1, \ldots, 15

其中 Φ1\Phi^{-1} 是标准正态分布的逆累积分布函数。


16.4 数据质量 vs 数量的权衡

LIMA 的启示

2023 年,Meta 的研究论文 LIMA(Less Is More for Alignment) 给了社区一个反直觉的发现:

1000 条人工精选的高质量样本 微调 LLaMA-65B,其效果在人类评估中优于用 50000 条自动生成样本 微调的同等模型。

:::info "少即是多"的直觉 SFT 不是在训练知识,而是在训练"行为方式"。模型已经具备语言能力,SFT 只是在告诉它:面对这类问题,应该以这种格式、这种语气、这种深度作答。少量高质量示范足以传达这一信息。 :::

数据质量的维度

高质量 SFT 数据通常满足:

  1. 多样性:覆盖不同任务类型(问答、摘要、代码、推理……)
  2. 准确性:回复内容事实正确,无明显错误
  3. 格式一致:遵循统一的对话格式(如 Alpaca 模板、ChatML 格式)
  4. 适当长度:既不过于简短敷衍,也不冗余堆砌

多任务平衡:防止灾难性遗忘

当 SFT 数据集包含多类任务时,若某类任务占比过高(如 80% 的代码生成),模型可能出现灾难性遗忘(catastrophic forgetting):它变得更擅长写代码,却"忘记"了如何做数学推理或写文章。

常用缓解策略:

  • 按任务类别控制比例,每类任务数量大致均衡
  • 混入少量预训练语料(Replay),提醒模型保留通用能力
  • 学习率要小:SFT 的学习率通常比预训练低 1~2 个数量级(如 1×1051 \times 10^{-5} vs 3×1043 \times 10^{-4}

本章小结

概念要点
SFT 目标将文本补全模型转变为指令跟随模型,教的是行为而非知识
训练方式有监督,仅对 response 部分计算 loss
全参数微调效果上限高,但显存需求约为 12N12N 字节,大模型难以承受
LoRAΔW=AB\Delta W = AB,参数量减少 30~250 倍,推理时可无损合并
QLoRANF4 量化 + LoRA,4 张 A100 可微调 70B 模型
数据质量1000 条高质量 > 50000 条低质量;SFT 数据质量优先于数量
灾难性遗忘多任务需平衡比例,学习率要小

SFT 让模型成为一个"听话的助手",但"听话"并不等于"对齐"——模型可能给出有害的、虚假的、或仅仅是人类不喜欢的回答。如何进一步让模型的输出符合人类偏好?这就引出了下一章:RLHF 与人类反馈强化学习