后训练笔记 02:SFT 与 PEFT

这一篇整理 SFT 和 PEFT。

在大模型后训练里,SFT 通常是第一步。Base model 经过大规模预训练后,已经学到语言、知识和模式,但它不一定会按指令回答。SFT 的作用就是先把模型拉到一个“能正常当助手”的状态。

PEFT 则是另一类问题:模型太大,全参数微调成本太高,所以只训练很少一部分参数,让模型适配新任务。

这篇把两件事放一起看:

SFT 解决“训练什么行为”,PEFT 解决“用多低成本训练”。

1. Base model 为什么不能直接用

Base model 的训练目标通常是 next token prediction:

$$
\max_\theta \sum_t \log p_\theta(x_t \mid x_{<t})
$$

它学的是文本分布。

如果给 base model 一个问题:

请解释一下 LoRA 是什么。

它可能回答,也可能继续补全网页文本,或者生成一段类似问答数据的续写。问题不一定是它“不知道”,而是它没有被训练成稳定的 instruction-following model。

SFT 的目标就是把输入输出形式固定下来:

$$
\max_\theta \log \pi_\theta(y \mid x)
$$

其中 $x$ 是 instruction,$y$ 是高质量回答。

2. SFT 具体学到了什么

SFT 不只是“灌知识”。

它主要学这些行为:

  • 遵循指令
  • 按对话格式回答
  • 输出更清晰的结构
  • 遇到不确定问题时更谨慎
  • 学会某些任务格式,比如代码解释、数学推理、摘要
  • 初步形成 reasoning trace 的风格

比如 base model 可能知道 AdamW,但 SFT model 更可能用分点方式解释 Adam 和 AdamW 的区别。

这也是为什么 chat model、instruct model、reasoning model 往往都是从同一个 base model 派生出来,但行为差很多。

3. SFT 的局限

SFT 本质上是 imitation learning。

数据是什么样,模型就往什么样学。

如果数据里回答很模板化,模型也会模板化。

如果数据里推理过程只是表面解释,模型会学会写“看起来像推理”的文本,但不一定真的更会解题。

如果数据里有错误,模型会跟着学。

更关键的是,SFT 不知道两个正确回答哪个更好。

比如一个回答很简洁,一个回答更完整;一个回答更安全,一个回答更直接。SFT 只能模仿目标答案,不能表达偏好排序。

所以 SFT 通常只是后训练的起点,后面还需要 DPO、PPO、GRPO、KTO 或 OPD。

4. Full fine-tuning 的成本

全参数微调会更新模型所有参数。

对于小模型,这很直接。对于几十亿、几百亿参数模型,成本很高:

  • optimizer states 占显存
  • gradient 占显存
  • checkpoint 很大
  • 多个任务需要存多份模型
  • 训练和部署都更重

Adam 优化器通常需要为每个参数维护一阶、二阶动量,所以显存压力不只是模型参数本身。

这就是 PEFT 出现的背景:不改全部参数,只训练小模块。

5. PEFT 的基本想法

PEFT 是 parameter-efficient fine-tuning。

核心想法是:

冻结大部分预训练参数,只训练少量可学习参数,让模型适配新任务。

这样做的好处是:

  • 训练显存低
  • 存储成本低
  • 多任务可以共用同一个 base model
  • adapter 可以按需加载
  • 实验迭代更快

但它也有代价。训练参数少意味着表达空间受限。如果任务和 base model 差距很大,PEFT 可能不如 full fine-tuning。

6. LoRA:低秩更新

LoRA 的核心想法是:不要直接训练原始权重矩阵 $W$,而是冻结 $W$,只学习一个低秩更新:

$$
W’ = W + \Delta W
$$

其中:

$$
\Delta W = BA
$$

如果 $W \in \mathbb{R}^{d \times k}$,那么可以设:

$$
B \in \mathbb{R}^{d \times r}, \quad A \in \mathbb{R}^{r \times k}, \quad r \ll \min(d,k)
$$

训练参数从 $dk$ 变成 $r(d+k)$。

直觉上,LoRA 假设任务适配所需的权重变化不需要覆盖完整高维空间,而可以落在一个低秩子空间里。

这不是说模型能力只剩低秩。Base model 的原始参数仍然在,LoRA 只是学习一个附加方向。

7. LoRA 插在哪里

LoRA 常插在 Transformer 的线性层上,比如:

  • attention 的 $W_Q, W_K, W_V, W_O$
  • FFN 的 up projection / down projection

具体插哪里会影响效果和成本。

只插 attention 层,参数更少,但适配能力可能有限。

attention 和 FFN 都插,能力更强,但训练参数更多。

对很多任务来说,LoRA rank、target modules、learning rate、数据质量都会显著影响效果。

不要把 LoRA 理解成固定魔法。它是一个低成本适配工具,具体效果依赖配置。

8. LoRA 为什么推理时方便

LoRA 的更新是:

$$
h = Wx + BAx
$$

训练时可以把 $BA$ 当成旁路。

部署时,如果只服务一个 adapter,可以把 $BA$ 合并回 $W$:

$$
W_{\mathrm{merged}} = W + BA
$$

这样推理时不一定增加额外延迟。

如果要服务多个 adapter,就可以保留 base model,按任务加载不同 LoRA 权重。

这也是 LoRA 在个人微调和多任务部署中很受欢迎的原因。

9. Prefix Tuning:给模型加可学习前缀

Prefix tuning 不直接改模型权重,而是在每层 attention 里加入可学习 prefix。

可以理解成给模型提供一组虚拟的 key/value tokens,让后续 token 在 attention 时能读到这些可学习信息。

它和手写 prompt 不一样。手写 prompt 是离散文本,prefix tuning 学的是连续向量。

直觉上:

Prefix tuning 不是告诉模型“请你这样回答”,而是在模型内部提供一组可学习上下文。

它的优势是训练参数少。

缺点是表达能力受限,而且会占用一定上下文或 attention 空间。

10. Prompt Tuning 和 P-Tuning

Prompt tuning 学的是输入 embedding 前面的 soft prompt。

如果原输入是:

$$
[x_1, x_2, …, x_n]
$$

prompt tuning 会在前面拼上一组可学习向量:

$$
[p_1, p_2, …, p_m, x_1, x_2, …, x_n]
$$

P-Tuning 则进一步用更复杂的方式生成或组织这些 continuous prompts,比如使用 MLP / LSTM 等 prompt encoder。

它们的共同点是:冻结模型主体,只训练 prompt-like 参数。

这类方法在早期很重要,但在当前 LLM 微调实践里,LoRA 通常更常见,因为 LoRA 对生成任务更灵活,工程生态也更成熟。

11. LoRA、Prefix Tuning、P-Tuning 怎么选

可以粗略这样看。

LoRA 适合需要改模型行为、任务风格、领域适配的场景。它改的是线性层权重的低秩增量,表达能力相对强。

Prefix tuning 适合希望用少量参数控制模型行为,同时不动主体权重的场景。

Prompt tuning / P-Tuning 更像学习软提示,参数少,但对大模型和复杂生成任务不一定总是最强。

如果是个人博客里的实践建议,我会优先写:

  • 小成本实验:LoRA / QLoRA
  • 需要多任务 adapter:LoRA
  • 只想做轻量控制:prefix / prompt tuning
  • 追求最好效果且资源够:full fine-tuning 或更大规模 post-training

12. QLoRA:进一步省显存

QLoRA 是 LoRA 的重要实践扩展。

它把 base model 量化,比如 4-bit 存储,同时仍然用 LoRA adapter 训练。

关键点是:base model 不参与梯度更新,只需要在前向/反向中提供计算;可训练的是 LoRA 参数。

这样可以在更小显存上微调较大模型。

但量化也可能带来数值误差。QLoRA 的效果依赖量化格式、计算精度、rank、数据质量。

13. SFT 数据比方法更重要

SFT 和 PEFT 经常被讨论成训练技术,但真正决定结果的通常是数据。

高质量 SFT 数据要满足:

  • 指令清楚
  • 回答准确
  • 风格一致但不模板化
  • 覆盖目标任务
  • 没有大量幻觉
  • reasoning trace 不只是装样子

如果数据质量差,LoRA 再省显存也没用。

如果数据太窄,模型会过拟合某种格式。

如果数据里充满“当然可以,下面是……”这种套话,模型会变得很像客服脚本。

所以 SFT 的核心不是把 loss 跑低,而是把模型行为拉到你想要的区域。

14. SFT 和后续 RL / DPO 的关系

SFT 给模型一个可控起点。

DPO / KTO 进一步从偏好信号中学习什么回答更好。

PPO / GRPO 进一步用 reward 或 verifier 优化结果。

OPD 则可以用 teacher 对 student 的 on-policy outputs 做 dense supervision。

如果 SFT 起点太差,后面 RL 可能要花很多成本纠正基础格式问题。

如果 SFT 起点太强但过度模板化,后面偏好优化可能很难恢复多样性。

所以 SFT 不是越多越好,而是要给后续训练留下空间。

15. 读 SFT / PEFT 论文时看什么

我会看这些问题:

  • Base model 是什么
  • SFT 数据来自哪里
  • 数据规模和质量如何
  • 是否包含 reasoning traces
  • 是 full fine-tuning 还是 PEFT
  • LoRA rank 是多少
  • LoRA 插在哪些模块
  • 是否使用 QLoRA
  • 是否只评估 benchmark,还是也看真实对话质量
  • 后面有没有接 DPO/RL/OPD

尤其要注意:很多报告里“用了 LoRA”不是主要贡献。LoRA 只是训练方式,真正重要的是数据、目标和评估。

16. 小结

SFT 是后训练的入口。它让 base model 从“会续写”变成“会回答”。

PEFT 是低成本适配工具。LoRA、Prefix Tuning、P-Tuning 都是在减少可训练参数,但它们改模型的方式不同。

我的理解是:

SFT 决定模型学什么行为,PEFT 决定用多少参数去学这个行为。

后面讲 PPO、DPO、GRPO 时,要一直记住:这些算法通常不是从 raw base model 开始,而是在 SFT 模型基础上继续塑形。

参考资料