后训练笔记 02:SFT 与 PEFT

本篇介绍SFT 和 PEFT。

在大模型后训练里,SFT 通常是第一步。Base model 经过大规模预训练后,已经学到语言、知识和模式,但它不一定会按指令回答。SFT 的作用就是教模型遵从指令

PEFT则是SFT的一种解法(即parameter efficient fine-tuning:模型太大,全参数微调成本太高,所以只训练很少一部分参数,让模型适配新任务。

SFT在学啥

Base model 的训练目标通常是 next token prediction,它学的是文本分布。

如果给 base model 一个问题:

请解释一下 LoRA 是什么。

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

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

它主要学这些行为:

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

SFT 的局限

SFT 本质上是 imitation learning。

数据是什么样,模型就往什么样学。如果数据里回答很模板化,模型也会模板化。

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

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

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

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

PEFT

PEFT 指的是 parameter-efficient fine-tuning。

核心想法是:

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

这样做的好处是:(主要就是大家没卡呗)

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

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

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 只是学习一个附加方向。

LoRA 插在哪里

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

  • attention 的 \(W_Q, W_K, W_V, W_O\)
  • FFN 的 up projection / down projection

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

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

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

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

LoRA 为什么推理时方便

LoRA 的更新是:

\[ h = Wx + BAx \]

在启动时,一般A随机高斯初始化,B全零初始化。这样在最开始的时候BA = 0,相当于lora模块不会影响主参数,带来扰动。

  • 那A,B都0呢? 那梯度也为零了呗,更新不了了
  • 那都随机初始化呢? 那带来的扰动太大,破坏了预训练参数了。
  • 那A初始化0,B随机呢?理论一致,但是实测B初始化为0更好。(别问,问就是炼丹炼的)

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

\[ W_{\mathrm{merged}} = W + BA \]

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

如果要服务多个 adapter,就可以保留 base model,按任务加载不同 LoRA 权重。比如那种生图的模型,一个lora就代表一种画风。

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

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

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

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

直觉上:

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

它的优势是训练参数少。

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

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吊打了。

补充说明

SFT 数据比方法更重要

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

高质量 SFT 数据要满足:

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

如果数据质量差,LoRA训出来也是垃圾

参考资料