小模型指令微调:数据混合、模板与过拟合的最小复现

- 系列:开源 AI 论文复现实验与代码解读|第五轮 067
- 日期:2026-09-08
- 读者:研究生、科研新人和工程型研究者
复现价值:少量数据为何仍需要严格对照
监督微调,即 SFT,是用输入及示范回答继续优化模型。预训练提供的能力、示范覆盖的任务、输出格式和评测方式共同决定收益,不能仅凭数据条数解释结果。
论文报告:Zhou 等人的 LIMA 在已有六百五十亿参数 LLaMA 上使用一千条精选示例研究对齐。它支持特定基础模型和数据条件下的小样本效果,不能证明一个从零训练的小网络也只需这些数据。LIMA 原论文
Wang 等人的 Tülu 工作比较多种开放指令数据,并发现不同数据对能力维度的帮助不同,没有一种混合在全部评测中最优。对研究新人,这意味着先确定能力切片,再决定配比,不能只看平均偏好分。Tülu 论文
本文实际验证的是训练机制与测量链路。微型模型便于保存每个检查点、核对梯度,却缺少大规模预训练知识。真实小模型接口另用 SmolLM2-135M 基础模型作为准备对象;模型卡区分基础与指令版本,二者不能混用后仍声称进行首次指令微调。官方模型卡
核心思想与公式:混合的是样本,监督的是词元
将一段对话序列化为词元序列 s s s,只在回答位置计算损失:
L = − 1 M ∑ b , t m b t log p θ ( s b , t + 1 ∣ s b , ≤ t ) , M = ∑ b , t m b t . L=-\frac{1}{M}\sum_{b,t}m_{bt}\log p_\theta(s_{b,t+1}\mid s_{b,\le t}),\qquad M=\sum_{b,t}m_{bt}. L=−M1∑b,tmbtlogpθ(sb,t+1∣sb,≤t),M=∑b,tmbt.
模型输出为 [B,T,V],分别表示批大小、预测位置数和词表大小;掩码 m m m 为 [B,T],回答及结束词元处取一,提示词和填充目标处取零。 M M M 必须大于零。模型仍读取提示词,梯度也能经隐藏状态回传;屏蔽提示词的预测损失并不等于切断输入信息。
聊天模板负责把角色、内容和回合边界变成模型看到的序列。同一句问题,角色标记或回答起始位置不同,都可能改变条件分布。先打印最终词元和有效标签,再检查推理前缀是否与训练一致。框架官方文档提醒:已经渲染好的模板再次分词时,应避免重复添加特殊词元。模板文档
假设源 i i i 的抽样概率为 π i \pi_i πi、平均有效回答长度为 ℓ i \ell_i ℓi,全局按有效词元平均时,其期望监督占比近似为 π i ℓ i / ∑ j π j ℓ j \pi_i\ell_i/\sum_j\pi_j\ell_j πiℓi/∑jπjℓj。这个估计假设长度稳定、没有额外截断;长答案源可能贡献更多位置。若采用每样本等权平均,权重关系又会变化,所以配比必须连同损失归一化一起报告。

图中先按问题组切分,再只混合训练数据;开发集挑选检查点,测试集仅检验冻结方案。开发和测试数据也需要一致的编码与评分处理,图中省略这些重复步骤,其箭头不表示直接输入未经处理的文本。
官方代码阅读路线:从数据入口走到 loss
先读 Open Instruct README,确认研究版本和入口。当前仓库已包含多代后训练方案;阅读今天的 main 不等于获得二〇二三年论文的原始环境。本文记录检索日期,未锁定提交,完整复现仍待人工核验。官方仓库
再看 dataset_transformation.py 的 load_dataset_configs:混合列表中的字符串 "1" 被解释为一条样本,"1.0" 才表示整个源的比例。随后沿 _tokenize_tulu_sft_with_assistant_labels 看模板渲染、快速分词器的字符偏移与回答标签;初始标签是 -100,再恢复可监督区域。不能拿简单字符串搜索替代多轮回合边界推导。数据源码
最后在 finetune.py 找 model(**batch)、outputs.loss 和反向传播,并追踪有效预测词元统计。核对是否已经做过因果移位,避免再切一次标签。仓库分布式路径还有额外处理,本文没有执行。训练源码
若使用 TRL,区分回答角色监督与 prompt-completion 的补全监督。assistant_only_loss=True 依赖模板能够标记助手生成区域,不能只打开开关便假定掩码正确。实际模板、版本与一条解码后的有效标签都应进入记录。SFTTrainer 文档
最小实验:先建立能回放的因果语言模型
code/minimal_sft.py 使用 NumPy 实现循环神经网络,即逐词元更新隐藏状态的 RNN,隐藏维度四十八、词表十二项,共三千五百一十六个参数。它不是 Transformer,也不是自然语言预训练模型。
任务为复制或逐位翻转二进制字符串。先在三位字符串的十六条任务序列上全序列热身六百步,再对四位字符串进行微调。这是合成热身,不能等同于大规模文本预训练。四位输入先按原始字符串分组,训练八组、开发四组、测试四组,每组两种任务,因此同一个输入不会跨集合。
每个种子的三个分支都从同一热身权重开始,并重置优化器。单源分支把八条复制样本各用两次;平衡分支各用八条复制与翻转样本;全文分支使用相同平衡数据,但监督所有非填充目标。批大小十六,Adam 学习率 0.003,梯度范数上限一,全部训练四百步。
bash
python3 code/minimal_sft.py > code/smoke_test.txt
python3 -m py_compile code/minimal_sft.py code/local_hf_sft.py
需先按 code/README.md 准备环境。本次实际使用 Python 3.12.14、NumPy 2.3.5、CPU;系统 Python 缺少 NumPy。输入 [16,12],输出 [16,12,12]。预定在二十、一百、二百、四百步检查开发集回答负对数似然,即 NLL,越低越好;只按它挑选检查点,不按测试准确率挑选。
下表为初始化种子 67、68、69 的严格整串匹配率,要求内容和结束词元均正确;贪心生成最多八个词元。"±"为三个种子的样本标准差,不是置信区间。
| 微调设置 | 同模板测试匹配率 | 换模板测试匹配率 | 每步监督词元 |
|---|---|---|---|
| 仅复制,回答监督 | 0.125 ± 0.125 | 0.000 | 80 |
| 平衡混合,回答监督 | 0.333 ± 0.260 | 0.000 | 80 |
| 平衡混合,全文监督 | 0.167 ± 0.072 | 0.000 | 192 |
热身模型在四位测试集上的整串匹配率均为零。混合分支均值较高但波动很大,每个种子只有八条测试记录,不能据此推广"平衡配比最优"。全文分支改变了监督位置和分母,虽然输入与步数相同,却不是固定监督词元预算对照。
换模板将 USER/ASSISTANT 改为 TASK/INPUT/ANSWER 包装。这些词元虽在固定词表中,却未作为热身或微调输入出现;零分是极端分布外压力测试,不能证明真实模型对普通措辞改写都会崩溃。
所有数据、逐条生成、开发曲线及权重均已保存。五类参数的有限差分梯度最大误差约为 2.60 × 10 − 11 2.60\times10^{-11} 2.60×10−11,首回答位置、结束词元计数及批均值检查通过。另附 local_hf_sft.py,可从本地基础模型加载、按回答掩码训练并在开发集选模型;本机无 torch,只有语法检查通过,真实权重加载、训练和接口兼容性待人工核验。
评测协议:分别测拟合、泛化与格式
固定基础模型与分词器版本,保存模板原文、数据来源及去重规则。按问题家族切分比随机拆行更重要:同一问题的改写和两个解题版本应同组。本文测试新输入组合,任务类型仍见过,不能称为跨任务泛化。
还应把评测前缀本身作为实验材料保存。例如本例复制输入的训练序列以助手标记衔接四个回答词元和结束标记;测试时只能提供助手标记以前的部分,不能把真实回答悄悄留在输入中。保存逐条生成可以检查这种泄漏,也便于重新计算更严格的指标。
任务正确率、格式合规率、回答 NLL 应分开。前者检查自由生成,NLL 使用真实答案前缀,所以低 NLL 不保证长序列全部正确。自然语言任务还应记录错误类型及原始输出,避免清洗掉额外解释之后,把格式违约隐藏在"正确答案"里。
配比研究至少同时报告样本数、有效回答词元数、总输入词元和优化步数。长答案、截断和重复采样都会改变预算。本例单源重复数据用于匹配每步规模,但独立样本更少,这是配比比较的结构差异,不能说所有因素都相同。
三次初始化共享同一切分,其标准差只反映训练敏感性。正式报告需要更多问题组与预先冻结的配方,可按问题组进行配对重采样;仅扩大训练种子数量并不能弥补测试覆盖不足。
失败排查:训练下降时先看开发集
本次种子六十七的平衡分支,从一百到四百步,训练回答 NLL 由 0.0588 降至 0.0021,开发 NLL 却由 0.6055 升至 1.0407。因此选择一百步检查点。这里观察到了对训练数据的进一步拟合没有换来开发收益;不是"训练越久必然退化"的普遍定律。
生成长度出错时,先看结束词元是否受监督以及最大生成长度。种子六十七的一个翻转测试答案应为 0101,模型生成 01100 后才结束,说明错误同时涉及内容与停止,不能只归为格式问题。
损失异常小也可能是监督了容易预测的模板、回答被截断或全标签无效。先解码一条有效标签,再检查首回答词元的预测位置。启用样本打包,即把多条记录拼入一个序列时,还需确认跨样本注意力与边界处理;本次没有打包,不能把吞吐量结果推给该功能。
后续科研问题
作者推断:平衡混合的收益可能来自第二种任务的覆盖,也可能与独立样本更多有关。下一步保持独立输入数一致,比较单源、多源与重复次数,再在固定有效词元预算下重复,才能分离这些因素。
模板问题可从极端新标记转向同词表、同长度的包装扰动,并加入多模板训练对照。如果改善只发生在见过的包装上,学到的可能仍是格式匹配。迁移到真实小模型后,还应加入原能力测试,观察指令适配是否伴随遗忘。
总结
本次完成了数据分组、响应监督、开发选择和自由生成的可回放实验,也发现了过拟合迹象与模板失效。论文提供研究假设,官方源码暴露实际协议;可靠复现需要把二者与本机证据逐项对齐,而不是让漂亮的训练曲线替代独立测试。
参考资料
检索日期:2026-09-08。正文各链接均已实际打开,以下为核心版本与阅读入口;动态代码和模型运行兼容性待人工核验。
- Chunting Zhou 等,2023,LIMA: Less Is More for Alignment,arXiv v1 全文。
- Yizhong Wang 等,2023,How Far Can Camels Go? Exploring the State of Instruction Tuning on Open Resources,arXiv v2,页面注明 NeurIPS 2023 Datasets and Benchmarks camera-ready。
- AllenAI,Open Instruct 官方仓库,本文阅读检索日 main 的数据与训练模块,非原论文提交快照。
- Hugging Face,聊天模板文档、TRL SFTTrainer与SmolLM2-135M 基础模型卡。