Pre-training/预训练:AI的"通识教育"
这篇文章带你理解大模型的第一课------预训练,明白AI是怎么"读万卷书"的。
前言
你一定听过这些说法:
"GPT-3预训练用了45TB的文本数据" "预训练成本高达1200万美元" "这个模型是预训练好的,可以直接微调"
什么是预训练?为什么AI要先"预训练"才能用?
今天,我们把"预训练"这个黑话翻译成人话。
一、黑话原文 vs 人话翻译
场景模拟
arduino
🎯 AI研究组会议:
研究员A:"我们的模型在预训练阶段收敛了"
研究员B:"用的什么预训练数据?"
研究员C:"Common Crawl加Wikipedia,大概2TB"
研究员A:"预训练loss稳定在2.5左右"
研究员B:"可以开始微调了"
人话翻译表
| 黑话 | 人话翻译 | 一句话理解 |
|---|---|---|
| Pre-training | 预训练 | AI的"通识教育" |
| 预训练数据 | 训练用的文本 | AI读的"书" |
| Loss/损失 | 错误程度 | 考试分数的倒数 |
| 收敛 | 学习稳定了 | 成绩不再波动 |
| Epoch | 轮次 | 把书读几遍 |
| Checkpoint | 检查点 | 学习进度的存档 |
二、预训练是什么?
2.1 一句话定义
Pre-training = 让AI在海量文本上"自学",学会语言的基础知识
人话版:就像让一个学生把整个图书馆的书都读一遍,虽然不是专攻某一科,但什么都懂一点。
2.2 为什么叫"预"训练?
arduino
┌─────────────────────────────────────────────────────────────┐
│ AI训练的两阶段 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 阶段1:预训练 (Pre-training) │
│ ──────────────────────────── │
│ 目标:学会语言的"通用知识" │
│ 内容:互联网上的所有文本 │
│ 类比:读完整个图书馆,成为"通识生" │
│ │
│ 阶段2:微调 (Fine-tuning) │
│ ──────────────────────── │
│ 目标:学会特定任务 │
│ 内容:特定领域的数据 │
│ 类比:参加专业培训,成为"专家" │
│ │
│ 先"预"训练 → 再微调 │
│ 所以叫"预"训练 │
│ │
└─────────────────────────────────────────────────────────────┘
2.3 生活类比
diff
预训练就像:
📚 通识教育
- 小学+中学:学语文、数学、英语...
- 不是为了某个具体工作
- 而是为了"有文化"
🎓 专业培训(微调)
- 大学/职校:学编程、学设计...
- 针对具体职业
- 成为"专业人士"
AI也是一样:
- 先预训练:学会"说话"
- 再微调:学会"好好说话"
三、预训练学什么?
3.1 预训练的目标
sql
┌─────────────────────────────────────────────────────────────┐
│ 预训练的核心任务 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 最常见的预训练任务:语言模型 (Language Modeling) │
│ │
│ 简单说就是:猜下一个字 │
│ │
│ 输入:"今天天气真___" │
│ 预测:"好"(概率最高) │
│ │
│ 通过大量"猜字游戏",AI学会: │
│ ├── 语法规则(怎么说话通顺) │
│ ├── 词汇关系(苹果和水果的关系) │
│ ├── 常识知识(下雨要打伞) │
│ └── 世界知识(北京是中国的首都) │
│ │
└─────────────────────────────────────────────────────────────┘
3.2 预训练数据从哪来?
常见的预训练数据来源:
┌─────────────────────────────────────────────────────────────┐
│ 预训练数据来源 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 🌐 互联网网页 │
│ ├── Common Crawl:网页快照,数千TB │
│ └── 问题:质量参差不齐,需要清洗 │
│ │
│ 📚 知识类网站 │
│ ├── Wikipedia:维基百科 │
│ ├── 百度百科 │
│ └── 优点:质量高,知识丰富 │
│ │
│ 📖 书籍 │
│ ├── 电子书库 │
│ └── 优点:文字质量高 │
│ │
│ 💻 代码 │
│ ├── GitHub 公开代码 │
│ └── 让AI学会编程 │
│ │
│ 📰 新闻、论文 │
│ ├── 专业内容 │
│ └── 获取特定领域知识 │
│ │
└─────────────────────────────────────────────────────────────┘
3.3 数据量有多大?
erlang
GPT-3的预训练数据:
| 数据集 | Token数量 | 占比 |
|-------|----------|------|
| Common Crawl | 410B | 60% |
| WebText2 | 19B | 22% |
| Books | 12B | 8% |
| Wikipedia | 3B | 3% |
| 其他 | 45B | 7% |
| 总计 | ~500B | 100% |
500B Token ≈ 3750亿个汉字
≈ 读37.5万本《红楼梦》
四、预训练的过程
4.1 训练流程
yaml
┌─────────────────────────────────────────────────────────────┐
│ 预训练流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Step 1: 数据准备 │
│ ├── 收集海量文本 │
│ ├── 清洗数据(去重、去噪) │
│ └── Tokenize(转成数字) │
│ │
│ Step 2: 模型初始化 │
│ └── 参数随机初始化 │
│ │
│ Step 3: 训练循环 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ for epoch in epochs: │ │
│ │ for batch in data: │ │
│ │ prediction = model(batch) │ │
│ │ loss = calculate_loss(prediction, target) │ │
│ │ update_parameters(loss) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ Step 4: 保存Checkpoint │
│ └── 定期保存模型参数 │
│ │
└─────────────────────────────────────────────────────────────┘
4.2 Loss是什么?
Loss(损失)= 预测错误程度
┌─────────────────────────────────────────────────────────────┐
│ Loss变化示意 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Loss │
│ │ │
│ 10┤ ● │
│ │ ●● │
│ │ ●●● │
│ │ ●●●● │
│ │ ●●●●● │
│ │ ●●●●●●●───────────── 收敛 │
│ └──────────────────────────────────────→ 训练步数 │
│ │
│ Loss越低 = 预测越准 = 学得越好 │
│ Loss稳定 = 收敛 = 学习完成 │
│ │
└─────────────────────────────────────────────────────────────┘
4.3 预训练有多贵?
┌─────────────────────────────────────────────────────────────┐
│ 预训练成本 │
├─────────────────────────────────────────────────────────────┤
│ │
│ GPT-3 预训练: │
│ ├── 计算量:3640 PFLOP-days │
│ ├── 显卡:约10000张V100 │
│ ├── 时间:约1个月 │
│ ├── 电费:约500万美元 │
│ └── 总成本:约1200万美元 │
│ │
│ GPT-4 预训练: │
│ └── 估计超过1亿美元 │
│ │
│ 这就是为什么: │
│ - 只有大公司能训练大模型 │
│ - 开源模型很珍贵 │
│ - 预训练好的模型很值钱 │
│ │
└─────────────────────────────────────────────────────────────┘
五、预训练 vs 微调
5.1 对比
| 维度 | 预训练 | 微调 |
|---|---|---|
| 数据量 | 海量(TB级) | 少量(GB级) |
| 数据类型 | 通用文本 | 特定任务数据 |
| 计算成本 | 极高 | 中等 |
| 时间 | 数周到数月 | 数小时到数天 |
| 目标 | 学会语言基础 | 学会特定任务 |
5.2 关系图
arduino
┌─────────────────────────────────────────────────────────────┐
│ 预训练 → 微调 → 部署 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 预训练模型 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 读完整个互联网的"通识生" │ │
│ │ 能力:会说人话,有常识 │ │
│ └──────────────────────┬──────────────────────────────┘ │
│ │ │
│ ▼ 微调 │
│ 微调模型 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 经过专业培训的"专家" │ │
│ │ 能力:能做特定任务(对话、代码、翻译...) │ │
│ └──────────────────────┬──────────────────────────────┘ │
│ │ │
│ ▼ 部署 │
│ 应用 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ ChatGPT、Claude等产品 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
六、预训练模型的价值
6.1 为什么预训练模型很值钱?
┌─────────────────────────────────────────────────────────────┐
│ 预训练模型的价值 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 省钱 │
│ 自己预训练:几百万到几亿美元 │
│ 用现成的:免费到几万美元 │
│ │
│ 2. 省时 │
│ 自己预训练:几周到几个月 │
│ 用现成的:立即可用 │
│ │
│ 3. 效果好 │
│ 大公司有更好的数据、算力、技术 │
│ 开源模型效果往往不差 │
│ │
│ 4. 可定制 │
│ 预训练模型 + 自己的数据 → 专属模型 │
│ │
└─────────────────────────────────────────────────────────────┘
6.2 著名的预训练模型
| 模型 | 公司 | 特点 |
|---|---|---|
| BERT | 理解能力强 | |
| GPT系列 | OpenAI | 生成能力强 |
| LLaMA | Meta | 开源,可商用 |
| Qwen | 阿里 | 中文能力强 |
| GLM | 智谱 | 国产开源 |
七、预训练的代码示例
7.1 简化的预训练过程
python
import torch
from torch.utils.data import DataLoader
def pretrain(model, data_loader, optimizer, epochs):
"""
简化的预训练代码
"""
for epoch in range(epochs):
total_loss = 0
for batch in data_loader:
# batch: [batch_size, seq_len]
input_ids = batch[:, :-1] # 输入:去掉最后一个
targets = batch[:, 1:] # 目标:去掉第一个
# 前向传播
outputs = model(input_ids)
logits = outputs.logits
# 计算Loss
loss = torch.nn.functional.cross_entropy(
logits.view(-1, logits.size(-1)),
targets.view(-1)
)
# 反向传播
optimizer.zero_grad()
loss.backward()
optimizer.step()
total_loss += loss.item()
avg_loss = total_loss / len(data_loader)
print(f"Epoch {epoch}: Loss = {avg_loss:.4f}")
# 保存Checkpoint
torch.save(model.state_dict(), f"checkpoint_epoch_{epoch}.pt")
7.2 使用预训练模型
python
from transformers import AutoModelForCausalLM, AutoTokenizer
# 加载预训练模型(省去预训练的时间和成本)
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
# 直接使用
input_text = "今天天气"
input_ids = tokenizer.encode(input_text, return_tensors="pt")
output = model.generate(input_ids, max_length=50)
print(tokenizer.decode(output[0]))
小结
| 黑话 | 人话 | 记忆口诀 |
|---|---|---|
| Pre-training | 预训练 | AI的通识教育 |
| 预训练数据 | 训练文本 | AI读的书 |
| Loss | 损失/错误程度 | 越低越好 |
| 收敛 | 学习稳定 | 成绩不波动 |
| Epoch | 轮次 | 读几遍 |
| Checkpoint | 存档 | 保存进度 |
关键认知:
- 预训练是AI的"通识教育"
- 通过海量数据学会语言基础
- 成本极高,所以预训练模型很值钱
- 预训练后还需要微调才能做特定任务
黑话等级
⭐⭐⭐ 进阶级
├── 理解预训练是什么
├── 知道预训练数据的来源
└── 明白预训练和微调的关系
下一期预告:Fine-tuning/微调 - 给AI上专业课
思考与练习
-
思考题:
- 为什么预训练能学到知识?
- 预训练数据的质量重要还是数量重要?
-
动手练习:
- 下载一个开源预训练模型,试试效果
- 对比不同预训练模型的能力
-
延伸探索:
- 了解预训练数据清洗的方法
- 研究Scaling Law(缩放定律)
下期预告
下一篇文章,我们来聊:Fine-tuning/微调 - 给AI上"专业课"
会解答这些问题:
- 微调是怎么让AI变专业的?
- 全量微调 vs LoRA有什么区别?
- 怎么用自己的数据微调模型?
关注专栏,不错过后续更新!
作者:ECH00O00 本文首发于掘金专栏《AI黑话翻译官》 欢迎评论区交流讨论,点赞收藏就是最大的鼓励