1. 大模型训练的三阶段进化论
第一次接触大模型训练时,我被各种术语搞得晕头转向。直到把整个流程拆解成预训练、SFT和RLHF三个阶段,才真正理解了现代大模型的成长路径。这就像培养一个天才儿童:先进行基础教育(预训练),再请专业导师辅导(SFT),最后通过实践考核强化能力(RLHF)。
预训练阶段相当于让模型"博览群书"。以GPT-3为例,它消化了45TB的文本数据,相当于阅读了整个图书馆的藏书。这个阶段的核心目标是建立语言建模能力——给定上文预测下一个词。模型参数在此时会经历剧烈变化,学习率通常设置在6e-5左右,采用余弦退火(cosine decay)策略逐步降低。
关键认知:预训练不是简单的数据灌输,而是让模型构建对世界的认知框架。就像人类幼童通过观察学习语言规则一样,模型在此阶段形成了对语法、常识和基础推理的"本能"理解。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 预训练:构建模型的"世界观"
2.1 数据工程的魔鬼细节
预训练的数据准备远比想象中复杂。优质数据需要经过:
- 去重(避免重复记忆)
- 质量过滤(移除低质内容)
- 领域平衡(确保知识覆盖全面)
- 安全清洗(去除有害内容)
实际操作中,我常用CCNet这样的开源工具进行数据预处理。一个典型陷阱是过度清洗——曾有个项目因过滤太严格,导致模型失去了理解网络用语的能力。建议保留5%-10%的非规范文本(如论坛讨论),这对模型的适应性至关重要。
2.2 训练策略的平衡艺术
预训练最关键的三个超参数:
- 学习率:6e-5是常见起点,但要根据模型规模调整。7B参数以下可用较高学习率(1e-4),超过175B可能需要降至3e-5
- 批量大小:受限于显存,通常采用梯度累积。例如单卡batch=4时,累积32步等效batch=128
- 上下文长度:2048是baseline,但最新模型已支持32k+。注意更长的ctx需要更小的学习率
python复制# 典型AdamW优化器配置
optimizer = AdamW(
model.parameters(),
lr=6e-5,
betas=(0.9, 0.95),
weight_decay=0.01
)
scheduler = CosineAnnealingLR(optimizer, T_max=training_steps)
2.3 硬件配置实战建议
训练百亿参数模型时,这些经验能帮你省下数万元成本:
- 使用BF16混合精度(比FP16更稳定)
- 激活检查点(activation checkpointing)可减少30%显存占用
- 管道并行(pipeline parallelism)在8卡以上集群效果显著
- 监控GPU-Util保持在85%以上才算有效训练
3. 监督微调(SFT):从通才到专家
3.1 微调的本质与陷阱
SFT阶段就像给通才博士生做专项培训。常见误区是直接用预训练的学习率——这会导致"灾难性遗忘"。有次我将学习率设为1e-4,结果模型完全忘记了基础数学运算,只会机械复述微调数据中的对话。
经过多次实验,我总结出SFT的黄金法则:
- 学习率应为预训练的1/10(如6e-6)
- 训练epoch控制在1-3轮
- 使用LoRA等参数高效方法时,rank=8通常足够
3.2 高质量SFT数据制作
优质指令数据的特征:
- 多样性:覆盖不同场景、表达方式
- 明确性:指令与预期输出严格对应
- 合理性:任务难度与模型能力匹配
我常用的数据增强技巧:
- 指令改写(同义替换、句式变化)
- 输出多样化(对同一问题生成多个合理回答)
- 负样本注入(故意包含错误响应供模型对比)
json复制// 优质SFT数据示例
{
"instruction": "用比喻解释神经网络",
"input": "",
"output": "就像邮局的分拣系统...",
"bad_output": "神经网络有输入层、隐藏层..." // 用于对比学习
}
3.3 LoRA实战配置
当显存不足时,LoRA是救命稻草。这是我在7B模型上的典型配置:
python复制peft_config = LoraConfig(
r=8, # 秩
lora_alpha=32, # 缩放系数
target_modules=["q_proj", "v_proj"], # 仅作用于注意力层
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
model = get_peft_model(model, peft_config)
重要发现:只在query和value层加LoRA效果最好,key层引入适配器反而会降低性能。这可能与注意力机制的特性有关。
4. RLHF:让模型学会"人情世故"
4.1 奖励模型训练实战
奖励模型(RM)的质量决定RLHF成败。我构建RM数据集时坚持:
- 对比样本差异明显(好回答vs一般回答,而非好vs完美)
- 至少3万组对比数据
- 包含边缘案例(如敏感问题、模糊指令)
训练技巧:
- 使用ELEUTHERAI/lm-evaluation-harness评估RM
- 早停(early stopping)很关键,验证loss上升立即停止
- 最终输出的标度应在-10到10之间
4.2 PPO调参的血泪教训
PPO实现中有几个魔鬼参数:
- KL惩罚系数:0.1是安全起点,但要根据模型调整。有次设为0.5导致输出完全失去创造性
- 熵奖励:0.01可维持多样性,过高会使输出随机
- clip范围:0.2是标准值,但对大模型可能需降至0.1
yaml复制# 典型PPO配置
ppo_params:
batch_size: 32
mini_batch_size: 4
ppo_epochs: 4
learning_rate: 1e-6 # 必须小于SFT学习率
clip_range: 0.2
gamma: 1.0
4.3 人类反馈的替代方案
当缺乏真人标注时,这些方法可作为过渡:
- 规则奖励:对特定模式(如代码块)给予固定奖励
- 合成偏好:用更强的模型(如GPT-4)生成对比数据
- 自洽奖励:对同一提示多次采样,选择最一致的输出
5. 避坑指南与诊断技巧
5.1 训练异常诊断表
| 症状 | 可能原因 | 解决方案 |
|---|---|---|
| loss剧烈波动 | 学习率过高 | 降至1/10重试 |
| 输出重复短语 | 采样温度过低 | 设为0.7-1.0 |
| 生成无关内容 | 上下文长度不足 | 检查attention mask |
| 性能突然下降 | 梯度爆炸 | 添加梯度裁剪 |
5.2 显存优化组合拳
在24G显存的3090上跑13B模型的技巧:
- 启用Flash Attention 2
- 使用gradient checkpointing
- 采用4-bit量化(bitsandbytes库)
- 设置--optimizer=adamw_bnb_8bit
bash复制deepspeed --num_gpus=1 train.py \
--deepspeed ds_config.json \
--bf16 \
--gradient_checkpointing
5.3 评估指标新思路
除了常规的准确率,我特别关注:
- 连贯性得分:用自己生成的文本作为输入,计算perplexity
- 知识保持率:在预训练知识测试集上的性能下降幅度
- 响应多样性:生成100个回答的unique n-gram比例
6. 从理论到产品的关键跨越
完成三阶段训练后,模型仍需要:
- 安全对齐:用拒绝采样过滤有害输出
- 延迟优化:通过量化、蒸馏提升推理速度
- 持续学习:设置在线学习管道处理新数据
最后分享一个反直觉的发现:有时RLHF阶段后模型的基础能力会暂时下降(称为"对齐税"),这通常2-3天后会恢复。不要因此恐慌中断训练——这是模型在重构知识体系的表现。
