
摘要:本文是《LLM技术全景:从Token到部署》系列第四篇。大语言模型之所以强大,核心在于"预训练+微调"的两阶段范式。预训练让模型在海量无标注文本中学习语言的一般规律,微调则让模型学会遵循指令、匹配人类偏好。本期将深入解析预训练的技术原理(Next Token Prediction、语料选择、训练动态)、SFT有监督微调的核心技巧,以及RLHF/DPO等对齐技术的工作机制。配图将展示大模型训练的完整pipeline,帮助读者理解从"语言模型"到"助手"的技术跃迁。
一、引言:大模型为何需要"两阶段学习"?
大语言模型的能力来自两个阶段:
┌─────────────────────────────────────────────────────────────┐
│ 第一阶段:预训练(Pre-training) │
│ 在互联网级海量文本上学习"语言规律" │
│ 目标:成为一个强大的"语言通才" │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ 第二阶段:微调(Fine-tuning) │
│ 在高质量标注数据上学习"任务技能"和"人类偏好" │
│ 目标:成为一个"听话、能干、说人话"的助手 │
└─────────────────────────────────────────────────────────────┘
为什么不能直接做微调?
预训练让模型具备:
- 语言理解能力:语法、语义、语用规则
- 世界知识:事实、常识、逻辑推理
- 涌现能力:In-Context Learning、CoT等(仅在足够大的模型中出现)
没有预训练的"通才"基础,微调就像"在沙子上建楼"------模型能学会特定任务,但泛化能力极差。
二、预训练:让模型成为"语言通才"
2.1 预训练的目标:Next Token Prediction
预训练的核心任务是Next Token Prediction(NTP)------给定前文,预测下一个词。
输入:"今天天气真"
输出:"好"(预测下一个最可能的token)
这看起来简单,但模型必须同时掌握:
- 语言流利性(语法正确)
- 语义一致性(逻辑连贯)
- 世界知识(事实准确)
- 推理能力(因果关系)
为什么NTP能学到这么多?
语言本身是世界的隐编码。预测下一个词需要:
- 理解"今天天气真"的意思(语义)
- 知道weather/good的关联(知识)
- 预测"好"比"坏"更可能(逻辑)
这逼迫模型内部发展出对世界的"理解"。
2.2 预训练语料:数据为王
预训练语料的规模和质量直接决定模型能力:
| 语料类型 | 典型数据量 | 作用 |
|---|---|---|
| 网页文本 | 数十TB | 通用语言能力、知识 |
| 书籍 | 数GB | 长程依赖、叙事能力 |
| 代码 | 数GB-数TB | 逻辑推理、程序结构 |
| 对话/社交 | 数GB | 交互能力、指令理解 |
| 学术论文 | 数GB | 专业术语、严谨表达 |
| 合成数据 | 酌量 | 补充稀缺领域 |
主流大模型的训练数据规模:
GPT-3 (2020): ~300B tokens, 45TB原始网页
LLaMA-2 (2023): ~2T tokens, 微调版本用SFT+RLHF数据
GPT-4 (2023): 未知,据说~10-15T tokens
LLaMA-3 (2024): ~15T tokens, 15T tokens
2.3 预训练的两阶段:PT和SFT
实际预训练通常分为两个阶段:
阶段1:Pretraining(PT)
├── 大量高质量文本,常规学习率
├── 目标:学习语言规律和世界知识
└── 产出:Base模型(可做续写,但不会"聊天")
阶段2:Supervised Fine-Tuning(SFT)
├── 高质量对话/指令数据
├── 学习率更低,epoch更少(防止遗忘)
└── 产出:Chat模型(能对话,但可能有偏见/有害输出)
2.4 训练动态:损失下降意味着什么?
预训练损失(困惑度Perplexity)的下降,反映了模型能力的提升:
训练损失曲线:
^
│ ┌───── 知识吸收阶段
PPL │ /
│ /
│ / ← 技能习得阶段
│ /
│ / ← 精细调优阶段
│______________/
└──────────────────────────→ 训练步数(tokens数量)
关键观察:
1. 初期损失快速下降 → 模型快速学习词汇、语法
2. 中期损失缓慢下降 → 模型学习知识、推理
3. 后期损失趋于平稳 → 基础能力已饱和
4. 继续训练可能过拟合 → 需要适时停止
损失越低,模型越强吗?
不一定。损失衡量的是"预测下一个词的准确度",但:
- 低损失 ≠ 回答更有帮助
- 低损失 ≠ 符合人类偏好
- 低损失 ≠ 避免有害输出
这就是为什么需要微调来弥补预训练的不足。
三、SFT:有监督微调
3.1 什么是SFT?
SFT(Supervised Fine-Tuning)是在高质量标注数据上做有监督学习。
SFT数据格式:
┌──────────────────────────────────────────────────────┐
│ Prompt(用户输入) │
│ "请解释什么是大语言模型,用简单的例子说明。" │
├──────────────────────────────────────────────────────┤
│ Response(期望输出) │
│ "大语言模型就像一个阅读了整个互联网的超级学生..." │
└──────────────────────────────────────────────────────┘
训练时:
- 输入 → 模型 → 输出
- 计算输出与期望输出的交叉熵损失
- 反向传播更新参数
3.2 SFT的核心挑战
灾难性遗忘(Catastrophic Forgetting):
过度微调会导致模型遗忘预训练学到的能力:
问题示例:
预训练后:能准确回答"太阳从哪边升起?"
过度SFT后:回答正确,但失去解释"为什么"的推理能力
解决方案:
- 数据质量 > 数据数量:1万条高质量数据 > 100万条噪音数据
- 降低学习率:通常是预训练的10%-1%
- 减少epoch:通常1-3个epoch,过拟合比欠拟合危害更大
- 混合预训练数据:保留一定比例的通用语料
3.3 SFT数据构建
高质量SFT数据通常来自:
1. 人工标注
├── 专家撰写高质量问答对
├── 成本高、速度慢、质量高
└── 通常1000-10000条
2. GPT-4生成
├── 用强模型生成弱模型训练数据
├── 成本低、速度快、需要后处理
└── Self-Instruct等技术
3. 开源数据
├── ShareGPT (ChatGPT对话)
├── Anthropic HH-RLHF (人类偏好数据)
├── 各大模型厂商开源的微调数据集
└── 通常需要清洗和过滤
3.4 SFT的最佳实践
| 技巧 | 说明 |
|---|---|
| 格式一致性 | 训练时和推理时的Prompt格式要一致 |
| 长度控制 | 控制对话长度分布,避免过长响应主导训练 |
| 多样性 | 任务类型、领域、风格要多样化 |
| 安全性 | 过滤有害内容,加入安全示例 |
| 长度相似 | query和response长度比例要合理 |
四、RLHF:让模型学会"人类偏好"
4.1 为什么需要RLHF?
SFT模型的问题:它学会的是"如何回答",但不一定符合"人类偏好"。
SFT的问题示例:
用户:"如何偷东西?"
SFT模型:"盗窃是违法行为,根据《刑法》第264条..."
用户:"我想减肥,吃药可以吗?"
SFT模型:"可以吃XXX减肥药,7天瘦10斤..."(忽略健康风险)
RLHF的核心思想:不仅教会模型"说什么",更教会模型"怎么说得好"。
4.2 RLHF的三步流程
┌────────────────────────────────────────────────────────────────┐
│ RLHF流程 │
│ │
│ Step 1: 训练 Reward Model(奖励模型) │
│ ┌────────────────┐ │
│ │ 人类偏好标注 │ │
│ │ A回答 > B回答 │ → 训练RM区分好/坏回答 │
│ └────────────────┘ │
│ │
│ Step 2: PPO强化学习 │
│ ┌────────────────┐ ┌────────────────┐ ┌────────────┐ │
│ │ SFT模型(Actor)│ → │ 生成回答 │ → │ Reward评分 │ │
│ └────────────────┘ └────────────────┘ └────────────┘ │
│ ↑ │
│ Policy Gradient │
│ (策略梯度更新) │
│ │
│ Step 3: 红色操作(可选) │
│ KL散度约束,防止模型偏离SFT太远 │
└────────────────────────────────────────────────────────────────┘
Step 1:训练 Reward Model
收集人类偏好数据:
标注格式:
给定一个Prompt,标注者对多个候选回答排序:
"如何做一个蛋糕?"
回答A: "先准备面粉、鸡蛋、糖..." ★★★★★
回答B: "蛋糕是一种甜点..." ★★★☆☆
回答C: "去蛋糕店买..." ★★☆☆☆
训练RM预测:P(A > B) > P(B > A) > ...
Step 2:PPO强化学习
用RM反馈来优化语言模型:
PPO算法核心:
1. 用当前策略生成回答
2. RM给回答打分
3. 计算优势函数(Advantage):实际reward - 期望reward
4. 策略更新:鼓励高reward回答,惩罚低reward回答
5. KL约束:限制每次更新幅度,防止模型"跑偏"
Step 3:KL散度约束
KL约束的作用:
新模型回答分布 ≈ SFT模型回答分布 + reward奖励
如果没有KL约束:
模型可能学会"取悦"RM,而不是真实有用
可能产生无意义但RM高分的内容
KL约束 = "你可以更好,但要保持在合理范围内"
4.3 RLHF的挑战与局限
| 挑战 | 说明 | 解决方案 |
|---|---|---|
| 标注成本 | 人类偏好标注耗时耗力 | 奖励模型蒸馏、AI反馈(RLAIF) |
| RM欺骗 | 模型可能"欺骗"RM产生高分但无意义内容 | 增加RM多样性、对抗样本 |
| 过度优化 | 模型过度拟合RM,失去语言多样性 | KL约束、退火策略 |
| 偏见放大 | RM的偏见被强化学习放大 | 偏见检测、多样性约束 |
五、DPO:更简单的对齐方案
5.1 DPO的诞生
RLHF效果虽好,但实现复杂(需要训练RM + PPO + 多个超参数)。
2023年,Stanford提出DPO(Direct Preference Optimization),用更简单的方式实现类似效果。
5.2 DPO的核心思想
RLHF:训练RM → 用RM做PPO强化学习
DPO:直接用偏好数据优化策略,跳过RM和PPO
DPO损失函数:
L_DPO = - E_{(x, y_w, y_l) ~ D}[
log σ(
β * log π(y_w|x) / π_ref(y_w|x)
- β * log π(y_l|x) / π_ref(y_l|x)
)
]
其中:
- y_w: 被偏好的回答(winning)
- y_l: 被拒绝的回答(losing)
- π: 当前模型
- π_ref: SFT参考模型
- β: KL惩罚系数
- σ: sigmoid函数
直观理解:
DPO的目标:
- 增大 P(偏好回答) / P(参考模型)
- 减小 P(拒绝回答) / P(参考模型)
等价于:让模型更倾向于回答"偏好答案",同时不偏离参考模型太远
5.3 DPO vs RLHF
| 方面 | DPO | RLHF |
|---|---|---|
| 实现复杂度 | 低(无需RM+PPO) | 高(多阶段训练) |
| 计算资源 | 少(只需2个模型) | 多(需要RM+Actor+Critic) |
| 训练稳定性 | 较高(无需强化学习) | 较低(PPO敏感) |
| 效果 | 相当或略差 | 最优 |
| 适用场景 | 资源有限、追求简单 | 追求最优效果 |
5.4 DPO的变体
| 方法 | 改进点 |
|---|---|
| IPO | 更好的数学性质,避免over-consumption |
| KTO | Kahneman-Tversky优化,人类行为对齐 |
| R-DPO | 引入正则化,提高训练稳定性 |
六、实战:训练一个Chat模型
6.1 数据准备
python
# SFT数据格式示例
sft_data = [
{
"messages": [
{"role": "system", "content": "你是一个有帮助的AI助手。"},
{"role": "user", "content": "什么是大语言模型?"},
{"role": "assistant", "content": "大语言模型(LLM)是一种..."}
]
},
# ... 更多数据
]
# 偏好数据格式(DPO)
dpo_data = [
{
"prompt": "什么是大语言模型?",
"chosen": "大语言模型是...",
"rejected": "LLM是很厉害的技术。"
},
# ... 更多数据
]
6.2 SFT训练代码(使用Hugging Face Trainer)
python
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
from datasets import load_dataset
# 加载模型
model_name = "meta-llama/Llama-3-7b"
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 加载数据
dataset = load_dataset("json", data_files="sft_data.json")
# Tokenize
def tokenize(example):
# 拼接messages为单一文本
text = tokenizer.apply_chat_template(example["messages"], tokenize=False)
return tokenizer(text, truncation=True, max_length=2048)
dataset = dataset.map(tokenize)
# 训练参数
training_args = TrainingArguments(
output_dir="./output",
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
learning_rate=2e-5, # SFT通常用较小学习率
num_train_epochs=3,
warmup_ratio=0.03,
lr_scheduler_type="cosine",
logging_steps=10,
save_strategy="epoch",
)
# Trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset["train"],
tokenizer=tokenizer,
)
trainer.train()
6.3 DPO训练代码
python
from trl import DPOTrainer
from transformers import AutoModelForCausalLM, AutoTokenizer
# 加载模型
model = AutoModelForCausalLM.from_pretrained("sft_model_path")
ref_model = AutoModelForCausalLM.from_pretrained("sft_model_path")
# DPO训练器
dpo_trainer = DPOTrainer(
model=model,
ref_model=ref_model,
beta=0.1, # KL惩罚系数
train_dataset=dpo_dataset,
)
dpo_trainer.train()
七、总结与展望
7.1 核心要点回顾
预训练(SFT之前):
- 目标:学习语言规律和世界知识
- 方法:Next Token Prediction
- 关键:数据规模、数据质量、训练稳定性
SFT(有监督微调):
- 目标:教会模型遵循指令
- 方法:行为克隆(模仿人类标注的问答)
- 关键:数据质量 > 数量,防止灾难性遗忘
RLHF/DPO(对齐):
- 目标:让模型符合人类偏好
- 方法:强化学习(RLHF)或直接优化(DPO)
- 关键:偏好数据质量,平衡有用性和安全性
7.2 技术演进趋势
2020-2022: SFT主导
GPT-3 → SFT → InstructGPT
简单有效,但依赖人工标注
2022-2023: RLHF崛起
InstructGPT + PPO → ChatGPT
效果好,但实现复杂
2023-2024: DPO等简化方案
LLaMA-2 + DPO → 主流选择
简化流程,降低对齐成本
2024-2026: RLAIF与混合对齐
AI反馈替代人类反馈
多目标对齐(有用性 + 安全性 + 诚实性)
7.3 下期预告
下一篇文章我们将深入探讨:
- Scaling Law:模型规模与性能的关系
- 主流开源模型演进:LLaMA、ChatGLM、Qwen的技术对比
- 混合专家模型(MoE):如何用更少参数实现更强性能
参考资料
- Brown et al. "Language Models are Few-Shot Learners" (GPT-3, 2020)
- Ouyang et al. "Training language models to follow instructions with human feedback" (InstructGPT, 2022)
- Rafailov et al. "Direct Preference Optimization: Your Language Model is Secretly a Reward Model" (DPO, 2023)
- Touvron et al. "LLaMA 2: Open Foundation and Fine-Tuned Chat Models" (2023)
- Glaese et al. "Improving alignment of dialogue agents via targeted human judgements" (Anthropic, 2022)
延伸讨论
思考题:
-
为什么预训练损失下降不代表模型质量一定提升?还有什么指标能衡量预训练效果?
-
RLHF中的"奖励黑客"(Reward Hacking)问题是什么?DPO能否完全解决这个问题?
实践作业:
使用Hugging Face的TRL库,用DPO方法在小型模型(如Llama-3-8B)上微调一个简单的对齐模型,对比DPO前后的输出质量差异。
本文是《LLM技术全景:从Token到部署》系列第4篇。
下期预告:《规模定律与模型演进:为什么模型越大越强?》