第16章:监督微调(SFT)
预训练结束后,你得到了一个见多识广的"百科全书"——它能流畅地续写任何文本,却不太会回答问题。让它变成一个听话的助手,需要另一道工序:监督微调(Supervised Fine-Tuning,SFT)。
16.1 指令微调的目标
预训练模型会做什么,不会做什么
预训练的目标是语言建模:给定前文 ,预测下一个 token 。模型在海量文本上优化这一目标后,学会了世界知识、语言规律,乃至推理能力——但它学到的是"文本续写"的反射,而非"回答问题"的行为。
举例说明:给预训练模型输入
问题:法国的首都是哪里?
它可能输出:
问题:法国的首都是哪里?
答案:巴黎。
问题:德国的首都是哪里?
答案:柏林。
因为训练语料里充斥着 Q&A 列表,模型的"本能"是续写更多 Q&A,而不是停下来只回答你的问题。
SFT 教什么
SFT 的目的是让模型学会按指令行事(instruction following):
- 理解用户意图,而不是机械续写
- 用合适的格式和语气作答
- 在该停止时停止
:::info 直觉 SFT 不是在给模型灌输新知识——知识在预训练时已经编码进权重。SFT 教的是"行为规范":何时该回答、如何组织答案、什么格式更有用。 :::
数据格式:Prompt + Response 对
SFT 的训练数据是(指令,回复)对,常见格式为:
{
"instruction": "请用一句话解释什么是黑洞。",
"response": "黑洞是宇宙中引力极强的天体,连光都无法逃脱其引力范围。"
}
训练时,模型仅在 response 部分计算 loss,instruction 部分作为上下文输入但不参与梯度更新:
与预训练的核心区别
| 维度 | 预训练 | SFT |
|---|---|---|
| 数据量 | 万亿 token | 1 万 ~ 100 万条 |
| 数据来源 | 互联网爬取(低过滤) | 人工标注/精心筛选 |
| 训练目标 | 无监督语言建模 | 有监督指令跟随 |
| 学到的是 | 世界知识 + 语言能力 | 行为规范 + 输出格式 |
| 计算成本 | 极高(千卡·周) | 较低(数卡·小时) |
16.2 全参数微调 vs 参数高效微调
全参数微调(Full Fine-Tuning)
最直接的方案:用 SFT 数据更新模型的全部参数,梯度从 loss 反向传播,覆盖每一层每一个权重。
对于参数量为 的模型,全参数微调需要存储:
- 模型权重: 个参数(FP16 约 字节)
- 梯度: 个( 字节)
- 优化器状态(AdamW): 个( 字节,FP32)
总显存约 字节。对于 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) 的出发点是一个经验观察:
预训练模型的权重更新矩阵 在实践中呈现出低内在秩(intrinsic rank)。
换句话说,微调所需的"知识增量"并不需要占满整个高维空间——它通常分布在一个低维子空间里。
既然如此,与其直接学习一个 的稠密更新矩阵,不如将其分解为两个低秩矩阵的乘积:
其中:
- 是冻结的原始权重
- ,
- ,称为秩(rank)
参数量对比
以 (典型的 LLaMA-2 7B 注意力投影层)为例:
| 方案 | 参数量 | 相对全参数 |
|---|---|---|
| 全参数 | 100% | |
| LoRA | 0.39% | |
| LoRA | 3.1% |
参数量减少 30~250 倍,显存需求随之大幅下降——梯度和优化器状态只需针对 两个小矩阵计算。
初始化策略
LoRA 对初始化有讲究:
- 用高斯随机初始化
- 初始化为全零
这样在训练开始时 ,模型行为与原始预训练权重完全一致,避免了训练初期的不稳定。
缩放因子 控制 LoRA 分支的贡献强度:
通常设 或 ,实践中对结果影响不大。
推理时无额外延迟
LoRA 最优雅的特性是推理零开销:训练结束后,将 直接加回原始权重:
合并后的模型与标准 Transformer 结构完全相同,无需任何额外的前向计算路径,推理速度无损失。
:::tip 应用在哪些层? LoRA 通常应用于注意力层的 (Query/Value 投影矩阵),有时也扩展到 以及 FFN 层。原论文仅对 做 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 精度下最大化信息密度:
其中 是标准正态分布的逆累积分布函数。
16.4 数据质量 vs 数量的权衡
LIMA 的启示
2023 年,Meta 的研究论文 LIMA(Less Is More for Alignment) 给了社区一个反直觉的发现:
用 1000 条人工精选的高质量样本 微调 LLaMA-65B,其效果在人类评估中优于用 50000 条自动生成样本 微调的同等模型。
:::info "少即是多"的直觉 SFT 不是在训练知识,而是在训练"行为方式"。模型已经具备语言能力,SFT 只是在告诉它:面对这类问题,应该以这种格式、这种语气、这种深度作答。少量高质量示范足以传达这一信息。 :::
数据质量的维度
高质量 SFT 数据通常满足:
- 多样性:覆盖不同任务类型(问答、摘要、代码、推理……)
- 准确性:回复内容事实正确,无明显错误
- 格式一致:遵循统一的对话格式(如 Alpaca 模板、ChatML 格式)
- 适当长度:既不过于简短敷衍,也不冗余堆砌
多任务平衡:防止灾难性遗忘
当 SFT 数据集包含多类任务时,若某类任务占比过高(如 80% 的代码生成),模型可能出现灾难性遗忘(catastrophic forgetting):它变得更擅长写代码,却"忘记"了如何做数学推理或写文章。
常用缓解策略:
- 按任务类别控制比例,每类任务数量大致均衡
- 混入少量预训练语料(Replay),提醒模型保留通用能力
- 学习率要小:SFT 的学习率通常比预训练低 1~2 个数量级(如 vs )
本章小结
| 概念 | 要点 |
|---|---|
| SFT 目标 | 将文本补全模型转变为指令跟随模型,教的是行为而非知识 |
| 训练方式 | 有监督,仅对 response 部分计算 loss |
| 全参数微调 | 效果上限高,但显存需求约为 字节,大模型难以承受 |
| LoRA | ,参数量减少 30~250 倍,推理时可无损合并 |
| QLoRA | NF4 量化 + LoRA,4 张 A100 可微调 70B 模型 |
| 数据质量 | 1000 条高质量 > 50000 条低质量;SFT 数据质量优先于数量 |
| 灾难性遗忘 | 多任务需平衡比例,学习率要小 |
SFT 让模型成为一个"听话的助手",但"听话"并不等于"对齐"——模型可能给出有害的、虚假的、或仅仅是人类不喜欢的回答。如何进一步让模型的输出符合人类偏好?这就引出了下一章:RLHF 与人类反馈强化学习。