【LLM技术全景】预训练与微调:大模型如何“学习“

摘要:本文是《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. 数据质量 > 数据数量:1万条高质量数据 > 100万条噪音数据
  2. 降低学习率:通常是预训练的10%-1%
  3. 减少epoch:通常1-3个epoch,过拟合比欠拟合危害更大
  4. 混合预训练数据:保留一定比例的通用语料

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):如何用更少参数实现更强性能

参考资料

  1. Brown et al. "Language Models are Few-Shot Learners" (GPT-3, 2020)
  2. Ouyang et al. "Training language models to follow instructions with human feedback" (InstructGPT, 2022)
  3. Rafailov et al. "Direct Preference Optimization: Your Language Model is Secretly a Reward Model" (DPO, 2023)
  4. Touvron et al. "LLaMA 2: Open Foundation and Fine-Tuned Chat Models" (2023)
  5. Glaese et al. "Improving alignment of dialogue agents via targeted human judgements" (Anthropic, 2022)

延伸讨论

思考题

  1. 为什么预训练损失下降不代表模型质量一定提升?还有什么指标能衡量预训练效果?

  2. RLHF中的"奖励黑客"(Reward Hacking)问题是什么?DPO能否完全解决这个问题?

实践作业

使用Hugging Face的TRL库,用DPO方法在小型模型(如Llama-3-8B)上微调一个简单的对齐模型,对比DPO前后的输出质量差异。


本文是《LLM技术全景:从Token到部署》系列第4篇。

下期预告:《规模定律与模型演进:为什么模型越大越强?》

相关推荐
audyxiao0011 小时前
ICLR 2026论文分享 | WorldGym:用世界模型打造机器人策略评估新范式
大数据·人工智能·大模型·智能体·世界模型
泠不丁1 小时前
用 Obsidian 双链笔记管理智能家居技术知识体系
人工智能
泠不丁1 小时前
智能家居 Zigbee 协议在高并发传感数据时的丢包率实测
人工智能
螺丝钉code1 小时前
JAVA项目 Claude code CLAUDE.md 到底应该怎么写
java·人工智能·claude code
武子康1 小时前
调查研究-163-MiniMax M3 正式发布:1M 上下文、多模态、Coding Agent 与 Sparse Attention 到底意味着什么?
人工智能·openai
Cosolar2 小时前
LlamaIndex 文档解析与分块策略深度解析
人工智能·面试·架构
云器科技2 小时前
湖上原地加速:存量数据平台最低风险的降本增效与AI演进之路
人工智能
向量引擎2 小时前
腾讯混元 API 接入与国内模型统一入口实践:API Key、OpenAI 兼容调用、向量引擎中转配置与企业安全检查
人工智能·gpt·aigc·ai编程·ai写作·agi·api调用
ACP广源盛139246256732 小时前
GSV2221 显示转换芯片@ACP#赋能 RTX Spark 端侧 AI 设备,构建多屏全模态视觉交互新生态
大数据·人工智能·嵌入式硬件·gpt·spark·电脑·音视频