【深度学习|学习笔记】神经网络中有哪些损失函数?(二)

【深度学习|学习笔记】神经网络中有哪些损失函数?(二)



欢迎铁子们点赞、关注、收藏!
祝大家逢考必过!逢投必中!上岸上岸上岸!upupup

大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文。详细信息可扫描博文下方二维码 “学术会议小灵通”或参考学术信息专栏:https://blog.csdn.net/2401_89898861/article/details/148877490


前言

  • 下面给出一份**“神经网络损失函数全景图 + 可直接复用的 PyTorch 代码库**(Loss Zoo)”。
  • 按机器学习范式把常用且实战高频的损失分门别类,并给出可以贴进你项目里的实现骨架(均为纯 PyTorch,无外部依赖)

注:“所有”在理论上不可能穷尽,但下列覆盖了监督/自监督/生成/度量学习/排序/分割/时序/不确定性/RL 等主流场景中研究与工业最常用的损失与代表性变体

三、怎么选?——任务到损失的快速映射

  • 回归:稳健性优先 → Huber/Charbonnier;分位数/Pinball 适合上下分位预报;不确定性 → Heteroscedastic NLL。
  • 单标签分类:CE + Label Smoothing 起步;长尾/困难 → Focal;更可解释的边距 → ArcFace/AM-Softmax(嵌入检索友好)。
  • 多标签:BCEWithLogits 基线;负样本爆炸/极不平衡 → ASL。
  • 分割:小目标/不均衡 → Dice / Tversky / Focal-Tversky;mIoU 相关 → Jaccard/Lovász(需排序实现,可用三方包)。
  • 检索/度量:NT-Xent/SupCon(批内对比) > Triplet(依赖采样);类内紧凑可叠加 Center。
  • 推荐/排序:两两对比 → BPR / Pairwise Hinge;如需对 NDCG 对齐选 LambdaRank 族(实现较长)。
  • 生成:VAE → ELBO(重建+KL);GAN → BCE/Hinge/WGAN-GP;扩散 → ε/v MSE。
  • 自监督表征:NT-Xent(通用)、Barlow Twins/VICReg(冗余抑制,无需负样本)。
  • 序列/语音:CTC(对齐未知),或自回归 CE;可配 Label Smoothing / KD。
  • RL:策略 → PPO clip;价值 → MSE/Huber;加 Entropy 鼓励探索。

四、组合与权重:多任务/多项损失

  • 线性加权:L = Σ λ_k L_k;权重可网格/自适应(不确定性权重、GradNorm、DWA)。
  • 层级式:主损失(CE/MSE)+ 辅助(Dice/Center/Consistency/Reg)以小权重稳定训练。
  • 与评价指标对齐:检测/分割中,使用 IoU/Dice/Tversky 类 更贴近目标;排序用 BPR/LambdaRank 更贴近
    NDCG。

五、数值与工程注意点

多标签一定用 BCEWithLogits,不要先 sigmoid 再 BCE(避免数值不稳)。

  • 类别权重:长尾时给 CE/Focal 传 weight 或用“有效样本数”做类平衡。
  • Dice/IoU:训练用软版本(基于概率),评估再用阈值化。
  • 对比学习:确保大 batch 或队列以提高负样本质量;特征L2 归一化。
  • ArcFace:特征与权值均需 L2 norm → cosθ,再加角度间隔与尺度 。
  • GAN/WGAN-GP:判别器更新多步、注意梯度惩罚的稳定性;生成器损失与判别器不同。
  • 异方差 NLL:预测 log_var 更稳定;对极端值可裁剪。
  • PPO:别忘了熵正则与优势函数标准化,以及 old/new log-prob 缓存管理。

六、最小可运行示例:分类 + Label Smoothing + Focal(可切换)

import torch, torch.nn as nn, torch.nn.functional as F
from torch.utils.data import TensorDataset, DataLoader

# 假数据
X = torch.randn(1024, 20)
w = torch.randn(20, 5); y = (X @ w).argmax(dim=1)  # 5 类
ds = TensorDataset(X, y); dl = DataLoader(ds, batch_size=64, shuffle=True)

# 简单 MLP
model = nn.Sequential(nn.Linear(20, 64), nn.ReLU(), nn.Linear(64, 5))
opt = torch.optim.AdamW(model.parameters(), lr=3e-3)

# 换一行即可切换损失
crit = LabelSmoothingCE(eps=0.1)
# crit = FocalLoss(gamma=2.0)

for epoch in range(20):
    model.train()
    for xb, yb in dl:
        logits = model(xb)
        loss = crit(logits, yb)
        opt.zero_grad(); loss.backward(); opt.step()
    with torch.no_grad():
        pred = model(X).argmax(1)
        acc = (pred == y).float().mean().item()
    print(f"epoch {epoch+1}: loss={loss.item():.4f}, acc={acc:.3f}")

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐