大模型训练全流程拆解:7个阶段+12个关键参数,新手也能看懂
大模型训练全流程拆解:7个阶段+12个关键参数,新手也能看懂
副标题: 从0到1构建大模型的完整路径,附实战避坑指南
一、痛点:为什么大模型训练这么复杂?
很多开发者第一次接触大模型训练时,会被各种术语绕晕:预训练、SFT、RLHF、DPO、LoRA… 感觉像在看天书。
更糟糕的是,很多教程只讲怎么做,不讲为什么这么做。结果就是:照着做能跑通,但出了bug完全不知道问题在哪。
我见过一个团队,花了3个月训练一个7B模型,结果上线后发现准确率只有35%,幻觉率高达40%。他们以为是模型架构问题,后来才发现是数据清洗没做好——训练数据里有大量PDF解析错误的文本。
其实核心就一句话:大模型不是写规则写出来的,而是通过预测下一个token把海量文本规律压进参数,推理时根据当前上下文逐token生成。
这个框架理解后,所有概念都顺了。
二、训练全流程:7个阶段完整拆解
2.1 阶段1:数据收集与清洗
核心问题:数据质量决定模型上限。
很多团队认为数据越多越好,这是误区。脏数据会把模型带歪。
数据来源与配比建议:
| 数据类型 | 来源 | 占比建议 | 质量要求 |
|---|---|---|---|
| 通用文本 | 维基百科、新闻、书籍 | 40% | 高 |
| 代码数据 | GitHub、StackOverflow | 20% | 高 |
| 对话数据 | 客服记录、论坛讨论 | 15% | 中 |
| 专业领域 | 学术论文、技术文档 | 15% | 高 |
| 多语言数据 | 其他语种语料 | 10% | 中 |
清洗流程:
第一步,去重:移除重复内容,避免模型过拟合重复模式。
第二步,质量打分:用规则或模型对文本质量打分,过滤低质量文本。
第三步,敏感过滤:移除隐私、暴力、色情内容。
第四步,格式统一:标准化文本格式,统一编码。
真实案例:某团队用10TB数据训练,结果模型经常输出乱码。后来发现数据中有大量PDF解析错误的文本,清洗后只用1TB高质量数据,效果反而更好。
数据质量对比:
| 数据规模 | 清洗前准确率 | 清洗后准确率 | 提升 |
|---|---|---|---|
| 10TB | 25% | - | - |
| 1TB(清洗后) | - | 65% | +40% |
2.2 阶段2:Token化
核心问题:模型看到的是数字序列,不是文字。
模型不是在字符层面理解文本,而是在token序列上学习。
# Token化示例text="我喜欢编程"tokens=tokenizer(text)# 输出: ["我", "喜欢", "编程"]token_ids=tokenizer.convert_tokens_to_ids(tokens)# 输出: [1024, 5678, 9012]关键参数:
| 参数 | 说明 | 推荐值 | 影响 |
|---|---|---|---|
| vocab_size | 词汇表大小 | 32000-100000 | 越大越细粒度 |
| tokenizer_type | 分词方式 | BPE/WordPiece/Unigram | 影响压缩率 |
| max_length | 最大序列长度 | 2048-4096 | 影响上下文窗口 |
中文vs英文差异:
| 维度 | 英文 | 中文 |
|---|---|---|
| Token粒度 | 子词/单词 | 字/词 |
| 词汇表大小 | 30K-50K | 50K-100K |
| 压缩率 | 较高 | 较低 |
| 典型token数 | 文本长度×1.3 | 文本长度×1.0 |
代码示例:
fromtransformersimportAutoTokenizer# 加载分词器tokenizer=AutoTokenizer.from_pretrained("chatglm3-6b")# 编码input_ids=tokenizer.encode("你好,世界")print(input_ids)# [151331, 151336, 30960]# 解码text=tokenizer.decode(input_ids)print(text)# "你好,世界"2.3 阶段3:预训练
核心问题:把语言规律压进参数。
预训练是核心阶段,模型通过预测下一个token来学习语言规律。
输入一段token → 预测下一个token ↓ 猜错 → 算loss → 反向传播 → 更新参数 ↓ 重复无数次,海量token上训练损失函数:
importtorchimporttorch.nnasnn# 交叉熵损失criterion=nn.CrossEntropyLoss()# 预测下一个tokenpredictions=model(input_ids)# [batch, seq_len, vocab_size]targets=input_ids[:,1:]# 下一个token# 计算lossloss=criterion(predictions[:,:-1,:].flatten(0,1),targets.flatten())关键参数:
| 参数 | 说明 | 推荐值 | 调整策略 |
|---|---|---|---|
| learning_rate | 学习率 | 1e-4 ~ 5e-5 | 大模型用小lr |
| batch_size | 批次大小 | 256-1024 | 显存允许尽量大 |
| epochs | 训练轮数 | 1-3 | 通常1轮足够 |
| warmup_steps | 预热步数 | 总步数的10% | 防止初期震荡 |
| weight_decay | 权重衰减 | 0.01 | 防止过拟合 |
| gradient_accumulation | 梯度累积 |
