完成验证循环后,先确认日志里的平均损失对应同一个目标,再用它比较模型或选择最佳快照。本节承接交叉熵输入与标签契约,重点检查换一种分批方式后,整份验证集的结果是否保持一致。
先累计分子与分母
把每批的 mean 再做一次普通平均,会让不足一批的尾批获得和完整批次相同的份量。正确的汇总方式取决于损失定义:先累计各批的损失分子和相应有效分母,最后相除。
对于类别索引目标、label_smoothing=0 的交叉熵,带权 mean 的分母是未被忽略目标命中的类别权重之和;没有类别权重时,才退化为有效目标数量。ignore_index 只适用于类别索引目标。概率目标分支按损失位置数量归一,不能直接套用索引目标的加权分母。CrossEntropyLoss 官方公式
已有索引标签与 one-hot 的加权 mean 对照解释了两种分母为什么不同。这里进一步检查把同一批固定预测拆成多个小批次时,验证循环怎样保住那个分母。
对像素或词元任务,一个“有效目标”可能是像素或词元,不能机械地除以图片数或句子数。这类似先汇总总金额和总笔数再求总体均值,但加权损失中的分母还可能是权重和。
练习一 换分批方式仍得到同一个总体均值
先用人工夹具 [1, 1, 1, 9] 检查记账逻辑:
| 分批 | 批内 mean | 直接平均批内 mean | 汇总分子再除总数 |
|---|---|---|---|
| 3 条加 1 条 | 1 和 9 | 5 | 12 / 4 = 3 |
| 4 条一批 | 3 | 3 | 12 / 4 = 3 |
这些数是手算夹具,不是模型成绩。接着准备固定 logits 和类别索引标签,设置 weight=None、label_smoothing=0,不更新模型,分别按 4 条一批与 3 条加 1 条计算。每批累计 reduction="sum",再除以总有效目标数;与整批 mean 在预设浮点容差内比较。记录每批原始条数、有效条数和尾批数量。
练习二 带权与忽略标签重新确定分母
固定类别权重 [1, 3]、类别索引目标 [0, 1, ignore_index],保持 label_smoothing=0。同一数据的 reduction="sum" 作为分子,非忽略目标的权重和作为分母,此时分母应为 1 + 3 = 4,不是原始条数 3,也不是有效条数 2。
改变分批方式,再与整批 mean 对照。另加“全部目标被忽略”的批次:将其记录为无有效目标,禁止给空分母强行填一个 0 损失,随后拿这个数比较模型优劣。整份验证集也没有有效目标时,应报告无法计算该指标。
需要留下的记录
保存损失类型、目标形式、权重、忽略值、每批分子、每批有效分母、总分子、总分母和浮点容差。验证使用固定预测;训练中模型参数持续变化时,各批损失并不来自同一个固定预测函数,不能拿来声称分批不变性。
以上两项为未运行的验收设计,不覆盖任意损失、分布式采样重复、混合精度或梯度累积。实际实现前按项目锁定版本复核。
来源与版本
PyTorch 2.14 CrossEntropyLoss,原资料核查于 2026-10-24 12:04–12:05 JST;本次于 2026-10-30 定向复核两种目标的归约公式与 ignore_index 说明。单页独立发布日期未标明。