11.8 常见错误
微调的每一步都可能踩坑。本节整理了实践中最高频的错误,每个都包含症状、根因和修法。这些问题在 LoRA/QLoRA SFT 场景中尤其常见 1。
1. 数据太少
症状: 训练 loss 看起来正常下降,但一问实际问题就答非所问或反复输出相同内容。
根因: 微调不是魔法。它只是调整模型的表达方式,无法无中生有地学会一个新领域的知识。几十条数据就想让模型精通法律或医学是不现实的。
修法:
- 指令跟随类任务(让模型按特定格式回答)最少 100-500 条
- 知识注入类任务(让模型学会新领域内容)最少 1000-5000 条
- 复杂推理或生成任务最少 5000 条以上
- 少于 100 条时,考虑用更简单的 Prompt 工程方案而非微调
- 数据不够可以用合成数据(让更强的模型生成训练样本)扩充 2
打个比方:你想让厨师学会做川菜。给他一张菜谱(Prompt 工程),他就能做。微调相当于给他 1000 道川菜的详细做法——数据不够等于只给了 3 道菜的做法,他学不会”川菜”,只会背这 3 道菜。
2. 学习率太大
症状: 训练 loss 剧烈震荡或直接爆炸(变成 NaN),或者 loss 下降但验证集效果越来越差(过拟合)。
根因: 微调的学习率应该比预训练小 10-100 倍。预训练的学习率(如 3e-4)对微调来说相当于”重锤砸豆腐”——模型已经学好了语言,微调只是在微调方向,用力过猛就破坏了原有能力。
修法:
- LoRA/QLoRA SFT 的起始学习率建议 2e-4 3,如果不稳定降到 1e-4 甚至 5e-5
- DPO/RLHF 的学习率应该更低,5e-6 到 1e-5
- 全量微调的学习率比 LoRA 更低,1e-5 到 5e-5
- 配合 Warmup:前 5-10% 的训练步数用更低的起始学习率,让模型平稳过渡
3. 过拟合训练集
症状: 训练 loss 降到非常低(比如 0.2 以下),但验证集 loss 不降反升。模型的回答变得”死板”——只会重复训练数据里的措辞。
根因: LoRA 的可训练参数少,在少量数据上训练多轮很容易记住训练数据的具体词句而非学会模式。这就像学生把考题背下来了,换个说法就不会了。
修法:
- 减少训练轮数:大多数 SFT 场景 1-3 轮足够,不要超过 5 轮
- 增大 LoRA dropout:从默认 0 调到 0.05-0.1
- 减小 rank 或 alpha:rank 从 16 降到 8,alpha 从 32 降到 16
- 加入 10-20% 通用数据混合训练(防止模型只学会你的领域却忘了怎么正常对话)
- 启用早停(Early Stopping):验证 loss 连续上升就停止
4. 没有 baseline 对比
症状: 微调完觉得”效果不错”,但其实原始模型不经微调,换一种说法问同样的问题也能得到差不多的答案。你不知道微调到底带来了多少提升。
修法:
- 微调前必须用原始模型(不加 adapter)在同一批测试数据上跑一遍,记录 baseline 指标
- 对比维度至少包括:回答准确性、格式符合度、拒绝率
- 如果微调后在关键指标上只比 baseline 好 3-5%,重新评估”需要微调”这个前提
- 很多时候,更好的 Prompt 或 RAG(检索增强生成)就能达到同样的提升,成本更低 4
5. 数据泄露
症状: 评估指标非常好,但上线后真实场景效果差一大截。
根因: 训练数据里污染了测试数据。常见场景:用同一批文档生成训练和测试集时没有按来源严格切分;从网上抓的数据里已经包含了测试集的内容;训练集里出现了测试集的同义改写。
修法:
- 训练/验证/测试按来源或时间严格切分,不是随机切分
- 用去重检查(MinHash 或 Jaccard 相似度):训练集里有没有和测试集高度重复的样本
- 切分规则:同一个文档、同一段对话的不同轮次不能散落在训练和测试集
- 开源数据集要额外检查:是否有已知的测试集污染问题
6. Tokenizer 或对话模板不匹配
症状: 模型训练完了,推理时输出的内容和格式完全不对——多出奇怪的符号、角色标记没有被正确识别、或者模型”自问自答”。
根因: 不同的基座模型使用不同的对话模板(Chat Template)。LLaMA、Qwen、ChatGLM 的模板格式完全不同。用错了模板,模型看不到正确的”角色”标记,就不知道哪句话是用户说的、哪句是助手该回答的。
修法:
- 确认基座模型的官方对话模板:LLaMA-3 用
<|start_header_id|>user<|end_header_id|>,Qwen 用<|im_start|>user,Mistral 用[INST]等 - 训练和推理必须用完全相同的模板,包括特殊 token 和换行符
- 用 HuggingFace 的
tokenizer.apply_chat_template()自动生成正确的格式,不要手写拼接
7. 没做 checkpoint
症状: 训练了几个小时,因为显存不够或断电直接崩溃,所有进度丢失。
修法:
- 按 epoch 或每 N 步保存 checkpoint:
save_strategy="epoch"或save_steps=100 - QLoRA 训练时每个 checkpoint 只有几十 MB(LoRA 权重加配置),完全不用吝啬
- 保存时保留多个 checkpoint(如最近 3 个),防止某个 checkpoint 损坏
8. 选了错的基座模型
症状: 用代码模型做对话微调,或者用对话模型做分类微调——效果怎么调都不理想。
修法:
- 对话任务选对话模型(LLaMA-Chat、Qwen-Chat 等),不要选纯基座模型(LLaMA-base)
- 代码任务选代码模型(DeepSeek-Coder、CodeLlama 等)
- 中文任务选中文预训练占比较高的模型(Qwen、ChatGLM 等),不要直接拿 LLaMA 微调中文
- 资源受限时选小模型(7B 以下),不要认为”大模型就一定更好”——同等情况优先选训练数据更匹配的模型
上一节:11.7 2026年微调新趋势 | 下一节:11.9 微调实操流程
注释
-
HuggingFace PEFT 文档常见问题 2025; Community Q&A, LoRA Debugging, 2025 ↩
-
Zhou et al., “LIMA: Less Is More for Alignment”, 2023, https://arxiv.org/abs/2305.11206 ↩
-
Unsloth LoRA Best Practices, 2025 ↩
-
对比-RAGvs微调 ↩
关联6
知识图谱局部图谱 · 点节点跳转