↓ Skip to main content
  1. Posts/

从 Pre-training 到 Post-training:为什么大模型需要分阶段训练?

·4616 words·10 mins
Note: This article is available in Chinese only. 本文暂无英文版本。 View original

起因
#

最近继续跟 MIT 6.S191,加上工作中或多或少接触到一些 LLM 训练相关的讨论,我开始试着把大模型的训练流程从头到尾理一遍。

之前写过几篇笔记:NTP 那篇推导了 next-token prediction 的条件概率和 cross entropy loss,训练信号来源那篇整理了 self-supervised pretraining → representation → fine-tuning 的基本链路。

理到这里,我以为自己对 LLM 训练的大图景已经差不多了。但很快碰到两个说不太清楚的问题。

第一个问题:我过去做 CV 的时候,训练分两步——先在大数据集上 Pre-training,再在目标任务上 Fine-tuning。现在 LLM 领域冒出来一堆新词:SFT(Supervised Fine-Tuning)、RLHF、DPO、Post-training。Post-training 是不是就是过去 Fine-tuning 换了个名字?

第二个问题更让我纠结。Pre-training 用的是 next-token prediction,SFT 也通常用 token-level cross entropy。两者的 loss 函数在数学上可以写成一样的形式。那为什么还要把它们分成不同的训练阶段?

这篇笔记就是我试着把这两个问题想清楚的过程。

Pre-training 和 Fine-tuning,以前是一件很清楚的事
#

先回到我熟悉的地方。

2018 年做 CV 的时候,训练范式几乎是固定的。拿一个在 ImageNet 上 pre-trained 好的 ResNet,把最后的分类头换成目标任务需要的输出维度,然后在自己的数据集上继续训练。目标数据可能只有几千张图,但因为 backbone 已经学会了通用的视觉特征(边缘、纹理、形状),所以不需要从随机参数开始学。

这个范式很直觉:

  • Pre-training 在大规模数据上学通用表示。
  • Fine-tuning 在小规模目标数据上适配具体任务。
  • 两者的分工清楚,概念上没有任何模糊地带。

那 LLM 的训练流程呢?

把两种范式放在一起看:

传统 DL 与 LLM 训练流程对照

右边比左边多了好几步。我最初的猜测是:这本质上还是 Pre-training + Fine-tuning,只不过今天大模型的规模更大,Fine-tuning 那一步被拆得更细了——SFT 是一种 fine-tuning,RLHF 也是一种 fine-tuning,统称叫 Post-training。

这个直觉对了一半。但后来发现,如果只停留在这个理解,有些东西解释不了。

LLM Pre-training 在学什么
#

先看 Pre-training 这一步到底做了什么。

LLM 的 Pre-training 使用自回归语言建模:给定前面的 token,预测下一个 token。NTP 那篇已经推过这个训练目标的数学形式,这里只用结论:

$$ \mathcal{L} = -\sum_t \log P_\theta(x_t \mid x_{\lt t}) $$

训练数据是海量的互联网文本——书籍、网页、代码、论文。没有人工标注,每个 token 位置天然提供一个训练目标。这就是 self-supervised learning 能 scale 的原因。

“预测下一个 token"听起来简单,但不同的 context 对预测能力的要求差异很大。要补全 “The capital of France is …",模型需要事实知识。要补全一段 Python 函数体,模型需要理解代码结构。为了在各种 context 下都降低 prediction loss,模型被迫去捕获语言中广泛存在的统计规律——远不只是语法。

Pre-training 结束后得到的模型叫 Base Model(基座模型)。

这里有一个容易形成的错误印象:Base Model 没有知识,得靠后续训练才能把知识灌进去。实际情况反过来——Base Model 在 pre-training 阶段已经从海量文本中学到了大量知识,它能补全事实、续写代码、甚至在一些推理任务上表现不错。

但 Base Model 有一个关键的行为特点:它是一个文本补全器,不是一个指令执行器。

给 Base Model 输入 “What is 1+1?",它可能会继续补全成 “What is 1+2? What is 2+3?"——因为在训练语料里,这种列举式的文本可能比"直接回答问题"更常见。它不一定会把用户的输入当作一个需要遵循的指令。

同一个 Loss,为什么还要分开训练
#

这是让我想了最久的地方。

SFT(Supervised Fine-Tuning)的训练数据通常是指令—回答对:

1User: What is 1+1?
2Assistant: 2

训练时,模型看到完整的对话文本,用 teacher forcing 预测每个 token,计算 cross entropy loss。

等一下——这和 Pre-training 有什么区别?Pre-training 不也是看一段文本,预测下一个 token,算 cross entropy 吗?

如果 Pre-training 的语料里恰好也有大量问答对(互联网上当然有),那这两种训练方式的数学形式岂不是完全一样?

后来我发现,区别主要在三个层面。

第一,数据分布不同。

Pre-training 的语料是互联网规模的杂食性文本:百科、新闻、小说、论文、代码、论坛帖子。其中可能包含问答对,但问答只是无数文本形式中的一种。

SFT 的数据是专门组织的指令—回答集合。每一条数据都遵循"用户提出请求,模型给出高质量回答"的格式。翻译、代码生成、数学问答、JSON 格式输出——这些任务都被组织成统一的指令—回答形式。

同一个 cross entropy loss,但喂给它的数据分布完全不同。

第二,Loss Mask 的常见实践不同。

Pre-training 通常对整段文本的所有 token 位置计算 loss。

SFT 有一个常见的做法叫 response-only masking:只对模型需要生成的回答部分计算 loss,用户的输入部分不参与 loss 计算。

用同一段文本来看:

Pre-training 与 SFT 的 Loss Mask 对比

需要注意,response-only masking 是 SFT 的常见实践,不是它的硬性定义。有些 SFT 实现也会在全部 token 上计算 loss。但即使 loss mask 完全相同,只要数据分布与训练目标不同,模型学到的行为仍然会不同。

第三,期望的模型行为不同。

Pre-training 的目标是:让模型学会对自然语言文本建模,尽可能降低预测 loss。它不在意模型是否"遵循指令”。

SFT 的目标是:让模型在看到用户指令后,学会生成符合期望的回答。它期望模型把用户输入当作需要遵循的请求,而不是当作可以继续补全的文本。

回到最初的问题。Pre-training 语料里有问答数据,为什么模型还是不能直接当助手用?

因为 Pre-training 的数据中,问答只是众多文本模式里的一种。模型学到了"在某些 context 下,文本的延续是一个答案”,但它同样学到了"在很多 context 下,文本的延续是更多问题、或者相关话题的讨论、或者广告、或者别的什么”。Pre-training 没有给模型一个明确的信号,说"用户输入的那段文本是一个你必须回应的指令”。

SFT 做的就是这件事。它用经过组织的指令—回答数据,让模型在统计上形成一个倾向:看到指令格式的输入之后,生成直接回答而不是继续补全或跑题。

训练阶段的区别,不是优化算法的区别。即使 Loss 函数的数学形式相同,训练数据的分布、监督信号的覆盖范围、以及我们期望模型学到的行为目标不同,模型就会学到不同的东西。

Post-training 不只是 SFT
#

想通了 Pre-training 和 SFT 的关系之后,回到第一个问题:Post-training 是不是就是 Fine-tuning 的新叫法?

不完全是。

Fine-tuning 是一种操作——从已有模型参数继续训练。Post-training 是一个阶段——Pre-training 之后、模型交付使用之前的所有训练工作。它可能包含多种不同的方法。

一条典型的训练流水线大致是:

Pre-training → Base Model → SFT → Preference Optimization / RL → Assistant Model

SFT 解决的是"让模型学会遵循指令"。但光遵循指令还不够——模型可能会生成格式正确但内容有害的回答,或者在两个回答之间选了人类觉得更差的那个。

RLHF(Reinforcement Learning from Human Feedback)是 InstructGPT(Ouyang et al., 2022)提出的方法。核心思路是:让人类标注员对模型生成的多个回答排序,用这些偏好数据训练一个 Reward Model(奖励模型),然后用 PPO 等强化学习算法根据 Reward Model 的信号继续优化模型。之前写 RL 的那篇讲过 reward 和 policy 的基本概念,RLHF 可以理解为把 reward 信号的来源换成了人类偏好。

DPO(Direct Preference Optimization,Rafailov et al., 2023)是另一条路线。它直接利用偏好数据优化模型策略,不需要显式训练一个 Reward Model 再跑 PPO。论文标题说得很直白:“Your Language Model is Secretly a Reward Model”——语言模型本身的对数概率就可以隐式地充当奖励函数。

Reasoning RL 是更近的方向。DeepSeek-R1(2025)用基于规则的可验证奖励(比如数学题答案是否正确、代码是否通过测试)来强化模型的推理能力。值得注意的是,DeepSeek-R1-Zero 甚至绕过了 SFT,直接在 Base Model 上进行强化学习,模型就自发地出现了较长的推理链。这个结果说明 Pre-training → SFT → RLHF 并不是一条所有模型都必须走的固定管线——某些阶段在特定条件下可以被跳过或替代。

Post-training 的不同方法

所以 Post-training 不只是"让模型更会聊天"。它可能进一步增强推理、代码生成、工具使用等实际任务能力。LIMA(Zhou et al., 2023)的实验甚至表明,1000 条高质量 SFT 数据就能显著改善模型的指令遵循行为,这暗示 Pre-training 已经学到了大量能力,SFT 更多是在"激活"而不是"注入"。

为什么需要不同的基础设施
#

从做 ML Infra 的视角看,Pre-training 和 Post-training 对系统的要求差异很大,这也是为什么它们逐渐发展成不同的研发方向。

维度Pre-trainingPost-training
典型数据海量通用语料(TB 级)指令对、偏好数据、rollout
优化方式语言模型预训练SFT、偏好优化、RL 等
核心系统挑战大规模分布式训练、吞吐训练 + 部分方法需要在线生成
关注指标loss、吞吐、训练稳定性任务效果、奖励、rollout 效率

需要区分的是:SFT 和 DPO 通常不需要在线 rollout,它们的训练过程和传统 fine-tuning 在系统层面差别不大。但基于在线采样的 RL(如 PPO、GRPO)需要模型在训练过程中不断生成回答、计算奖励、再更新参数——这引入了推理和训练的混合工作负载,对调度和资源管理提出了不同的要求。

这不是说 Pre-training 团队和 Post-training 团队之间有什么本质的技术壁垒。分工更多是实际工程组织的结果:不同阶段的数据管线、优化目标和系统瓶颈不同,由不同的团队专注各自领域通常更高效。

写在最后
#

回到开头的两个问题。

Post-training 是不是 Fine-tuning 的新名字?不完全是。Fine-tuning 是一种操作(从已有参数继续训练),SFT 是 Fine-tuning 的一种具体形式,而 Post-training 描述的是一个可能包含 SFT、偏好优化和 RL 等多种方法的训练阶段。

Pre-training 和 SFT 都用 cross entropy loss,为什么要分开?因为 loss 函数只是训练过程的一部分。数据分布、loss mask、期望行为不同,模型就会学到不同的东西。

整理这些概念时,我还想到了一个反面例子。Continued Pre-training(继续预训练)是在已有模型上继续做语言建模训练——比如 Code Llama 用大量代码语料在 Llama 2 基础上继续预训练。操作上它也是从已有参数继续训练,和 Fine-tuning 很像。但它的训练目标仍然是通用的 next-token prediction,而不是指令遵循,所以通常被归入 Pre-training 体系。

这说明,Pre-training / Fine-tuning / SFT / Post-training 这些概念,不能简单按"是否从随机参数开始训练"来区分。

如果让我用一句话总结这篇笔记想说的事情:

「训练目标」不只是一个 Loss 函数的数学表达式,还包含训练数据的分布、监督信号的设计,以及我们希望模型学到的行为。

阶段的划分不是算法层面的硬边界。假设 Pre-training 和 SFT 用完全相同的数据、完全相同的 loss mask、完全相同的优化器,从同一组参数开始,那这一步参数更新从数学上看没有区别——不会因为它被叫做"SFT"就自动切换到另一种学习机制。但在实践中,不同阶段使用的数据分布、监督信号和期望行为确实有系统性的差异,这些差异足够大,值得给它们取不同的名字,也值得用不同的基础设施去支撑。

参考资料
#

Related

模型为什么这样预测?从 Permutation Importance 到 SHAP,重新理解神经网络可解释性

起因 # 之前在量化团队做 ML Infra 相关工作时,我曾参与过期货预测模型的特征重要度评估与特征筛选系统。 在那套系统里,Permutation Importance(置换重要度)是最核心的算子之一。当时我们面临的工作负载非常庞大:针对上千维的输入特征,要在多个交易日的数据上反复进行特征随机置换、模型前向推理以及评价指标的计算。在很长一段时间里,我的注意力几乎完全被系统层面的工程瓶颈吸引——如何降低内存拷贝、如何把推理批次打满、如何避免在不同特征扰动之间重复扫描数据。计算耗时被压下来之后,整套流水线跑得很顺,我也就习惯性地把这套指标当作特征评价的标准答案。