在最小分类训练循环之后,先把任务的标签含义写清楚,再选择损失。FashionMNIST 等互斥单标签任务继续沿用原来的分类主线;本节用虚构商户标签说明允许多个答案同时成立的任务。
单个类别与多个标签是两份契约
互斥分类中,每个样本只有一个真实类别。普通二维批次可用 logits [N,C] 和 long 类别索引 [N] 调用 CrossEntropyLoss。软标签是另一种表示,但每行仍应是一份合法的类别概率分布。交叉熵输入说明
多标签分类允许同一样本的多个标签同时成立。例如“有停车位/可外带/可预约”的标签 [1,1,0],前两个条件都应保留。可将各输出定义为逐标签二元预测,使用 BCEWithLogitsLoss;普通二维批次的 logits 与浮点目标均为 [N,C],硬标签取 0 或 1。每行无需和为 1,不应使用 argmax 压成一个标签。BCEWithLogitsLoss
这类似单个枚举字段与标签集合的区别,但后端字段校验不能代替概率目标和梯度计算。逐标签损失也不证明现实中的标签在统计上独立。
把原始分数交给融合损失
BCEWithLogitsLoss 将 sigmoid 与二元交叉熵结合计算,使用稳定形式处理原始分数。训练时直接传 logits;先 sigmoid 一次再传给它,会把概率误当作新的 logits。数值稳定性与目标范围
接口允许 0 到 1 的连续目标,也不意味着缺失标签、未知标签或越界数值都能当成可靠监督。标签顺序、缺失值含义和训练目标必须由数据契约确定。
练习一 保留同一样本的多个正标签
建立一份小数据,至少包含标签 [1,1,0],保存三个标签的固定顺序。训练前检查:
- logits 与目标是否都为
[N,C],目标是否为浮点类型。 - 每个目标是否位于约定范围;错形状和越界值应由入口校验明确拒绝。
- 同一样本的两个正标签是否都保留。解释将其变成
argmax=0后丢掉了哪条监督信息。 - 未知标签是否有独立处理规则,不能因张量需要数字就随意填 0。
这些是应用层应实现的检查,不声称库会自动替你完成全部语义校验。
练习二 极端 logits 的有限值检查
用固定 float32 logits -100 与 100,分别配 0、1 目标。检查融合损失及反向梯度是否均为有限值,再与手写 sigmoid 后取 log 的朴素公式对照,保存实际结果。
正确且十分确定的预测可能出现极小或为零的数值梯度;本项要求有限值,不要求梯度一定非零。对照应保持同一输入与目标,不能把“先 sigmoid 再传融合损失”的错误路径当成等价实现。
适用范围与来源
本节补任务语义与损失匹配,前置可阅读既有交叉熵入口验收。阈值、校准、缺失标签屏蔽、权重和跨批汇总分别需要自己的验收。
两项练习均未运行,不代表训练效果。来源为 PyTorch 2.14 BCEWithLogitsLoss 与 CrossEntropyLoss。原核查为 2026-10-24 18:10 JST;本次 2026-10-30 复核输入、目标和稳定计算相关段落,独立发布日期未标明。