预训练之后:SFT、Midtraining 与 RLHF 数据

预训练把语言模型带到了 GPT-3 式的能力边界:模型会续写文本,会补全模式,也把大量语言和世界知识压进参数里。可从用户这一侧看,base model 还不像一个真正的“助手”。用户期待的不是只会继续写下去的机器,而是能读懂指令、控制语气、守住安全边界,并在多轮对话里持续有用的系统。supervised finetuning、midtraining、RLHF 数据、PPO / DPO,以及奖励优化中的一整套工程取舍,大体就是为了解决这段距离。

一个简化的现代 post-training pipeline 可以写成:

Base LMSFT / instruction tuningChat / instruct modelpreference optimizationaligned assistant

这条线当然太直了。真实流程里,SFT 数据不是简单的问答对;偏好数据也不只是“人类喜欢哪个回答”;RLHF 优化更不是把 reward 往上推就完事。麻烦在于:我们想控制模型行为,但控制信号本身往往混着风格、标注者偏好、数据来源、事实性、长度偏置和安全规范。

SFT:从续写文本到服从指令

Supervised Finetuning(SFT)的基本形式非常简单。给定一批指令和目标回答 (𝑥,𝑦),继续用 teacher forcing 训练语言模型:

𝐿SFT(𝜃)=𝔼(𝑥,𝑦)𝐷[log𝑝𝜃(𝑦|𝑥)]

形式没有变,仍然是标准的语言模型最大似然训练;变的是数据分布,从“互联网文本”换成了“用户指令和理想回答”。这一步通常不是为了往模型里塞入大量新知识,而是把预训练阶段已经出现的能力抽取出来,包装成更符合用户交互习惯的行为。

这里容易产生一个误解。SFT 最擅长教模型“如何表现”:怎样按指令回答,什么时候分点,危险请求该怎么拒绝,工具调用格式该怎么写。它未必适合补大量预训练中完全没有的尾部事实。SFT 的损失只是在给定上下文下提高目标 token 的概率;如果模型原本没有掌握某个事实,它学到的可能是“这类问题应该生成一个带引用的答案”,而不是可靠地存储并检索新事实。

所以,把 SFT 当成行为抽取和行为塑形更合适;把它当成高效的知识注入机制,就容易用错地方。实际系统常把知识更新交给检索、工具或数据库,而不是把所有新事实都靠 SFT 写进参数里。

指令数据长什么样

早期开放指令数据集之间的差别非常大。FLAN 更像是 NLP benchmark 的自然语言包装:分类、摘要、翻译、阅读理解等任务被统一改写成指令格式。Alpaca 则更接近日常问答,回答短、格式规整,很多样本像“给三个健康建议”或“解释什么是算法”。OpenAssistant / ShareGPT / Vicuna 这一路数据更像真实聊天记录,回答更长、更细、更 conversational。近两年的数据又进一步走向 tool use 和 agentic workflow:回答中会出现函数调用、计划步骤、工具结果引用和多轮状态。

这些差异不只决定模型会不会“完成任务”,还会改变模型的气质。在 FLAN 风格数据上调出来的模型,可能更像考试系统;在 ShareGPT 风格数据上调出来的模型,可能更愿意长篇解释;大量见过工具调用数据的模型,则更容易把问题拆成调用外部能力的步骤。

这里有几个容易被忽略的维度:

这些维度往往比 benchmark 分数更直接地影响使用体验。模型学到的不只是“答案”,还有“怎样像一个回答者那样回答”。

风格偏置:长度和格式会变成奖励

偏好评估里有个很麻烦的现象:长回答经常更容易赢。人类标注者和 LLM-as-a-judge 都可能偏好更长、更完整、更像“认真回答”的输出,即使它们并不一定更准确。模型一旦学会多写 bullet points、多加 caveat、多给背景解释,就可能在偏好评估中占便宜。

结果是,SFT 和 RLHF 很容易把模型推向更“啰嗦”的方向。离线 win-rate 看着漂亮,到了真实使用中却未必等价于用户满意度;用户有时要的恰恰是简洁、准确、直接。评估 chat model 时,helpfulness、factuality、verbosity、latency 和 instruction following 最好分开看,只盯一个总分很容易误判。

从训练目标看,长度偏置很容易出现。假设两个回答 𝑦𝑎,𝑦𝑏 的事实质量相近,但 𝑦𝑎 更长、更结构化,标注者更常选择 𝑦𝑎。那么偏好优化会提高 𝑝𝜃(𝑦𝑎|𝑥),降低 𝑝𝜃(𝑦𝑏|𝑥)。久而久之,模型就会把“更长、更像解释”当成偏好本身的一部分。

后训练数据的质量不只取决于“答案是否正确”,还取决于它有没有把我们想要的偏好和不想要的风格捷径混在一起。

复杂知识与事实性:SFT 不一定适合教新事实

拿带引用的 OpenAssistant 样本来说:用户要求介绍某个经济学概念,并引用相关研究;回答中出现了具体论文、作者和期刊信息。这样的样本看起来很高质量,但它到底在教模型什么?

可能有两种解释:

  1. 它在教模型一个具体事实,例如某篇论文与某个概念有关。
  2. 它在教模型一种输出形式:当用户要求引用时,应该生成看起来像引用的段落。

危险主要在第二种解释。如果模型没有检索或验证机制,SFT 增强的可能是“生成引用格式”的能力,而不是“引用真实文献”的能力。换句话说,模型可能更会写出像论文引用的东西,却不一定更能保证引用真实。

这也符合一个常见经验:用微调向模型灌入它原本不知道的尾部知识,反而可能增加幻觉。最大似然训练只告诉模型“这个上下文后面应该长这样”,并不会显式区分“我知道这个事实”和“我应该编出一个符合格式的事实”。如果任务需要尾部知识,检索增强、工具调用或显式验证通常比单纯 SFT 更稳。

安全数据:少量样本也可以改变边界

安全微调是 SFT 数据中的特殊部分。和开放问答不同,安全数据常常不是为了让模型知道更多事实,而是为了让模型在某些场景下采取不同策略:拒绝、解释风险、提供安全替代方案,或者要求更多上下文。

一个很有意思的经验是:几百条高质量安全样本就可能显著改善模型的拒答行为。这暗示许多安全能力并不一定需要海量数据才出现。预训练模型本身已经知道危险请求、暴力、欺诈、仇恨言论等概念;SFT 只是把这些概念和“应该如何回应”绑定起来。

这就要求安全数据格外关注 scenario coverage。少量样本可以改变模型在常见风险模式下的行为,但长尾风险仍然需要更多场景、更细的 policy 和持续评估。安全不是一个单点分类任务,而是一组行为边界。

Midtraining:把指令数据混回预训练

如果 SFT 数据很多,直接在 instruction data 上长时间微调会带来一个问题:模型可能遗忘一部分通用语言建模能力,也可能过度适应聊天格式。许多公司采用所谓 midtraining 或 two-phase training,就是在处理这个张力。

一个抽象配方是:

  1. 在 web / code / math 等普通预训练数据上训练 base model。
  2. 在继续预训练阶段混入一部分 instruction / dialogue / tool-use 数据。
  3. 最后再做一个较短的 SFT,让模型明确进入 assistant 格式。

这样一来,instruction data 不再只是最后阶段的一小撮微调数据,而是被并入更大规模的 language modeling 训练中。模型有机会在不完全脱离预训练分布的情况下,逐渐熟悉指令、对话和工具格式。最后的 SFT 更像一次短而明确的行为校准。

直觉上,midtraining 是把“学会某种数据格式”提前到更大的训练阶段,而不是等 base model 完全定型后再硬拧过去。这样通常能降低 catastrophic forgetting,也让模型更自然地吸收对话和工具使用模式。

从模仿到优化

SFT 是 imitation:我们给模型一批人写好的回答,让它模仿这些回答。形式上,它拟合某个参考分布 𝑝(𝑦|𝑥)

𝑝𝜃(𝑦|𝑥)𝑝(𝑦|𝑥)

但人写出来的回答,不一定等于人真正最喜欢的回答。比如摘要任务里,人类写的参考摘要可能并不是用户最偏好的模型输出;用户可能更喜欢结构更清楚、信息覆盖更全、语言更直接的版本。这就是 generation-verification gap:生成一个好答案和判断哪个答案更好,是两个不同难度的任务。

RLHF 换了一个问法:不再只问“人类会写什么”,而是问“人类更喜欢什么”。如果有一个奖励函数 𝑅(𝑥,𝑦) 能衡量回答质量,目标可以写成:

max𝜃𝔼𝑦𝑝𝜃(.|𝑥)[𝑅(𝑥,𝑦)]

由于直接优化这个目标会让模型偏离原始语言能力,实际 RLHF 通常加上 KL 约束:

max𝜋𝔼𝑦𝜋(.|𝑥)[𝑅(𝑥,𝑦)𝛽log𝜋(𝑦|𝑥)𝜋ref(𝑦|𝑥)]

其中 𝜋ref 通常是 SFT 模型的冻结副本。这个约束的意思很朴素:可以为了更高奖励调整输出分布,但不要离参考模型太远。

偏好数据:二选一看起来简单,其实很脏

RLHF 最常见的数据形式是 pairwise preference。给定同一个 prompt 𝑥,让标注者比较两个回答 𝑦𝑤𝑦𝑙,选出更好的那个。奖励模型常用 Bradley-Terry 目标训练:

𝐿RM(𝜑)=𝔼(𝑥,𝑦𝑤,𝑦𝑙)𝐷[log𝜎(𝑟𝜑(𝑥,𝑦𝑤)𝑟𝜑(𝑥,𝑦𝑙))]

这个目标很干净,数据收集却不干净。标注者需要判断 helpfulness、truthfulness、harmlessness、style、完整性,有时还要验证事实。现实中,标注者可能时间有限、领域知识不足、收入激励复杂,也可能使用 AI 辅助完成标注。偏好数据里混入非目标因素,几乎是必然的。

更细一点看,RLHF 数据至少有三类偏差:

换句话说,RLHF 并不是把一个客观的人类价值函数喂给模型;它学习的是某个标注流程、某群标注者和某套 guideline 共同产生的偏好分布。

AI 反馈与自训练

人类偏好数据昂贵,现代后训练越来越多地使用 AI feedback。强模型可以作为 judge,对候选回答进行排序、打分或指出问题。GPT-4 等模型在系统级 ranking 上往往与人类偏好高度相关,所以也常被用来构造大规模偏好数据;UltraFeedback、Zephyr、Tulu 系列中都能看到类似思路。

AI feedback 的优势在规模和一致性:它可以快速评价大量样本,也可以按照统一 rubric 输出偏好。风险也摆在那里。如果 judge model 有自己的风格偏好、政治偏好、长度偏好或事实盲区,被训练模型会继承这些偏差。更进一步,训练数据若大量来自同类模型的评价,模型生态就可能出现自我回音。

Constitutional AI 和 self-training 则把这条路又推进一步:先定义一组原则,让模型根据原则批判和修改自己的回答,再用修正后的样本训练模型。人类逐条标注的成本降下来了,但“价值定义”也更显式地被写进 constitution 或 critique prompt 中。

PPO:原始但麻烦的 RLHF 路线

InstructGPT 采用的是 PPO。它的训练流程大致是:

  1. 从 prompt 分布采样一批输入。
  2. 当前 policy 生成回答。
  3. Reward model 给完整回答打分。
  4. 加上 token-level KL penalty,形成奖励序列。
  5. 用 PPO 更新 policy,同时训练 value model。

PPO 的核心是限制新旧策略的概率比:

𝑟𝑡(𝜃)=𝜋𝜃(𝑎𝑡|𝑠𝑡)𝜋old(𝑎𝑡|𝑠𝑡)

并使用裁剪目标:

𝐿clip(𝜃)=𝔼𝑡[min(𝑟𝑡(𝜃)𝐴𝑡,clip(𝑟𝑡(𝜃),1𝜀,1+𝜀)𝐴𝑡)]

这个目标的用意,是避免 policy 一步走得太远。但在语言模型里,PPO 非常难调:需要 rollout,需要 reward model,需要 reference model,需要 value model,还要处理 KL 系数、优势估计、长度偏置、reward normalization、采样温度等细节。它不是不能工作,而是工程面很重,实验结果也高度依赖配方。

DPO:把偏好优化变成监督学习

DPO(Direct Preference Optimization)问的是另一件事:能不能不用显式 reward model,也不用 on-policy RL?在带 KL 约束的 RLHF 目标下,答案是可以,并且能推导出一个很漂亮的替代形式。

从目标开始:

max𝜋𝔼𝑦𝜋(.|𝑥)[𝑟(𝑥,𝑦)𝛽log𝜋(𝑦|𝑥)𝜋ref(𝑦|𝑥)]

在非参数假设下,最优策略满足:

𝜋(𝑦|𝑥)=1𝑍(𝑥)𝜋ref(𝑦|𝑥)exp(1𝛽𝑟(𝑥,𝑦))

移项后可以得到一个“隐式奖励”:

𝑟(𝑥,𝑦)=𝛽log𝜋(𝑦|𝑥)𝜋ref(𝑦|𝑥)+𝛽log𝑍(𝑥)

对于同一个 prompt 下的两个回答 𝑦𝑤,𝑦𝑙,归一化项 𝑍(𝑥) 会抵消。这样就可以直接用 policy 和 reference policy 的 log-prob ratio 表示偏好差:

𝐿DPO(𝜃)=𝔼(𝑥,𝑦𝑤,𝑦𝑙)𝐷[log𝜎(𝛽log𝜋𝜃(𝑦𝑤|𝑥)𝜋ref(𝑦𝑤|𝑥)𝛽log𝜋𝜃(𝑦𝑙|𝑥)𝜋ref(𝑦𝑙|𝑥))]

直觉上,DPO 对 preferred answer 做正梯度,对 rejected answer 做负梯度,但这个梯度会被 reference model 校准。它不是简单地“只训练好答案”,而是训练模型相对于参考策略更偏向 winner、更远离 loser。

DPO 之所以流行,关键就在这里:它把偏好优化变成了一个 supervised loss,不需要 rollout,也不需要 value model。对开源模型训练来说,DPO 的工程门槛比 PPO 低很多。

DPO 变体:SimPO 与长度归一化

DPO 之后出现了大量变体。这里记两个方向就够用。

SimPO 试图去掉 reference model。它不再显式比较 𝜋𝜃𝜋ref,而是直接通过 chosen / rejected 的 log probability margin 来训练。这减少了一份模型前向计算,工程上更轻,但也少了 reference policy 提供的锚点。

Length-normalized DPO 则关注一个常见问题:长回答的 log probability 天然是更多 token log-prob 的和,长度会影响偏好 loss 的尺度。若不处理,模型可能因为长度差异而学到奇怪的偏好。长度归一化通常会把序列 log-prob 除以 token 数,使目标更接近“平均每 token 的偏好差”,而不是“整段回答总 log-prob 的偏好差”。

DPO 的形式很简洁,但偏好优化绕不开老问题:数据怎么配对,长度偏置怎么处理,reference 约束要不要保留。

过优化与模式坍缩

RLHF 的最大风险之一是 reward overoptimization。奖励模型只是人类偏好的代理,不是真实偏好本身。当 policy 持续优化 reward model,它可能找到奖励模型的漏洞:回答更长、更自信、更像 guideline 中的高分样本,但真实质量不再提升,甚至下降。

可以把这个过程理解为:

true preferencereward model score

优化早期,两者相关性较高,reward 上升通常会带来真实质量提升;再往后,模型开始进入 reward model 的盲区,reward 继续上升,真实偏好却可能下降。这时遇到的就是 overoptimization。

另一个副作用是 mode collapse。经过强偏好优化后,模型不再只是一个校准良好的概率模型,而更像被推向高奖励区域的 policy。它可能变得更确定、更模板化、更少样化。对聊天助手来说,这不一定全是坏事,用户确实希望模型稳定;但优化过头后,模型会失去多样性、创造性和概率校准。

总结

把这一讲收回来,主线其实很清楚:预训练提供能力,后训练提供控制。SFT 让模型学会指令格式和助手行为;midtraining 把指令和工具数据更早混入训练过程,缓解最后阶段硬微调的问题;RLHF / DPO 则把目标从“模仿人写的答案”推向“偏向人更喜欢的答案”。

真正难的部分,几乎都落在数据和代理目标上。SFT 数据会塑造模型风格,偏好数据会继承标注者和 judge 的偏差,奖励模型会被过优化,DPO 也会受到长度和配对构造的影响。后训练不是一个简单的“让模型更听话”的按钮,而是一套围绕行为分布、数据质量、偏好定义和优化约束展开的工程系统。

一个比较实用的判断是:如果只是抽取 base model 已有能力,少量高质量 SFT 可能就够;如果要改变复杂偏好,偏好数据和 DPO / PPO 更合适;如果目标是注入大量新知识,最好不要把希望全部压在 SFT 上,而应考虑检索、工具和训练阶段的数据混合。