本节摘要:微调不是"跑了就完事",路上有四只拦路虎:灾难性遗忘、过拟合、数据质量、评估困难。本节逐个拆解每个问题的表现、成因与对策,并给出一套"先小规模实验再全量"的工程方法论。
阅读完本节,你应当能够:
微调失败的现场通常长这样:训练完损失挺低,一问通用问题"模型变傻了"(灾难性遗忘);或者模型把微调数据背得滚瓜烂熟,换句话就答错(过拟合)。微调不是"学新东西",是"在不忘旧东西的前提下学新东西"——这个"不忘"才是真正的难点。
微调用新数据大幅更新参数时,模型可能"忘掉"预训练学到的通用能力。表现:领域问题答得好,通用问题变差。
对策:
领域数据通常不多,模型容易"背题"。表现:训练损失低、验证损失高。
对策:早停、数据增强、正则化、LoRA 等低容量方法。
| 维度 | 标准 |
|---|---|
| 数量 | 够训练(几百到几千条) |
| 质量 | 干净、无错标 |
| 多样性 | 覆盖各种问法 |
| 均衡 | 各类别都有 |
💡 关键直觉:微调效果的上限由数据质量决定。与其增加数量,不如提升质量——"一千条高质量 > 一万条低质量"在微调里是铁律。
微调效果怎么量化?三个层次:
层次一 自动指标:BLEU、准确率等(快速但不全面) 层次二 人工评测:人打分回答质量(慢但真实) 层次三 任务对比:微调前后在相同测试集对比(必备基线)
微调前先跑一次基线——拿原始模型在测试集上测,微调后再测,对比才有意义。
第一步 小数据:取 10% 数据快速跑一轮 第二步 看趋势:损失是否下降、效果是否提升 第三步 再全量:趋势对了再上全部数据与更大模型
⚠️ 常见坑:直接全量开跑,跑完才发现方向错了。小规模先行能在半小时内验证"数据格式对不对、策略对不对"——这是微调工程最重要的习惯。
| 现象 | 可能原因 | 排查 |
|---|---|---|
| 损失不降 | 学习率太小/数据错 | 调大学习率、检查数据 |
| 损失震荡 | 学习率太大/批次太小 | 调小学习率、加大批次 |
| 训练好测试差 | 过拟合 | 早停、加正则 |
| 通用能力下降 | 灾难性遗忘 | 混入通用数据 |
| 效果没提升 | 任务与领域不匹配 | 重新评估是否该微调 |
把"混学"落到代码上,就是在领域数据里按比例掺入通用数据。比例是经验值:常见做法是领域数据与通用数据按 8:2 到 9:1 混合,通用数据可以来自通用指令集或预训练语料的抽样:
import random domain_data = [{"input": "退货流程是什么", "output": "请您在订单页申请退货……"} for _ in range(800)] general_data = [{"input": "什么是光合作用", "output": "光合作用是植物利用光能……"} for _ in range(200)] mixed = domain_data + general_data random.shuffle(mixed) # 打乱,避免模型先学领域、后忘领域
混入通用数据的代价是训练成本略增、领域收敛略慢,但它能显著缓解灾难性遗忘——微调后模型回答通用问题依然正常。如果发现通用能力仍下降,可以进一步增大通用数据比例,或改用更小的学习率。反过来,如果领域效果不够好,说明通用数据占比可能偏高,按先领域效果、再通用能力的顺序逐步微调比例。
第 2 章完结。第 3 章深入参数训练的细节——优化器、正则化、超参数与监控。