假如模型看过很多关于 LayerNorm 的文本,我们问它有什么作用,得到的却可能是一段问题续写。知道相关知识,并不保证模型会按对话约定使用它。我们可以先给它示范什么样的内容需要回答,再比较几种回答中哪一种更好。这分别引出了 SFT 和偏好学习,也决定了两者需要不同形式的数据。

1. SFT 学的是什么

我们先给出一条最小的单轮示范:

{
  "messages": [
    {"role": "system", "content": "You are a concise technical assistant."},
    {"role": "user", "content": "Why is layer normalization used?"},
    {"role": "assistant", "content": "It controls the scale of hidden states across features and improves optimization stability."}
  ]
}

对人来说,角色字段已经很清楚;对模型来说,它们还需要通过 Chat Template 转成 token 序列。通常我们只希望模型学习 assistant 的回答,把 system、user 和工具观察作为条件。设 $y_t$ 是错位预测中的目标 token,用 $m_t\in\{0,1\}$ 标记它是否需要监督,就得到

$$\mathcal L_{SFT} =-\frac{1}{\sum_t m_t}\sum_t m_t\log p_\theta(y_t\mid y_{<t})$$

分母是实际参与监督的 token 数,因此这里平均的是回答部分的损失。把 user token 也纳入监督,会额外训练用户侧文本的生成,这是否合适取决于数据方案,不能一概视为错误。我们更需要确认的是目标是否一致:结束标记有没有纳入训练,推理使用的角色模板是否相同,以及 loss mask 是否恰好覆盖了希望模型输出的部分。

SFT、奖励模型与强化学习组成的经典 RLHF 流程

图 1:经典后训练流程中的 SFT、奖励模型和强化学习。 图引自 Stanford CS336 课程材料

2. 多轮对话与工具调用

如果回答过程中还要查一次工具,只提供最终答案就不够了。我们用下面的简化结构保留调用与观察;具体字段需要按实际模型的 Chat Template 序列化:

{
  "messages": [
    {"role": "user", "content": "查询北京明天的天气。"},
    {"role": "assistant", "tool_call": {"name": "weather", "arguments": {"city": "北京", "day": "tomorrow"}}},
    {"role": "tool", "content": {"condition": "rain", "high": 28}},
    {"role": "assistant", "content": "北京明天有雨,最高约 28 摄氏度,外出建议带伞。"}
  ]
}

沿着这个样本读下来,我们可以区分两种文本:工具名与参数由 assistant 决定,天气结果由环境提供。模型要学习前者,并根据后者继续回答,一般不需要学习假装生成工具返回值。若所有样本都一次调用成功,训练中就缺少修正参数和处理失败的机会,所以轨迹质量也包含对这些情形的覆盖。

3. 数据质量与微调方式

我们把示范复制很多遍,也可能得到很低的 loss,但模型学到的新增行为并没有随数量增长。选择 SFT 数据时,要看任务、难度、长度和表达方式是否提供了新的覆盖。去重、质量筛选和抽样检查的作用,便是避免把模板重复误当成监督的丰富程度。

监督内容确定后,还可以选择更新多少参数。全参数微调允许修改整个模型;若显存或多任务存储受限,我们可以冻结原始权重,只训练一个低秩增量。LoRA 将它写成

$$W'=W+\Delta W=W+BA,$$

其中 $A\in\mathbb R^{r\times d_{in}}$,$B\in\mathbb R^{d_{out}\times r}$,且 $r$ 远小于原始维度。QLoRA 进一步量化冻结的基础权重。LoRA 的 rank 和 target modules 没有固定答案,仍需检查格式、知识与遗忘情况。

4. 为什么还需要偏好数据

即使模型已经会回答,我们仍可能对答案不满意。SFT 告诉模型示范怎么写,却没有显式比较同一问题下的两个候选。如果我们能判断哪个更准确或更合适,就可以构造成对偏好数据:

{
  "prompt": "Explain why FP16 training may overflow.",
  "chosen": "FP16 has five exponent bits, so values above 65504 overflow.",
  "rejected": "FP16 overflows because it has too few decimal places."
}

在这个例子里,我们选择前者,是因为它把上溢与指数范围联系起来;后者混淆了范围和精度。这个比较依据要尽量明确。若 chosen 总是更长,模型也可能仅凭长度就拟合标注,因此长度、格式和难度的分布都需要检查。

5. 奖励模型与 PPO

一种自然的处理方式,是先学习一个评分函数 $r_\phi(x,y)$。我们不必要求分数具有绝对含义,只要同一问题下,更受偏好的回答分数更高。Bradley–Terry 模型把这个分数差变成概率:

$$P(y_w\succ y_l\mid x)= \sigma\bigl(r_\phi(x,y_w)-r_\phi(x,y_l)\bigr)$$

当两个分数相同,偏好概率为 $1/2$;差值越大,概率越接近 $1$。训练好奖励模型后,我们便可让当前策略生成新回答,再依据评分优化。经典 RLHF 会在奖励中加入相对参考策略的 KL 约束,其策略目标可写为

$$\max_\theta\ \mathbb E_{y\sim\pi_\theta}[r_\phi(x,y)] -\beta D_{KL}(\pi_\theta\Vert\pi_{ref})$$

这里是带 KL 正则的目标,PPO 是用来近似优化它的方法,实际还会使用概率比裁剪和优势估计。我们因而要维护策略、参考策略、奖励模型以及价值估计,工程成本明显高于 SFT。另一个困难是评分并不总可靠:策略可能越来越擅长获得高分,却没有相应提高回答质量,这需要独立评测来识别。

6. DPO

既然偏好标签来自两个回答的比较,我们能否直接更新策略,省去单独训练奖励模型?DPO 利用了前面 KL 正则目标的一个性质:最优策略满足

$$r(x,y)=\beta\log\frac{\pi^*(y\mid x)}{\pi_{ref}(y\mid x)}+\beta\log Z(x)$$

$Z(x)$ 是给定问题下的归一化项。同一问题的两个奖励相减时,这一项恰好消失。我们将剩余的对数概率比代入偏好模型,并用可训练的 $\pi_\theta$ 参数化,就得到

$$\mathcal L_{DPO}=-\log\sigma\left( \beta\left[ \log\frac{\pi_\theta(y_w\mid x)}{\pi_{ref}(y_w\mid x)} -\log\frac{\pi_\theta(y_l\mid x)}{\pi_{ref}(y_l\mid x)} \right]\right)$$

括号比较的是两个回答相对参考模型的对数概率比之差,每个回答的对数概率都由各 token 累加得到。我们需要让这个差增大,但这并不要求 chosen 的绝对概率一定上升:若两者都下降,只要 rejected 相对下降得更多,目标仍可能改善。这也是不能把 DPO 简单理解成只做一次正负样本概率调整的原因。

DPO 从带 KL 约束的 RLHF 目标中得到隐式奖励

图 2:DPO 将偏好模型中的奖励差改写为策略概率比。 图引自 Stanford CS336 课程材料

DPO 不需要单独训练奖励模型,也不在训练时在线 rollout,因而实现较简单。它的学习范围受固定偏好数据限制,对 chosen 与 rejected 的质量、长度和难度分布较敏感。序列对数概率会随长度累加,SimPO 等方法使用长度归一化分数并加入 margin,尝试减轻这类偏差。

7. SFT 与偏好优化的分工

现在我们可以回到开头的两个动作:先示范怎样回答,再比较回答好坏。SFT 提供密集的 token 级监督,便于建立格式和任务行为;偏好学习增加相对比较,但不会自动补足初始模型尚未掌握的全部知识。因此,先 SFT 再偏好优化有实际理由,各阶段是否有效仍要分别检验。

评价也不能只看训练 loss 或奖励。SFT 需要检查未见指令、终止行为、多轮一致性和工具参数合法率;偏好训练还要检查事实性、长度偏差、拒答率、KL 与能力遗忘。模型更符合某一类偏好,不代表它在所有任务上都更好。

参考资料:Ouyang et al., Training Language Models to Follow Instructions with Human Feedback;Rafailov et al., Direct Preference Optimization;Meng et al., SimPO;Hu et al., LoRA

最后修改:2026 年 09 月 13 日
如果觉得我的文章对你有用,请随意赞赏