跳转至

预训练 vs 微调 vs RLHF

面试高频考点

  • 预训练、微调、RLHF 分别解决什么问题?
  • 为什么不能直接用预训练模型做对话?
  • Instruction Tuning 和传统微调有什么区别?
  • 冷启动 SFT 数据为什么常常比规模更重要?
  • 什么时候只做 SFT 就够,什么时候必须进入偏好对齐?

三个阶段概览

flowchart TD
    A["海量无监督语料"] --> B["预训练<br/>学语言规律 + 世界知识"]
    B --> C["SFT / Instruction Tuning<br/>学会遵循指令并按格式作答"]
    C --> D["偏好对齐<br/>RLHF / DPO / RLAIF"]
    D --> E["部署模型<br/>更有帮助、更安全、更稳定"]

一个更工程化的理解是:

  • 预训练解决"模型有没有基础能力"。
  • SFT解决"模型会不会按人类期望的输入输出协议工作"。
  • 偏好对齐解决"模型在多个可行答案里,会不会选更安全、更有帮助、更符合偏好的那个"。

预训练(Pre-training)

细化理解: 预训练学习的是通用语言建模能力,目标通常是 next-token prediction。它让模型在大量文本、代码和多领域资料中学到统计规律、事实关联和基本推理模式,但输出形式不一定符合用户指令。预训练阶段的数据配比、tokenizer、上下文长度和训练 token 数,会长期影响后续 SFT、RLHF 和部署表现。

目标:在海量文本上学习语言的统计规律和世界知识。

训练任务(Causal LM):给定前缀,预测下一个 Token:

输入:The capital of France is
目标:Paris

数据规模:万亿级 Token(LLaMA 3 使用 15T token)。

学到了什么? - 语法、语义、逻辑推理 - 百科知识、代码、数学 - 但不会"听话",输出格式混乱,可能有害

本质上在学什么? - 学下一个 token 的条件分布 P(x_t | x_<t)。 - 把大量共现模式压缩进参数里,形成可迁移表征。 - 这种训练目标天然擅长"续写",并不天然擅长"完成指令"。

工程侧关心的不只是 loss: - 数据是否足够干净,否则模型会把噪声当模式学进去。 - tokenizer 是否合理,否则中文、代码、公式的 token 效率会很差。 - 训练配比是否合适,否则会出现会聊天但不会代码、会背知识但不会推理的偏科。


为什么预训练模型不能直接用?

预训练的目标是补全文本,不是回答问题。给它一个问题,它可能直接续写更多问题,而不是给出答案。同时它没有拒绝有害请求的能力。

典型表现有三类:

  1. 格式错位:用户要 JSON,模型却输出一大段自然语言。
  2. 角色错位:用户问问题,模型继续模拟论坛帖子、论文段落或对话历史。
  3. 偏好缺失:多个答案都可能成立时,模型不会自动选更安全、更简洁、更有行动性的那个。

所以预训练模型更像一个"基础语言引擎",而不是可直接交付的助手。


SFT(Supervised Fine-Tuning)

细化理解: SFT 主要把基座模型调整成“会按指令回答”的助手模型。它不是简单灌知识,而是学习问题理解、答案组织、拒答边界、格式遵循和多轮对话习惯。SFT 数据质量很关键:同样一万条样本,高质量、多样化、边界清晰的数据,通常比大量模板化数据更有价值。

用人工标注的指令-回答对对预训练模型继续训练,使模型学会: - 理解并遵循指令 - 以对话格式输出 - 保持输出结构化

数据格式示例:

[Instruction] 请总结以下文章:...
[Output] 这篇文章主要讲了...

特点:数据量不需要很大(几万到几十万条),但质量要求高。

SFT 到底在改什么

SFT 不是给模型硬塞知识,而是在重塑下面三件事:

  • 输入协议:什么样的 user/system 指令应该如何理解。
  • 输出协议:答案应该以解释、步骤、代码、表格还是 JSON 的形式给出。
  • 任务分布:让模型高频见到"真实用户最常问的问题类型"。

Instruction Tuning 的关键价值

传统微调常常只优化一个任务,例如情感分类、摘要、NER。Instruction Tuning 则把许多任务统一成"指令 -> 回答"形式,逼模型学会任务迁移,因此它更像是在学习一个通用接口,而不是某个单点技能。

冷启动数据为什么特别重要

很多团队在做对齐时,第一批高质量 SFT 数据决定了模型的上限方向:

  • 回答风格是啰嗦还是精炼
  • 遇到不确定问题时会不会承认不知道
  • 代码题是只给答案还是带解释和边界条件
  • 安全拒答是模板化还是自然化

LIMA 这类工作强调的就是:少量但高质量的数据,也能把预训练模型的能力"拽出来"。


RLHF(Reinforcement Learning from Human Feedback)

SFT 后模型会"听话",但未必输出人类偏好的内容(安全、有帮助、无害)。RLHF 用人类偏好进一步对齐。

三步流程:

  1. 收集偏好数据:对同一 prompt,模型生成多个回复,人工标注哪个更好
  2. 训练奖励模型(RM):学习预测人类的偏好分数
  3. PPO 优化:用 RM 作为奖励信号,用 PPO 算法更新语言模型

KL 散度惩罚:防止模型过度优化 RM(reward hacking),保持与 SFT 模型不偏离太远:

reward = RM(x, y) - β · KL(π_RL || π_SFT)

RLHF 想解决的不是"正确性",而是"偏好排序"

很多问题并没有唯一标准答案,但人类会稳定偏好:

  • 更直接的表达
  • 更完整但不冗余的解释
  • 更安全的拒答
  • 更符合角色设定的语气

RLHF 的核心是把这些偏好转成训练信号,让模型在多个可行输出里选"更像人类会接受的那个"。

DPO 为什么近两年更受欢迎

RLHF 的工程链条很长:采样、标注、训练 RM、跑 PPO、控稳定性。DPO 把问题改写成"给定 chosen/rejected,直接让模型提高 chosen 的相对概率",因此:

  • 实现更简单
  • 训练更稳定
  • 不需要单独训练奖励模型

但这不代表 DPO 永远替代 RLHF。对于复杂在线交互、长时序决策、工具调用反馈,RL 路线依然有空间。


三阶段如何分工

阶段 训练信号 解决的问题 常见瓶颈
预训练 下一个 token 基础能力、知识覆盖、泛化表征 数据质量、算力、收敛效率
SFT 标准答案 指令遵循、输出格式、角色行为 数据质量、任务覆盖、风格一致性
RLHF / DPO 偏好排序或奖励 帮助性、安全性、主观质量 奖励偏差、训练稳定性、标注成本

什么时候只做 SFT,什么时候继续偏好对齐

只做 SFT 就够的场景: - 垂直任务边界清晰,比如 SQL 生成、客服分类、结构化抽取 - 输出是否正确可以用规则或测试集直接判断 - 更在意稳定复现,而不是开放式对话体验

需要偏好对齐的场景: - 通用助手、聊天机器人、开放问答 - 用户对语气、安全、拒答方式很敏感 - 存在多个都"勉强正确"但质量差异很大的回答

很多企业模型实际上停在 SFT 或 SFT + 少量 DPO,就已经足够上线。不是所有系统都需要完整 RLHF。


工程实践视角

一个常见训练流水线

flowchart LR
    A["清洗后的预训练基座"] --> B["SFT 数据构建"]
    B --> C["SFT 训练"]
    C --> D["离线评测<br/>指令遵循/安全/任务集"]
    D --> E["偏好数据收集"]
    E --> F["DPO 或 RLHF"]
    F --> G["红队测试 + 线上灰度"]

实际项目里最容易低估的成本

  • 标注规范制定:同一问题什么叫"更好",需要可执行规则。
  • 数据去重:SFT 与评测集泄漏会让离线分数虚高。
  • 模板迁移:system prompt、chat template、tokenizer 不一致会直接拖垮效果。
  • 多轮数据建模:单轮答得好,不代表多轮跟踪上下文也稳定。

Instruction Tuning vs 传统微调

传统微调 Instruction Tuning
数据 特定任务标注数据 多样化指令-回答对
目标 单任务性能最优 泛化到未见任务
效果 专才 通才

再补一层理解:

  • 传统微调关注单点 KPI,例如某个分类任务准确率。
  • Instruction Tuning关注通用交互能力,是面向"使用方式"而不是单一标签空间。
  • 很多团队会先做 instruction tuning,再做领域 SFT,把通才底座收敛成"可工作的专才助手"。

常见误区

误区 1:SFT 就是在给模型注入新知识

不准确。SFT 更常见的作用是让模型学会如何把已有能力以正确接口释放出来。如果底座根本没学到相关知识,只靠少量 SFT 很难补齐。

误区 2:RLHF 一定提升事实正确率

不一定。RLHF 优化的是偏好,不是客观真值。它可能让回答更像人喜欢的样子,但未必让事实更真。

误区 3:偏好数据越多越好

偏好数据标签噪声通常比 SFT 更大。低一致性标注会把模型往模糊方向推,导致输出风格摇摆。

误区 4:开源基座差一点,靠后训练都能补回来

这是典型高估后训练的说法。基座能力不够,后训练更多是在"整形",不是"重建大脑"。


面试延伸

Q:RLHF 的主要挑战是什么?

  1. 奖励模型不完美,存在 reward hacking 风险;2. PPO 训练不稳定;3. 人工标注成本高、一致性差。

Q:DPO 如何解决 RLHF 的问题?

DPO 将 RLHF 的优化目标重参数化,直接用偏好数据对语言模型做有监督训练,无需单独训练 RM 和运行 PPO。详见 07_RLHF_DPO_PPO.md

Q:为什么说 SFT 是"把基座能力唤醒"而不是"重新训练一个模型"?

因为预训练已经把大量知识和模式压进参数里,SFT 更多是在调整条件分布,让模型在看到 instruction/chat 格式输入时,优先走符合人类任务期望的输出路径。参数更新量相对小,但行为变化会非常明显。

Q:企业里做领域模型,预训练和微调怎么取舍?

如果领域数据规模有限、预算有限,通常优先选强基座做 SFT/DPO;如果领域语料非常独特且与通用互联网差异大,比如金融内参、医疗病历、工业日志,才考虑持续预训练(continued pretraining)或领域自适应预训练,再进入 SFT。

Q:Continued Pretraining 和 SFT 有什么边界?

Continued Pretraining 仍然是语言建模目标,用领域原始语料继续训练,解决的是知识分布迁移;SFT 用的是指令-回答对,解决的是任务接口和行为模式。前者补底座,后者补交互。


学完可以做什么

  1. 用开源基座做一个垂直问答助手,对比 base -> SFT -> DPO 三个版本的回答差异。
  2. 自己构造 200 条高质量 instruction 数据,观察少量高质数据对回答风格的影响。
  3. 做一个"拒答策略"对齐实验,比较模板拒答和自然拒答的用户体验。

原始论文

论文 链接
InstructGPT: Training language models to follow instructions with human feedback (Ouyang et al., 2022) arxiv.org/abs/2203.02155
LIMA: Less Is More for Alignment (Zhou et al., 2023) arxiv.org/abs/2305.11206

延伸阅读与视频

平台 标题 说明
📺 B站 斯坦福CS336第十五课:详解SFT、RLHF 斯坦福课程,从学术角度全面讲解三阶段训练
📺 B站 理解大模型训练的几个阶段:Pretraining、SFT、RLHF 1.4万播放,清晰区分三阶段的定义与边界
📺 B站 20分钟带你快速弄懂SFT、RLHF、DPO 1.2万播放,从定义到适用边界全流程解析
📖 Stanford CS336 Language Modeling from Scratch 系统学习预训练、数据、评估、对齐和推理的课程入口
📖 Hugging Face TRL TRL documentation SFT、DPO、PPO、reward modeling 的开源训练工具链
📖 Hugging Face PEFT PEFT documentation LoRA/QLoRA 等参数高效微调实践入口
📖 OpenRLHF OpenRLHF GitHub RLHF/DPO/PPO 工程实现参考,适合看训练脚本和分布式实现