拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Loss 到底算在谁身上:检查 SFT 的模板与标签掩码——8 条真实样本、每组 4 步更新

Loss 到底算在谁身上:检查 SFT 的模板与标签掩码——8 条真实样本、每组 4 步更新

Loss 到底算在谁身上:检查 SFT 的模板与标签掩码——8 条真实样本、每组 4 步更新

  • 系列:从最小复现到可检验的科研问题
  • 日期:2026-10-02
  • 读者:研究生、科研新人和工程型研究者
  • 范围:SmolLM2-135M-Instruct、SST-2 英语情感分类;小预算训练审计,不是完整基准成绩。

一、复现价值:承接格式失败,而不是重建基线

088 已发现,同一模型在纯标签与 JSON 输出约定下表现不同。本篇沿用它的模型、分词器、提示和评分器,只新增监督位置对照;开发评测取原有六十四条中的固定前八条,另留的一百二十八条确认样本继续不推理。不能把这八条的分数直接与上一篇六十四条总分相减。

模型仍是已经接受官方指令训练的 Instruct 检查点。模型卡说明其指令训练使用公开及整理的数据,并经过偏好优化;本文不复现那个完整流程,也不宣称从未经微调的基础模型开始。[1] 新增训练样本来自固定版本 SST-2 的官方 train 划分,原验证划分只用于行为观察。[2][3]

真正新增的产物不是一条漂亮曲线,而是逐位置监督账本、逐步梯度、两份最终参数状态和更新前后的原始输出。读者可以追问:第一枚回答 token 有没有被教到?结束标记有没有被误删?没有回答的样本是否仍被送进训练?

二、核心思想:输入可见,不等于直接计入损失

设批量大小为 B、填充后序列长度为 T,模型输出分数张量 z 的形状是 [B,T,V],V 是词表大小。对输入序列 x 和监督标记 m,使用的平均交叉熵为:

L = − ∑ b = 1 B ∑ t = 1 T − 1 m b , t log ⁡ p θ ( x b , t ∣ x b , < t ) ∑ b = 1 B ∑ t = 1 T − 1 m b , t . L=-\frac{\sum_{b=1}^{B}\sum_{t=1}^{T-1}m_{b,t}\log p_\theta(x_{b,t}\mid x_{b,<t})}{\sum_{b=1}^{B}\sum_{t=1}^{T-1}m_{b,t}}.L=−∑b=1B​∑t=1T−1​mb,t​∑b=1B​∑t=1T−1​mb,t​logpθ​(xb,t​∣xb,<t​)​.

这里位置按零起点编号,m 为一表示该目标参与监督,零表示忽略;位置 t 的目标由前一位置的输出预测。分母是这一批真正被监督的 token 数,不是样本数,也不是填充后的矩形面积。分母为零时,应在进入训练前报错。

全序列组监督首个 token 之后的所有真实位置;仅回答组只监督助手回答及其真实结束标记 EOS。两组都保留完整提示作为输入,填充位置都不监督。模板产生的最后一个 EOS 之后还有换行,本篇明确在两组中一起删除,不把这个决定藏在数据处理里。

“标签掩码”是哪些位置计分;“注意力掩码”则决定填充等位置如何参与注意力计算。把提示的标签设为忽略值,并不表示从上下文删掉提示,也不表示提示对应的内部表示没有梯度。回答仍然依赖前面的任务说明和影评,这正是后面要测的区别。

三、官方代码阅读路线:沿着真正执行的链路追

先看模型的 tokenizer_config。其聊天模板写入角色起止标记,并且 PAD 填充符与 EOS 结束符共用 ID 2。[1] 因而不能用“凡是等于 pad_token_id 就设为 -100”的捷径:那样会同时删掉真实回答结尾。我们按真实长度和回答边界构造标签,另用错误做法检查反例,八条样本都少掉了一枚应监督的 EOS。

再看 Transformers 的 apply_chat_template。程序分别渲染含助手起点的提示,以及包含完整回答的对话,逐 ID 断言前者确实是后者的前缀。[4] 通过后才用该边界掩码,而非按字符串长度猜 token 数。本次只证明这种单轮模板可用;多轮对话、边界分词合并或工具消息需要重新审计,不能照搬一个固定偏移。

随后读 LlamaForCausalLM 的词表投影和 loss_function 调用,再进入固定提交的 ForCausalLMLoss。官方函数已经完成标签移位,并把忽略值设为 -100。[4] 本地直接传未移位标签,同时独立计算“前 T−1 个 logits 对后 T−1 个 labels”的交叉熵。若调用方再次提前移位,模型就会被训练去预测错误的后续位置。

最后追到 PyTorch SGD 的参数更新。[5] 本地没有改写模型数学;四份 Transformers 安装源码及 SGD 文件均与固定官方提交逐字节相同。模板、掩码构造和审计是独立教学实现,源码地图明确区分直接调用、复用作者代码与自定义规则。

四、最小实验:先冻结样本与预算,再更新参数

训练集按 SHA256(‘89:’+idx) 排序取前八条,正负各四条;这是一条预先登记的选择规则,未按训练效果筛样本。验证沿用上一篇 SHA256(‘88:’+idx) 的顺序。规范化文本核对未发现所选训练样本与开发及保留样本完全重合,但这不能排除近重复或上游预训练污染。SST-2 训练数据还包含影评片段,idx 也不能一概解释为独立完整影评。[3]

两组从同一份原始权重分别开始,完整输入、样本顺序、批量二、四步、学习率 0.001 相同;采用无动量、无权重衰减的 SGD,全局梯度范数裁剪阈值一。全部 134515008 个参数参与优化。为关闭随机模块,模型保持 eval 模式但启用自动求导;eval 不等于禁止梯度,也没有使用推理模式包住训练。

设备为 CPU、float32、四线程,显式使用 eager 注意力。先运行每组两条、一步的试跑,再据实测资源继续四步正式实验。试跑总耗时 5.518 秒、峰值约 2.33 GB;正式总耗时 9.943 秒、峰值约 2.66 GB,均在九百秒和六 GiB 预算内。总时间从第三方库导入后起算,包含资源校验、模型加载、训练、保存及评测;不是纯训练速度。GPU 内存未测量。

五、本次实际验证:掩码正确,行为仍可没有改善

第一批输入形状为 [2,92],logits 为 [2,92,49152];三轴分别是批量、位置和词表。独立交叉熵与官方 loss 的最大绝对差为 4.7684×10⁻⁷。首回答目标、真实 EOS 和填充标签逐项通过;所有忽略目标对应的 logits 直接梯度均为零,但提示输入 embedding 的梯度非零。后者表示提示仍参与回答计算,不能据此前者宣布提示“没有被学习”。

两组首层查询投影矩阵都发生可测变化,最大绝对改变量分别约 2.11×10⁻⁶ 和 2.50×10⁻⁶。最终参数状态和哈希已本地保存。小幅变化证明优化器执行过,却不能单独证明模型学会了任务。

同一组八条开发样本更新前全序列四步仅回答四步
纯标签:格式合规 / 标签正确8 / 68 / 78 / 7
JSON:格式合规 / 标签正确0 / 60 / 60 / 6
JSON:格式与标签同时正确000

评分沿用 F 格式合规、C 唯一显式情感词匹配来源标签、J 二者同时满足。C 是自动代理,未做人类语义标注。完整四十八条生成都保留,所有样本进入分母,未自动修复 JSON。两组都只把 idx481 的纯标签由 negative 改成 positive;JSON 原始回答全部不变。一次单样本变化不足以宣称总体准确率提高,更不能证明两种监督等价。

六、失败排查:先检查分母,再解释训练现象

每组输入共六百八十四个真实 token,但全序列有效监督六百七十六个,仅回答只有六十四个。首批 loss 分别约 3.1793 与 0.8639,后者较小并不意味着训练更好:两者预测的目标集合、归一化分母都不同。这是相同步数和输入的监督策略对照,不是等监督 token 预算的性能赛跑;所有更新还触发了梯度裁剪。

四批的样本不同,因此逐批 loss 的首尾差也不能当作同一批上的学习曲线。若要测固定目标是否拟合,应另设固定探针并保持评估方式;本篇没有补选一个容易下降的子集。前向上下文仍相同,不能把监督 token 少十倍写成计算成本省十倍。

截断审计则给出更直接的失败:上限六十四时,八条样本的回答目标全部消失;九十六时只丢掉一条的 EOS;一百二十八和二百五十六没有损失。正式训练采用二百五十六且无截断,遇到超长回答即失败。这些结果来自真实序列位置,不是人为加长的演示输入。

排查顺序因此应是角色边界、首回答对齐、真实 EOS、padding、有效分母、有限梯度,最后才讨论能力。首次公开下载受沙箱代理连接限制失败,随后正常下载并通过固定哈希校验;没有更换数据或把失败当作实验成功。代码执行、数据问题与模型负结果需要分别记录。

七、可检验的研究问题:把“没变化”拆成竞争解释

作者推断一是四步更新不足以改变贪心输出,二是教师强制下目标概率变化尚未跨过自由生成的首 token 决策边界。教师强制指训练时向模型提供正确的前缀;自由生成时前缀由模型自己产生。本篇没有保存完整前后概率分布,因此两种解释尚未被区分,不能写成已经定位的机制。

下一篇可在冻结开发协议下比较相同有效监督 token 的数据量与重复次数,同时登记固定目标似然、首个生成 token 及 F/C/J。若损失下降却格式持续失败,就要检查训练与生成条件差异;若只有重复同样本才能改善,还需留出任务实例验证记忆解释。这些都是待人工核验的后续实验,不预先承诺提升。确认集不参与这些选择。

源码与复现入口

本篇已发布固定版本:完整源码目录、README 运行说明、SOURCE_MAP 官方源码地图。四十个分发文件已匿名拉取并逐一核对 SHA-256,目录、说明、地图和入口均可公开访问;公开副本的独立审计及真实训练试跑通过,损失、梯度与输出和本地一致。链接固定到同一提交,不随主分支变化。

固定依赖安装并运行下载器后,最小命令是python run.py --cache ./cache --out smoke-new --private ./private-new --smoke。它执行真实两条训练样本、每组一步及两条开发样本的双约定生成,产出损失、梯度、掩码、输出和检查点;删除试跑参数可重做正式实验。独立复核使用audit.py,角色与错误 EOS 掩码反例使用role_audit.py。

本次实际完成下载、预处理、双组训练、开发生成和独立审计。缓存键包含模型、分词器、数据、模板、解码、划分及执行代码。SST-2 卡片许可标为未知,公共包不包含原始影评或可逆输入 token;这些本地审计材料、模型权重和训练检查点均不上传,读者从固定来源重新获取并运行。

总结

监督位置是实验假设的一部分。先让每个 token 的计分责任、每个梯度的含义和每份原始输出都可查,才有条件讨论训练效果。这个最小实验留下了正确运行但格式未改善的证据,也为下一步控制训练预算提供了清楚的起点。

参考资料

检索及实际访问日期:2026-10-02。网页获取失败时改读同一固定版本的官方原文,访问记录随验收保存。

  1. HuggingFaceTB:SmolLM2-135M-Instruct 固定模型卡;固定聊天模板与特殊符号。
  2. Richard Socher、Alex Perelygin、Jean Wu、Jason Chuang、Christopher D. Manning、Andrew Ng、Christopher Potts,2013:Recursive Deep Models for Semantic Compositionality Over a Sentiment Treebank,EMNLP。本文使用数据,不复现论文树模型。
  3. Stanford NLP:SST-2 固定数据卡。
  4. Hugging Face,Transformers 4.49.0:聊天模板入口、模型损失调用、移位与忽略标签源码原文。
  5. PyTorch 2.6.0:SGD 单张量更新。
返回列表