预训练与微调
→ 返回大模型
预训练(Pre-training):在海量(多为无标注)文本上学习 下一 token 预测,得到 Base 模型——具备语法、常识与部分世界知识,但未必会「听人话」。
微调(Fine-tuning):用较小、任务相关的数据调整权重,使模型 跟从指令、掌握 领域术语与格式,并可经 偏好对齐 变得更像安全、有用的助手。
架构背景见 Transformer 与注意力、LLM 基础;训练完成后见 推理与部署、量化与压缩。
全链路一览
┌─────────────────────────────────────┐
│ 预训练 PT(Causal LM,海量语料) │
└─────────────────┬───────────────────┘
▼
Base 模型(续写型)
┌─────────────────┴───────────────────┐
│ 可选:继续预训练 CPT(领域语料) │
└─────────────────┬───────────────────┘
▼
┌─────────────────────────────────────┐
│ 指令微调 SFT(instruction–response │
└─────────────────┬───────────────────┘
▼
Instruct / Chat 雏形
┌─────────────────┴───────────────────┐
│ 偏好对齐:RLHF / DPO / ORPO / KTO… │
└─────────────────┬───────────────────┘
▼
Chat / 助手型(生产常用)
┌─────────────────┴───────────────────┐
│ 可选:DPO 后再 SFT、工具调用专项 S │
└─────────────────────────────────────┘| 阶段 | 典型数据 | 学到什么 | 常见产物名 |
|---|---|---|---|
| PT | 网页、书籍、代码、多语混料 | 语言建模、知识、代码能力 | *-Base |
| CPT | 法律/医疗/企业内部文档 | 领域词汇与行文习惯 | 领域 Base |
| SFT | 高质量指令–回答、多轮对话 | 指令遵循、格式、工具调用模板 | *-Instruct / *-Chat |
| 对齐 | 人类排序、chosen/rejected 对 | 有用性、安全性、风格 | *-Chat(对齐版) |
预训练(Pre-training)
训练目标
主流 因果语言模型(Causal LM):给定前文,预测下一个 token,损失为交叉熵。
输入: "今天天气"
目标: 逐位置预测 ["天", "气", "很", "好", ...]部分模型在预训练阶段加入 填空(MLM)、多任务混合 或 多模态对齐,但开源 LLM 仍以 自回归 PT 为主。
数据与清洗
| 环节 | 要点 |
|---|---|
| 来源 | Common Crawl、书籍、GitHub、论文、对话片段(需合规) |
| 去重 | MinHash / 精确去重,降低记忆与抄袭风险 |
| 过滤 | 低质、有毒、PII、乱码页;语言识别与配比 |
| 配比 | 代码 / 多语 / 数学 等按目标能力调配 |
预训练 不教「以助手身份回答」——直接拿 Base 做问答往往 续写提示 而非 直接给答案。
规模与成本(直觉)
| 规模 | 参数量 | 训练资源(量级) |
|---|---|---|
| 小实验 | 1B–3B | 单卡–数卡,数日 |
| 开源主力 | 7B–14B | 多卡集群,数周 |
| 旗舰 | 70B+ | 大规模集群 + 专家并行 |
Scaling Law:算力、数据量、参数量共同决定 loss;实际项目多在 已有 Base 上做 SFT/LoRA,而非从零 PT。
继续预训练(CPT / Domain-adaptive PT)
在通用 Base 上 再用领域语料做 PT(仍用 LM 损失):
- 适用:法律、金融、医疗等 术语密集 且公开 SFT 数据少的领域。
- 风险:配比不当会 削弱通用能力(灾难性遗忘);领域语料需去重、控毒。
- 与 SFT 关系:CPT 补「知识密度」,SFT 补「交互格式」;很多团队 CPT + SFT 串联。
监督微调(SFT)
SFT 把 (指令, 理想回答) 监督给模型,损失仍多为 只在回答段计算 token 的交叉熵(提示段 mask 掉),避免模型学习「重复用户问题」。
数据格式
Alpaca 单轮(字段名因工具而异):
{
"instruction": "用一句话解释梯度下降",
"input": "",
"output": "梯度下降通过沿损失函数负梯度方向迭代更新参数……"
}ShareGPT 多轮:
{
"conversations": [
{ "from": "human", "value": "你好" },
{ "from": "gpt", "value": "你好,有什么可以帮你?" }
]
}| 格式 | 优点 | 注意 |
|---|---|---|
| Alpaca | 简单、适合单任务 | 多轮需自行拼接模板 |
| ShareGPT | 贴近真实对话 | 角色名、from 字段要与 template 一致 |
| 工具调用 JSON | 适合 Agent | 与推理时 同一套 schema |
Chat 模板(template)
同一基座在不同框架下须使用 一致的 chat template(特殊 token、角色标记):
<|im_start|>user
问题
<|im_start|>assistant
回答训练与推理模板不一致 是线上「变笨」的常见原因。换模型时查官方 tokenizer.chat_template。
数据质量原则
- 质量 > 数量:几百条高精往往胜过几万条模板废话。
- 多样性:覆盖拒答、追问、空输入、多轮指代。
- 避免泄露:评测集勿进训练集;近重复样本会 抬高评测虚高。
- 标注一致:同一任务一种口径(如日期格式、是否给代码)。
- 负样本:可加入「应拒绝」样本,减少胡编与违规服从。
数据混合
通用指令数据 ──┐
领域业务数据 ──┼──► 混合比例(如 7:3)──► 打乱 ──► SFT
工具调用样本 ──┘| 现象 | 可能原因 | 调整 |
|---|---|---|
| 领域词不会说了 | 通用比例过低 | 提高通用数据占比 |
| 格式乱、不爱跟指令 | 领域脏数据过多 | 清洗 + 减 epoch |
| 只会背训练集 | 过拟合小集 | 减 epoch、增通用、加 dropout |
SFT 超参(起点参考)
| 参数 | LoRA / QLoRA | 全参 SFT(7B 级) |
|---|---|---|
| 学习率 | 1e-4 ~ 2e-4 | 5e-6 ~ 2e-5 |
| epoch | 1–3 | 1–2 |
| batch | 受显存限制,用梯度累积凑有效 batch | 有效 batch 32–128(token 计) |
| warmup | 3%–10% steps | 同左 |
| max length | 按任务设,过长浪费显存 | 同左 |
| weight decay | 0–0.1 | 0.01 常见 |
有效 batch = per_device_batch × 梯度累积步数 × GPU 数。
epoch 过大 + 小数据集 → 过拟合(验证 loss 回升、开放题复读训练答案)。
参数高效微调(PEFT)
全参微调成本高;生产与实验大量采用 PEFT,详见 量化与压缩 · LoRA。
| 方法 | 思路 | 显存 | 典型用途 |
|---|---|---|---|
| LoRA | 冻结基座,训练低秩增量 | 低 | 领域 SFT、多任务适配器 |
| QLoRA | 4bit 量化基座 + LoRA 训练 | 更低 | 单卡 24GB 训 7B/13B |
| Adapter | 插入小模块 | 低 | 多任务切换 |
| 全参 SFT | 更新全部权重 | 很高 | 数据多、追求上限 |
LoRA 常用超参:
| 参数 | 含义 | 常见取值 |
|---|---|---|
r | 秩,越大表达能力越强 | 8、16、32、64 |
lora_alpha | 缩放,常设 alpha = 2r | 与 r 配对 |
target_modules | 注入层 | q_proj,v_proj 或全部线性层 |
lora_dropout | 防过拟合 | 0 ~ 0.05 |
训练后 合并权重(merge adapter)可得到单一 checkpoint,便于部分推理引擎加载;也可 推理时挂载 LoRA 做多适配器切换。
偏好对齐(简述)
SFT 只示范「怎么说」;对齐 用偏好数据收窄「更好 / 更差」的回答。安全与红队见 对齐与安全。
| 方法 | 核心思想 | 工程复杂度 | 备注 |
|---|---|---|---|
| RLHF | 训练奖励模型 RM,再用 PPO 等强化学习优化策略 | 高 | 工业界沿用久,调参难 |
| DPO | 直接用偏好对优化,等价于特定奖励下的策略梯度 | 中 | 无需在线采样 RM |
| ORPO | 将 SFT 与偏好合并一类目标 | 中–低 | 少阶段、适合资源紧 |
| KTO | 只需 good/bad 标签,不必成对 | 中 | 数据标注更灵活 |
偏好数据形态(概念):
{
"prompt": "用户问题",
"chosen": "更优回答",
"rejected": "较差回答"
}对齐通常在 SFT 之后;跳过 SFT 直接 DPO 往往 跟指令能力不稳。
训练工程要点
显存估算(直觉)
7B 级 BF16 全参 权重约 14GB+,再加优化器状态、梯度、激活 → 常需 多卡 + ZeRO / FSDP。
QLoRA 可在单卡 24GB 训练 7B,是团队默认起点。
分布式与加速
| 技术 | 作用 |
|---|---|
| DeepSpeed ZeRO | 切分优化器/梯度/参数,降显存 |
| FSDP | PyTorch 原生分片 |
| Flash Attention 2 | 降注意力显存、提速 |
| Gradient checkpointing | 用算力换激活显存 |
多卡严肃训练与 YAML 配置见 开源微调框架 · Axolotl。
监控指标
| 指标 | 说明 |
|---|---|
| train / eval loss | 持续下降后 eval 回升 → 过拟合 |
| grad norm | 突刺或 NaN → 学习率过大 |
| token/sec | 吞吐与配置是否匹配 |
| 样本抽检 | 比 loss 更可信 |
实验记录用 实验管理(MLflow / WandB 等)。
评测与验收
微调不能只看 training loss。
| 层级 | 做法 |
|---|---|
| 自动 | 留出验证集 perplexity;选择题 / 抽取式 QA |
| 生成质量 | BLEU/ROUGE 仅作参考;LLM-as-judge 需固定 rubric |
| 业务 | 黄金集 + 人工抽检;回归 [[AI/工程实践/Harness |
| 安全 | 越狱、偏见、拒答率;见 [[对齐与安全 |
发布前对比:基座 / SFT 前 / SFT 后 / 对齐后 同一套 prompt。
何时微调、何时不微调
| 需求 | 更合适的手段 |
|---|---|
| 私域文档问答、时效信息 | [[RAG |
| 固定输出格式、语气、流程 | SFT |
| 减少幻觉、引用来源 | RAG + Prompt;微调难单独解决 |
| 新工具 API、函数名 | SFT 工具样本 + Agent 框架 |
| 降本提速 | [[量化与压缩 |
知识在文档里、变得快 → RAG
行为/格式/领域说法要固定 → SFT / LoRA
「哪个答案更好」 → DPO / RLHF常见问题
灾难性遗忘
微调后 通用能力掉点:领域数据占比过高、学习率过大、epoch 过多。
缓解:混合通用数据、降低 LR、早停、LoRA 只训增量、CPT 控制配比。
训练–推理不一致
- template / 特殊 token 不同
- 训练用
input+output,推理漏拼 system prompt - 量化方式与训练末不一致(见 量化与压缩)
幻觉与复读
SFT 无法根除幻觉;复读常因 重复样本 或 过小数据集过拟合。加多样性、拒答样本、适当 frequency_penalty(推理侧)。
数据污染
评测 prompt 或业务真题进入训练 → 指标虚高。严格 train/val/test 与 去重(MinHash 对 prompt)。
开源微调工具链
单机或小团队落地时,工具选型详见 LLaMA-Factory、Axolotl、Unsloth。
| 工具 | 一句话 |
|---|---|
| LLaMA-Factory | 功能全、Web UI、SFT/DPO/PPO 等一条龙 |
| Axolotl | YAML 配置、多卡 DeepSpeed/FSDP,偏严肃训练 |
| Unsloth | 单卡 LoRA 更快更省显存,易导出 GGUF |
# LLaMA-Factory 示例(路径以官方 repo 为准)
llamafactory-cli train examples/train_lora/llama3_lora_sft.yaml与 RAG / 工具调用
微调 教行为与格式;不代替 时效与私域全文——生产常见组合:
用户提问 → RAG 检索片段 → 拼进 context → Instruct 模型生成
↑
工具调用(搜索、DB)── 可选,需 SFT 或强模型原生能力Agent 与 MCP 见 AI Agent 系列。