Skip to content

预训练与后训练:打造一个真正有用的 LLM 需要两个阶段

如果你把一个刚完成预训练的 GPT-3 直接拿给用户用,会发生什么?

你问它:"帮我写一封辞职邮件。"

它可能输出:"亲爱的张经理,我写信给您是为了请求辞职,但我不确定我是否真的想要辞职,因为我在公司工作了五年,有了很多朋友,而且我还在考虑是否应该先跟HR谈谈关于我的401k计划,等等等等..."

这不是因为它不聪明——恰恰相反,它太聪明了,聪明到把 Common Crawl 里所有 "辞职邮件" 的各种变体都内化了,但它不知道你是在要求它执行一个任务,而不是让它脑补一个模棱两可的故事开头。

这就是为什么后训练(Post-training)的存在是绝对必要的。预训练赋予了模型知识和语言能力,但把它从 "知识容器" 变成 "有用的助手" 的,是后训练。

第一阶段:预训练——数据工程才是 80% 的工作

外行觉得预训练的工作是 "把数据丢进 GPU 里跑"。内行知道 数据准备的时间和人力成本远超模型训练本身。

数据从哪里来,怎么清理?

以 Common Crawl 为例——这是一个每月爬取整个互联网的非营利数据集,包含数千亿个网页。但它是极端的脏——里面有你无法想象的一切:SEO 垃圾、机器生成文本、色情内容、重复的导航栏、JavaScript 代码片段、俄语、阿拉伯语、中文...

典型的预训练数据 pipeline(以训练 LLaMA 级别的模型为例)要经过至少这些步骤:

1. 语言过滤:用 FastText 做语言分类,扔掉的可能是 40-50% 的非目标语言内容。

2. 去重(Deduplication)——这是预训练中最容易被低估的环节。 互联网的重复内容随处可见——同一篇新闻被几百个网站转载,同一个 StackOverflow 回答出现在无数镜像站。如果不去重,你的模型会在同一段话上学了 500 遍——这不仅是浪费算力,还会让模型记住 "这段话特别重要" 的偏差。

MinHash 是去重的主力算法。原理:把文档切成 n-gram(比如 5-gram),对每个 n-gram 算多个哈希函数取最小值作为签名,两篇文档的 MinHash 相似度近似等于它们共享内容的 Jaccard 相似度。实际工程中你用 128 甚至 256 个哈希函数来降低误判率,阈值设在 0.7-0.85。

这一轮去重能删掉 20-40% 的数据。你以为这就够了?不够。

3. 质量过滤:用一个小型的 n-gram 语言模型(KenLM)给每篇文档打分(perplexity),扔掉分数太差的内容——包括语法混乱、乱码、纯数字或纯符号组成的 "页面"。有些团队还会训练一个轻量级分类器来识别机器生成内容(MGC)和 SEO 垃圾。

4. 启发式规则:扔掉过短(<100 词)、过长(>100k token 可能导致 OOM)、含有大量重复 n-gram(在某个位置反复出现同一句话——典型的爬虫污染)的文档。还有社会安全号码、邮箱、电话号码等 PII 的检测和脱敏。

5. 污染检测(Decontamination):这可能是最 "道德" 的一步——你必须确保评测集(benchmark)的样本没有泄露进训练数据,否则你的模型在 benchmark 上的高分是假的。做法:对评测集中的每个样本,在训练集中查找 n-gram 重叠度超过阈值(比如 10-gram 中 80% 匹配)的文本段,全部移除。

这一步工作量极大——一次预训练的数据 pipeline 动辄耗时几周到几个月,需要一群数据工程师全职投入。

Scaling Law:越大越好,但要 "对等"

Scale 不是万能药——你得吃对剂量。

OpenAI 在 2020 年提出的 Kaplan 公式是大号模型的第一个 Scaling Law:Loss ∝ N^(-0.076)(N = 模型参数量)——参数越大 loss 越低——导致了 "参数军备竞赛"。

但 DeepMind 在 2022 年用 Chinchilla 论文掀了桌子:你们全都练错了。 他们发现,如果把模型参数翻倍但不增加训练数据,loss 的下降远小于理论预期——因为模型 "吃不饱"。最优配置是:模型参数 N 和数据量 D 同时翻倍——保持 D ≈ 20N。 GPT-3 175B 只在 300B token 上训练,按 Chinchilla 定律它应该需要 3.5 万亿 token——差了 10 倍。这就是为什么 Chinchilla 70B 干掉了 Gofer 280B。

直观理解:一个 100B 的模型如果在 100B token 上训练,相当于一个博士生只读了一本薄薄的教科书——他的大脑很强大(参数多),但知识储备很薄(数据少)。一个 70B 模型在 2 万亿 token 上训练,相当于一个硕士生读了一个图书馆——他处理问题的能力也许上限不如那个 "聪明的博士",但他见过的场景多得多,所以在大部分实际问题上表现更好。

选择什么架构:Dense 还是 MoE?

Dense(稠密)模型:每个 token 激活所有参数。简单、可预测、推理稳定。

MoE(Mixture of Experts,混合专家):总参数量很大但每个 token 只激活一部分 "专家"。比如 Mixtral 8×7B——总参数 46.7B,但每个 token 只调用 2 个专家,所以推理时只激活约 12.9B 参数。效果好(更多专家 = 更多专业知识)但显存占用大(所有专家都要加载在 GPU 里)。

OpenAI GPT-4 据传就是 MoE 架构,有 8×220B = 约 1.8T 总参数但只激活约 280B。DeepSeek-V3 是更极端的 MoE:671B 总参数,每个 token 只激活 37B。

实际取舍建议:如果做垂域小模型(<20B),Dense 就够了;如果做通用大模型要打 benchmark 排行榜,MoE 是必选项。

第二阶段:后训练——从 "会输出" 到 "能交付"

SFT 不是 "收集更多数据就能好"

2023 年 5 月的 LIMA 论文(Meta AI)给了整个行业一记响雷:他们用 1750 条 精心挑选的高质量问答数据在 LLaMA 65B 上做 SFT,出来的模型在人类盲评中跟用 5 万条数据训练的 Alpaca 65B 不分伯仲。

这意味着什么?第一,SFT 数据质量 >> 数量。第二,你花几个月筛出的 5 万条 "还行" 数据可能不如一个懂 NLP 的工程师花两天写的 2000 条完美数据。

高质量 SFT 数据的判断标准:

  • 格式一致性:全部统一成 <|system|>...<|user|>...<|assistant|>... 或 OpenAI 的 messages 格式。格式不统一是 SFT 质量的头号杀手
  • 任务多样性:不要全是 QA。要有代码生成、翻译、摘要、改写、分类、创意写作、拒绝回答的示例——每种至少占 5%。单一任务类型会让模型倾向所有任务都用同一种输出模式
  • 边界情况:必须包含 "我不知道"、"请澄清"、"我拒绝回答有害请求"——这些不是浪费数据,它们是教模型 "安全边界" 的关键
  • 回答的干净度:不要有 "As an AI language model..." 这种免责声明——除非你要的就是这个语气。剔除所有格式错误(缺失的引号、不闭合的代码块)

SFT 阶段通常用 1e-6 到 5e-6 的学习率(远低于预训练的 3e-4),训练 2-5 个 epoch。超过这个数,模型开始过拟合 SFT 数据的分布,失去预训练阶段学到的多样性。

对齐:从 RLHF 到 DPO 的技术航线

SFT 之后的模型能力没问题了,但行为不可控。它可能在回答一半后开始胡言乱语,可能被 jailbreak 诱出危险内容,可能编造事实。

RLHF(Ouyang et al., 2022)的目标是让模型学会 "什么是好回答"。它需要:

  1. 人类标注员(或另一个 LLM)A/B test 两个回答,选 "更好" 的那个
  2. 用这些偏好对训练一片 6-13B 的奖励模型(Reward Model)
  3. 用 PPO 强化学习算法优化原始 LLM,让它朝奖励模型给高分的方向走,同时用 KL 散度惩罚不要跑太远

RLHF 的三层耦合极其脆弱:

  • 奖励模型如果不够好(reward hacking——模型发现说 "Absolutely! I'd be delighted to help you with that!" 这种废话总是得分很高),整个训练目标就被污染了
  • PPO 需要同时加载 4 个模型(策略模型、旧策略、参考模型、奖励模型),70B 级别的模型每组需要 8 张 H100——这还没算 batch size 和上下文长度,显存直接爆表
  • PPO 本身的超参数(LR、clip range、KL penalty coefficient)极其敏感,调参是玄学

DPO(Rafailov et al., 2023)的出现改变了游戏规则。 核心公式层面的突破:

L_DPO = -log σ( β[ log(π_θ(y_w|x) / π_ref(y_w|x)) - log(π_θ(y_l|x) / π_ref(y_l|x)) ] )

看起来复杂,直觉非常简单:让 chosen(好的)回答的概率尽量高于 rejected(坏的)回答的概率,同时用参考模型(SFT 前的模型)作为参照,防止过度偏离。 这个目标函数就是二分类交叉熵——没有奖励模型、没有 PPO、没有强化学习。

工程上这意味着:DPO 只比普通 SFT 多维护一个参考模型(可以放 CPU 上做 offload),训练跟普通微调一样稳定——不需要调 reward hacking,不需要担心 PPO 不收敛。实验显示 DPO 在 summary 和 dialogue 任务上跟 RLHF 持平甚至更好。

DPO 也有局限:它假设偏好对来自 Bradley-Terry 模型(独立两两对比),但现实中人类偏好更复杂(涉及多个维度权衡)。还有就是 DPO 不能在 "在线" 环境中持续学习——它是一次性的,不像 PPO 可以在部署后持续收集反馈优化。

成本账:为什么预训练和后训练的投入比例是 100:1

以训练一个 70B 级别的模型为例:

阶段GPU 类型GPU 小时按 $2/hr 成本人力投入
预训练(2T tokens)H100×2048~400,000~$80万5-10人,3-6月数据工程
SFT(10k 条数据)H100×64~500~$10003-5人,1-2月数据标注
DPO(10k 条偏好)H100×64~300~$6003-5人,1-2月偏好标注

预训练的算力成本是后训练的 100-200 倍。但如果只算人力,后训练的标注成本可能很高——10 万美元级别的精标注费在工业界是常态。而一次性百万美元级的数据购买或爬取,在预训练阶段也很常见。

更大的成本在试错:预训练失败一次(比如训练到一半发现数据污染导致 perplexity 异常)的代价是几千 GPU 小时打水漂——相当于几十万美元烧掉。这就是为什么数据验证 pipeline(在 1% 数据上先做试训练)非常重要——先用小规模实验验证数据质量和训练配方,确认无误再全量训练。

预训练和后训练的分工哲学

预训练决定了模型能力的天花板:它能理解多少种语言、掌握什么样的推理模式、存储多少世界知识。这些在后训练阶段几乎无法补充——后训练只能组织、裁剪、格式化已有知识,不能 "无中生有"。

后训练决定了模型的行为模式:它在什么场合该用什么样的语气、什么任务该用什么输出格式、什么情况下该拒绝回答。如果说预训练是 "教会它说话",后训练是 "教会它做人"。

一个没有后训练的预训练模型就像一个才华横溢但没有社交礼仪的天才——他能解决复杂问题,但跟他合作太累了。一个好的 SFT + DPO 组合,能让同一个预训练模型给用户的感受天差地别——这就是两阶段训练的完整图景。

基于 VitePress 构建 | 部署于 Cloudflare Pages