微调卡住的人,多半不是不会跑脚本,而是数据造得不对、超参凭感觉抄,跑完一轮也不知道该信哪个指标。这篇按「先定目标输出,再定数据形态,最后定超参」的顺序拆一遍,每一步都给判断标准和排查动作,也说明哪些做法在数据量小、标签噪声大时不适用。
微调卡住的人,问题往往不在脚本跑不起来,而在数据造得不对、超参凭感觉抄,跑完一轮也不知道该信哪个指标。更麻烦的是,很多人一上来就纠结学习率设多少、训练几轮,却没把「目标输出长什么样」想清楚,结果数据形态和任务目标对不上,怎么调都不对。
这篇按「先定目标输出,再定数据形态,最后定超参」的顺序拆一遍。每个环节都给判断标准和排查动作,也说清楚哪些做法在数据量小、标签噪声大的场景下不适用。如果你还在纠结要不要微调,可以先去 fine-tuning 相关页面看看别人怎么分层处理,再回来做数据。
先定目标输出,再决定要不要微调
动手写数据之前,先把任务写成固定的「输入→输出」格式。如果格式半天定不下来,说明你要的不是微调,而是提示工程或者检索增强。格式定不下来通常意味着任务本身还没收敛,这种情况下喂多少数据都学不出稳定行为。
- 输出格式要严格统一,比如永远返回固定字段的 JSON,容错空间小到模型自己发挥不出来
- 领域术语模型老答错,而且换提示词也救不回来
- 需要稳定复现同一种风格或语气,靠提示词约束不住
判断顺序很简单:先试提示工程,再试检索增强,最后才考虑微调。前两步能解决就别急着微调,因为微调一次的数据维护成本远高于维护一套提示词或检索配置。
数据怎么造:形态、规模与配比
每条样本都要写清楚「必须出现的字段」和「必须不出现的字段」。后者常被忽略,但恰恰是过滤跑偏样本的关键。比如要求输出里不出现某类免责声明,你就得在过滤阶段把带这种句子的样本挑出来,而不是等训练完发现模型老爱加一句废话。
规模没有固定门槛。先按任务复杂度做小样本试跑,看损失曲线是否收敛、验证表现是否稳定,再决定加量。具体到什么量级算够,不同任务差异很大,可以去训练相关的站内页面核对当时的实操口径,别照搬别人的数字。
| 数据类型 | 作用 | 配比建议 |
|---|---|---|
| 干净样本 | 教会模型正确格式 | 占主体 |
| 失败案例 | 提升鲁棒性 | 按线上出错频率配 |
| 边界样本 | 防止模型过度自信 | 少量但必须有 |
| 探针样本 | 不训练,用来观察记忆 | 固定留出 |
配比要覆盖失败场景。把线上真实答错的案例按比例塞进训练集,比全用干净样本更能提升鲁棒性。但要注意:标签本身有歧义、多个标注员理解不一致时,先统一标注规范再加量,否则只是把噪声放大。
数据清洗与质量校验清单
- 去重先处理完全重复,再用相似度阈值粗筛近似重复。近似重复会导致模型背题,把同一句话换个说法当成两个样本学。
- 长度分布检查画一下样本长度分布,看有没有极端长尾。过长样本容易拖慢训练,过短样本可能信息不足。
- 格式校验用脚本批量检查每条样本的字段是否齐全、JSON 是否能解析、必填项有没有空值。
- 人工抽检按数据来源可信度定抽检比例,来源杂的先高比例抽,来源单一的可降低。
留一小撮「探针样本」不参与训练,用来观察模型是否记住了不该记的内容。探针样本要长得像训练数据,但内容上刻意换个说法,训练完拿它测一下,如果模型答得跟训练集一模一样,说明记忆过度了。
超参怎么设:从保守档开始,一次只动一个
先固定一个保守组合跑通全流程,确认数据管道没问题,再逐个调整。一次改多个变量等于没法归因,出了问题你也不知道是哪个参数导致的。保守档的意思是学习率偏小、训练轮数偏少、可训练范围偏窄,先看模型有没有在学。
学习率、批大小、训练轮数三者互相牵制。改一个要看另外两个是否还合适,别直接抄别人的配置。比如批大小翻倍了,学习率通常也要跟着调,但调到多少取决于你的数据规模和任务难度,没有通用答案。
- LoRA 类方法重点在秩和可训练层范围,范围铺得越大越容易过拟合小数据
- 训练轮数不是越多越好,小数据下多跑几轮先看到的是过拟合不是提升
- 批大小受显存限制,调不上去就用梯度累积顶,但要注意累积步数和学习率的配合
不适用情形:数据量极少时,增大训练轮数通常先带来过拟合而不是效果提升。这时候更该做的是补数据或者降低可训练范围,而不是继续加轮数。
什么时候算过拟合:看验证集而不是训练集
训练损失持续降、验证损失开始回升,就是典型的过拟合拐点。取拐点附近而不是最后一个检查点,最后一个检查点往往已经偏离了。验证集要定期跑,别等训练结束才看。
用固定的一批真实任务做人工对比,胜、平、负各占多少,比单一指标更能说明问题。单一指标容易被格式合规率这类硬指标拉高,但实际任务质量可能已经掉了。
| 现象 | 可能原因 | 对应动作 |
|---|---|---|
| 训练损失降、验证损失升 | 过拟合 | 取拐点附近的检查点 |
| 验证好、真实任务差 | 验证集分布不一致 | 重建验证集 |
| 两者都不动 | 学习率过小或数据有问题 | 先查数据格式 |
| 两者都剧烈波动 | 学习率过大或批太小 | 降学习率或加批 |
不适用情形:任务只有几十条样本时,验证集本身抖动大,结论要更谨慎。这种情况下多换几个随机种子跑,看结论是否稳定,比盯着单次结果调参靠谱。
评测闭环:拿什么指标判断该停还是该继续
分三层看:格式合规率是硬指标,任务正确率靠人工或规则判定,风格一致性靠抽样对比。三层指标要分开记录,不要把风格问题和正确率问题混在一起归因,那会导致改错方向。
- 准备两套评测:一套跑批量回归,一套是固定的小型人工评测集
- 人工评测集用来防止指标造假式的自我欺骗,因为批量回归容易被格式指标带偏
- 每轮训练记录改动项和结果,形成可回溯的对照表
- 判断标准要写下来,不然看结果时容易事后调整预期
对照表要写到什么程度?至少要有轮次编号、改了哪个变量、三层指标各是什么、结论是继续还是回退。几轮之后如果没有这张表,你会说不清哪次改动起了作用。
常见坑与排查顺序
按这个顺序排查:数据格式 → 标签一致性 → 评测集是否泄漏 → 超参 → 模型规模是否合适。顺序不能乱,因为后面的问题往往被前面的问题掩盖。数据格式没对齐就去调超参,纯属浪费时间。
- 最常见的坑是训练集里混进了评测集样本,效果虚高,上线立刻打回原形
- 第二个坑是只调超参不看数据,参数换了一轮又一轮,问题其实在样本质量
- 第三个坑是评测标准中途改,前后两轮的结果没法比
- 第四个坑是数据量不够却硬上大范围微调,过拟合几乎是必然的
不适用情形:任务本身定义模糊时,任何参数调整都是随机波动。这时候先回去把任务定义收敛,把输入输出格式写清楚,再谈训练。评估指标怎么设、每轮看什么,可以到评测相关的站内页面参考当时的框架,别自己拍脑袋定一套。
一张对照表:现象与对应动作
| 看到的状况 | 先查什么 | 对应动作 |
|---|---|---|
| 输出格式不稳定 | 数据里的格式一致性 | 统一样本格式,而不是加训练轮数 |
| 领域术语答错 | 术语相关样本对数量 | 补充样本对,单个词出现次数太少学不牢 |
| 通用能力下降 | 学习率和可训练范围 | 收窄范围、降学习率 |
| 效果波动大 | 数据量和随机种子 | 小数据下换种子差异显著,多跑几次取稳定结论 |
这张表的用法是:先定位现象属于哪一行,再按「先查什么」的顺序排查,不要跳步。跳步最容易出现的情况是,明明数据格式有问题,却一直在调超参,几轮下来既没解决问题也说不清哪次改动有效。价格、算力成本这类数字会随时间和供应商变化,去站内价格追踪页面核对当时的数字,别拿旧数据做预算。
下一步把上面这张对照表存下来,下一轮训练前先按排查顺序过一遍;需要横向对比不同方案的成本和性能时,去价格追踪和排名页面核对当时的数字。→常见问题
数据量不多,比如只有几百条,还能微调吗?
可以试,但要把预期放在「格式和风格收敛」而不是「学会新知识」。几百条样本更适合调输出格式和口吻,学习率要小、轮数要少,并且必须留出足够有代表性的验证样本,否则很容易得出错误结论。
超参该按什么顺序调?
先确认数据没问题,再固定一组保守参数跑通,然后按影响从大到小逐个调:通常是学习率、可训练范围、轮数、批大小。一次只改一个,改完就记录结果,不然几轮之后根本说不清是哪次改动起了作用。
训练损失一直在降,是不是说明效果在变好?
不一定。训练损失降只说明模型在拟合训练集,真正要看的是验证集和真实任务的对比结果。验证损失开始回升、或者人工对比胜率不再提升,基本就到了该停的点,继续跑大概率是过拟合。
怎么判断是数据问题还是参数问题?
先做数据侧排查:格式是否统一、标签是否一致、有没有重复样本和评测集泄漏。这些都没问题再动参数。实践中多数效果不理想的情况出在数据上,参数的影响通常排在后面。
微调后通用能力变差怎么办?
通常是学习率偏大或者可训练的范围铺得太广,把小数据上的噪声学进去了。降低学习率、缩小可训练范围、减少轮数,同时检查训练集里是否有大量偏离原分布的样本,必要时混入一部分通用样本做平衡。