损失函数

内容与边界

本页是对所列一手资料的原创中文摘要和公式整理,不复制第三方教程正文。损失函数给优化器一个训练信号,不直接等同于 accuracy、F1、校准、业务成本或上线安全;这些必须在验证/测试和错误分析中另行检查。

关联笔记

先由任务和输出决定 loss

任务模型输出标签契约常见 PyTorch 接口最常见误用
单标签多分类每类一个原始 logit,形状常为 [N, C]每个样本一个类别索引,常为 long 的 [N]CrossEntropyLoss先做 softmax,或把多标签当作单标签
二分类 / 多标签分类每个目标一个原始 logit与输出同形状、取值在 [0, 1] 的浮点标签BCEWithLogitsLoss先做 sigmoid 后又传给 BCEWithLogitsLoss
回归连续预测值与预测对齐的连续目标MSELoss 等把平方误差当作唯一业务代价

logit 是 softmax/sigmoid 之前的原始分数。先明确“一个样本可以有几个真标签”和输出形状,再选 loss;不要只因为名字里有“交叉熵”就照搬。

单标签多分类:交叉熵

设第 个样本的 logits 为 ,真实类别索引为 。未加权、按样本平均的交叉熵可写为:

在 PyTorch 中,CrossEntropyLoss 接收 logits,内部等价于 LogSoftmax 加 NLLLoss;因此通常不要先对输入 softmax。它也接受软标签/类别概率形式,但调用方必须保证每行确实是合法概率分布,框架不会替你验证所有约束。weight、ignore_index、label_smoothing 和 reduction 会改变优化目标或聚合方式,比较实验时必须记录它们。

import torch.nn as nn
 
criterion = nn.CrossEntropyLoss()
loss = criterion(logits, class_index_targets)  # logits: [N, C];targets: [N]

二分类与多标签:BCE with logits

对一个原始 logit 和标签 ,二元交叉熵为:

其中 是 sigmoid。BCEWithLogitsLoss 将 sigmoid 与损失合并,以更稳定的数值形式计算;不要把已经 sigmoid 的概率再传给它。对于多标签问题,每个类别独立计算这一项,多个类别可同时为正,和单标签多分类的“每行只选一个类别”不同。

pos_weight 能改变正例相对训练权重,并可能改变 precision/recall 取舍;它不能自动确定部署阈值、校准概率或修复标签偏差。阈值、校准和每类指标仍应在验证边界内选择和检查。

回归:MSE 只是一个明确的起点

均方误差的未加权平均是:

平方会放大大误差:这在大偏差确实更昂贵时可能合适,但也会让离群值主导训练。选择 MAE、Huber 或其他目标前,应先说明误差代价、目标单位、缺失值处理和报告指标;训练 loss 与交付时的 MAE、RMSE 或业务损失可以不同,但这种差异必须有理由并在验证集上确认。

对比损失不是一条通用公式

“contrastive loss”覆盖许多用于度量学习、检索和表示对齐的目标。不同论文和库对相似/不相似标签、距离/相似度、margin、温度、采样策略与 batch 聚合的定义不同。不要把任意单一写法当作通用接口;使用前应以所选论文和实现的输入形状、标签约定与单元测试为准,并按实体/文档/时间划分评测集,避免近重复泄漏带来虚假的检索提升。

选择与验证清单

  1. 先写清任务、模型输出、标签类型、reduction 和类别/样本权重。
  2. 用训练区拟合;用验证区选择 loss 变体、权重和阈值;封存测试集只做最终估计。
  3. 同时报告与决策有关的指标、每类 support、校准/阈值边界和错误样本。训练 loss 降低并不证明 F1、成本或安全风险同步改善。
  4. 对受影响人群或高风险操作,结合数据代表性、访问/隐私边界、人工复核和申诉/纠错流程审查;单个 loss 或单个群体指标都不能给出完整公平性结论。

参考资料

核验日期:2026-07-22。接口语义和默认值会随框架版本变化;运行前以正在使用的版本文档为准。