🏠 返回首页 🏠 返回首页

通用大语言模型(LLM)训练全流程详解

以 DeepSeek 式通用对话模型为例

从流程图看懂大语言模型训练

通用大语言模型(如 DeepSeek、GPT、Llama)的训练本质上是同一个循环优化逻辑的海量扩展。流程图中的每个环节——"预测→算错→调参→判断收敛"——在 LLM 训练中被放大到了千亿参数、万亿 token 的尺度上。

本文将以构建一个类似 DeepSeek 的通用对话大模型为例,拆解从"随机婴儿"到"能写诗、写代码、解数学题"的完整蜕变过程。训练分三大阶段:预训练(Pre-training)监督微调(SFT)对齐训练(RLHF/DPO)

建议配合流程图,从上到下、从左到右阅读

1 LLM 训练三大阶段

📚

阶段一:预训练

在海量无标注文本(网页、书籍、论文、代码)上学习语言规律,掌握"世界知识"。

数据量:数万亿 token | 目标:Next Token Prediction
🎯

阶段二:监督微调(SFT)

在高质量"指令-回答"对上进行有监督学习,让模型学会对话和遵循指令。

数据量:数十万~数百万条 | 目标:生成期望回答
⚖️

阶段三:对齐训练

通过 RLHF/DPO 等强化学习技术,让模型输出更符合人类价值观和偏好。

数据量:数万条偏好对 | 目标:人类反馈最大化
通用大语言模型训练流程图 开始训练 随机初始化参数(数十亿~千亿) 输入训练数据(Token 序列) 还有数据? (Batch 循环) 核心训练步骤 Next Token 预测 计算交叉熵损失 反向传播 + 调参 处理完一个 Batch,继续下一个 参数稳定? (收敛/早停) 否,进入下一个 Epoch / 阶段 当前阶段 训练完成 进入下一阶段(SFT → RLHF) 阶段切换控制器 预训练 → SFT → RLHF

贯穿示例:训练类似 DeepSeek 的通用对话大模型

假设我们要从零训练一个拥有 70 亿参数的通用大语言模型(类似 DeepSeek 早期版本的大小)。
它需要能:写诗、写代码、解数学题、进行多轮对话、遵循复杂指令。训练分三个阶段完成。

2 训练步骤详解

1

开始训练:数据与基础设施准备

在训练开始之前,需要准备海量数据和强大的计算集群。这是 LLM 训练中最"烧钱"和"耗时"的环节之一。

预训练语料(数万亿 token)
  • Common Crawl(网页数据,占比最大)
  • Github(开源代码,用于学习编程)
  • 维基百科、书籍(高质量知识)
  • ArXiv 论文(学术知识)
  • 需要去重、过滤、质量评分
计算基础设施
  • 数千张 NVIDIA A100/H100 GPU
  • 高速 InfiniBand / NVLink 互联
  • 分布式训练框架:Megatron-LM / DeepSpeed
  • 数据并行 + 张量并行 + 流水线并行
# 伪代码:训练启动配置(使用 DeepSpeed)
model = TransformerLM(vocab_size=32000, hidden_size=4096, num_layers=32)
# 约 70 亿参数 = 32层 × 4096维 × 多头注意力 + FFN

# DeepSpeed 配置:ZeRO-3 优化,将参数分片到多卡
deepspeed_config = {
    "train_batch_size": 4096,  # 全局 batch size
    "gradient_accumulation_steps": 8,
    "optimizer": {"type": "AdamW", "params": {"lr": 3e-4, "betas": [0.9, 0.95]}},
    "fp16": {"enabled": True},  # 混合精度训练
    "zero_optimization": {"stage": 3}  # 参数分片
}

training_data = load_tokens("pretrain_corpus.bin")  # 数万亿 token
2

随机初始化参数:一张"空白的大脑"

70 亿参数的模型在"出生"时,所有权重矩阵都是小的随机数。此时如果问它"中国的首都是哪里?",它会输出完全随机的乱码。

Transformer 核心参数规模(以 7B 模型为例)
词嵌入矩阵 Wembed: 32000 × 4096 ≈ 1.31 亿
每层 Attention: 4 × (4096 × 4096) ≈ 6710 万
每层 FFN: 2 × (4096 × 11008) ≈ 9017 万
32 层总计: 32 × (6710万 + 9017万) ≈ 50.3 亿
加上嵌入和输出层,总计 ≈ 70 亿参数

初始化策略:使用 Xavier / Kaiming 初始化,让初始输出的方差保持适中。如果初始化太大,训练会发散;太小,则梯度消失。

3

输入训练数据:文本如何变成数字?

模型不认识文字,只认识数字。通过 Tokenizer(分词器),文本被拆分成最小的语义单元——Token,再映射为数字 ID。

Tokenization 示例(SentencePiece/BPE)
原始文本:"中国的首都是北京"
中国 首都 北京
Token IDs: [2156, 12, 4389, 8, 1923] → 输入模型
预训练中的数据组织

预训练不需要"问题-答案"对。直接把海量文本切成 2048 / 4096 token 长度的片段,Batch Size 通常高达 4K~8K(全局)。模型看到 "中国的首都是__",目标就是预测出 "北京"。

核心训练步骤:Next Token Prediction

3a

模型预测:Next Token Prediction(前向传播)

给定前 N 个 token,模型预测第 N+1 个 token 是什么。这是 LLM 预训练的核心任务,也称为"自回归语言建模"。

具体例子
输入序列:中国首都
模型输出(概率分布,取 Top 5):
"北京" → 0.42(最高概率)
"一个" → 0.15
"北京" → 0.12
"中国" → 0.08
"指" → 0.05
真实下一个 token 是 "北京",模型预测概率 0.42(不是最高,需要优化!)
Transformer 前向传播(简化)
1. Embedding: 将 Token ID 转为 4096 维向量
2. Transformer × 32 层: Self-Attention + FFN 逐层计算
3. 输出层: 将最终向量投影到词表空间(32000 维)
4. Softmax: 得到每个词的概率分布
3b

计算错误:交叉熵损失

对于序列中的每一个位置,模型都做了一个预测。将每个位置的预测概率与真实 token 对比,计算平均损失。

序列级交叉熵损失
Loss = - (1/N) Σ log P(xi | x<i)
xi = 第 i 个位置的真实 token
P(xi | x<i) = 模型预测的第 i 个 token 的概率
本例:P("北京" | "中国的首都是") = 0.42
Loss 贡献 = -log(0.42) ≈ 0.868
预测准确时
P = 0.95 → Loss = -log(0.95) ≈ 0.051 ✓
预测错误时
P = 0.02 → Loss = -log(0.02) ≈ 3.912 ✗
3c

调整参数:反向传播 + 优化器

计算 70 亿个参数各自的梯度,然后沿着梯度反方向更新参数。这是整个训练中最消耗算力的环节。

反向传播
从输出层反向逐层计算梯度,使用链式法则传播误差。

对于 7B 模型 + 4K 序列长度:
- 需要存储每一层的中间激活值
- 显存占用可达 数十 GB / GPU
- 使用梯度检查点(Checkpointing)来省显存
优化器:AdamW + 学习率调度
θ = θ - lr × m̂ / (√v̂ + ε)
AdamW 的自适应学习率
学习率预热(Warmup):前 2000 步从 0 线性增加到 3e-4
之后 Cosine 衰减到 3e-5
混合精度训练(FP16/BF16)

用 16 位浮点数存储大部分参数和计算,既节省显存又加速训练。但保留 32 位副本用于关键计算,防止精度不足导致的训练不稳定。

3d

错误变小了吗?

参数更新后,在同一个 Batch 上重新计算损失(或通过梯度保证其下降)。对于大规模 LLM,通常不反复迭代同一个 Batch,而是更新一次后立即进入下一个 Batch。

预训练初期效果示例
Step 1 Loss = 8.5(接近随机猜测,log₂32000 ≈ 15,但由于先验分布,初始约 8~10)
Step 100 Loss = 4.2(开始学到词语搭配)
Step 10K Loss = 2.8(学到语法和简单知识)
Step 100K Loss = 1.9(具备较强语言理解能力)
4

还有数据?(Batch 循环)

LLM 预训练通常处理数万亿 token。以 7B 模型为例,如果全局 Batch Size = 4096,序列长度 = 4096,则每个 Step 处理约 1600 万 token。训练 1 万亿 token 需要约 60 万 Step

预训练进度估算
Step 1K / 600K
刚起步,模型在记忆高频词
Step 100K / 600K
掌握基本语法和世界常识
Step 300K / 600K
能生成流畅段落,理解复杂指令
Step 600K / 600K
预训练完成,具备通用语言能力
注:实际训练中通常以 Step(步)为单位,而非传统意义上的 Epoch。因为数据量太大,通常不会严格"过一遍就停",而是设定固定训练步数。
5

参数稳定了吗?(收敛与阶段切换)

预训练结束后,模型具备了"语言能力",但还不会"好好说话"。需要进入下一阶段。

预训练结束时
验证 Loss ≈ 1.9
能续写文本,但不擅长对话
可能生成有害内容
→ 进入 SFT 阶段
SFT 结束时
能遵循指令回答问题
对话能力显著提升
但仍可能有偏见/不安全
→ 进入 RLHF/DPO
对齐训练结束时
输出安全、有帮助、诚实
拒绝生成有害内容
符合人类价值观
→ 最终模型发布
6

训练完成:一个 DeepSeek 式模型诞生了

经过预训练 → SFT → RLHF 三阶段后,模型从一个输出乱码的"婴儿"成长为一个能写诗、写代码、解数学题、进行深度对话的"智能体"。

模型测试示例
用户:写一个 Python 函数,计算斐波那契数列前 N 项
def fibonacci(n): a, b = 0, 1 result = [] for _ in range(n): result.append(a) a, b = b, a + b return result
用户:解释量子纠缠,用通俗的语言
量子纠缠就像是有一对特殊的骰子,无论把它们分开多远,掷出一个骰子的瞬间,另一个骰子的结果也立刻确定了……
# 保存最终模型
model.save_pretrained("./deepseek-7b-final")
tokenizer.save_pretrained("./deepseek-7b-final")

# 使用模型推理
prompt = "请用一首诗描述秋天的景色:"
inputs = tokenizer(prompt, return_tensors="pt")
outputs = model.generate(**inputs, max_new_tokens=100, temperature=0.7)
print(tokenizer.decode(outputs[0]))
# 输出:秋风起兮白云飞,草木黄落兮雁南归……

3 LLM 三阶段训练对比

维度 预训练(Pre-training) 监督微调(SFT) 对齐训练(RLHF/DPO)
数据类型 无标注文本(网页/代码/书籍) 高质量指令-回答对 偏好对(好回答 vs 差回答)
数据量 数万亿 token 数十万~数百万条 数万条偏好数据
训练目标 Next Token Prediction 生成与标准答案一致的文本 最大化人类偏好概率
损失函数 交叉熵损失 交叉熵损失(带 mask) DPO 损失 / PPO 奖励
计算成本 极高(数百万 GPU 小时) 中等(数千 GPU 小时) 中等(数千 GPU 小时)
模型能力 语言理解 + 世界知识 对话能力 + 指令遵循 安全性 + 有用性 + 诚实性

4 训练过程动态演示

预训练损失(Loss)随训练步数变化 横轴: Step (千步) | 纵轴: Loss
1.0 3.0 5.0 7.0 9.0 0 100K 300K 500K 600K 训练 Loss 验证 Loss SFT 切换点 RLHF 切换点
预训练阶段 (0-200K)
Loss 从 8+ 快速降到 3 以下,模型掌握语法、词汇、基本常识。
SFT 阶段 (200K-450K)
Loss 继续下降但幅度减缓,模型学会对话格式和指令遵循。
RLHF 阶段 (450K-600K)
损失变化较小,但输出质量(人类评分)显著提升,更安全有用。

5 关键概念速查表

概念 含义 LLM 训练中的体现
Token 文本的最小语义单元 "中国的首都是北京" ≈ 5 个 token
Next Token Prediction 预测序列中下一个 token LLM 预训练的核心任务,自回归生成
Cross-Entropy Loss 衡量预测分布与真实分布的差距 每个 token 预测都算一次,取平均
Attention 让模型关注序列中相关的 token "首都"与"北京"建立强关联
SFT 监督微调,用问答对训练 让模型学会对话和遵循指令
RLHF 基于人类反馈的强化学习 用偏好数据让输出更安全有用
DPO 直接偏好优化 RLHF 的简化版,无需奖励模型
混合精度 FP16/BF16 训练 节省显存、加速训练,但保持精度

6 完整流程回顾

1
准备阶段
收集数万亿 token 的网页/代码/书籍数据,搭建数千 GPU 集群,配置 DeepSpeed/Megatron 分布式框架。
2
初始化
70 亿参数随机初始化(Xavier/Kaiming)。此时模型输出完全随机。
3
核心循环(预训练,重复 60 万步)
前向传播:输入 4096 个 token 的文本片段 → 模型预测下一个 token 的概率分布
计算损失:用交叉熵衡量每个位置预测与真实的差距,取平均
反向传播:计算 70 亿参数的梯度(链式法则)
更新参数:AdamW 优化器 + Cosine 学习率调度更新参数
重复:处理下一个 Batch,直到数万亿 token 遍历完毕
4
阶段一完成:预训练模型
模型掌握语言规律和世界知识,但不会对话。进入 SFT 阶段。
5
阶段二:SFT 微调
用数十万条高质量"指令-回答"对继续训练。模型学会对话格式、指令遵循、多轮交互。
6
阶段三:对齐训练(RLHF/DPO)
用数万条人类偏好对训练。模型输出更安全、有用、诚实,拒绝生成有害内容。
7
训练完成
保存最终模型权重,发布一个能写诗、写代码、解数学题、深度对话的通用大模型。

核心要点总结

LLM 训练 = 放大版的梯度下降

流程图中的"预测→算错→调参→收敛"循环在 LLM 中被重复数万亿次。70 亿参数从随机数逐渐演化为能捕捉语言规律的"智能权重"。

三阶段缺一不可

预训练赋予"语言能力",SFT 赋予"对话能力",RLHF/DPO 赋予"安全与价值观"。跳过任何阶段,模型都会"偏科"。

数据质量 > 数据数量

SFT 和 RLHF 阶段的数据量远小于预训练,但对最终体验影响极大。几万多条高质量偏好数据可以改变模型的行为模式。

Scaling Law(缩放定律)

模型性能随参数规模、数据量、计算量的增加而可预测地提升。这是大模型"大力出奇迹"的理论基础。