张芷铭的个人博客

损失函数

在 PyTorch 中,nn 提供了多种损失函数 (criterion),用于不同的任务。对于 二分类任务(binary classification),合适的损失函数包括:

1. 适用于二分类任务

损失函数 说明 YAML 配置

BCELoss 适用于二分类任务,配合 Sigmoid 输出使用 loss: “BCELoss”

BCEWithLogitsLoss 适用于二分类,内部包含 Sigmoid,可直接用于 logits 输出 loss: “BCEWithLogitsLoss”

CrossEntropyLoss 适用于多分类任务(如 [0,1] one-hot 标签) loss: “CrossEntropyLoss”

💡 推荐

• 如果 MLPClassifier 的最后一层是 Sigmoid(),请使用 BCELoss。

• 如果最后一层 不加 Sigmoid(),请改用 BCEWithLogitsLoss(推荐)。

• CrossEntropyLoss 适用于 多分类任务(比如 [0, 1] 的 one-hot 编码)。

2. 适用于其他任务(扩展用)

损失函数 适用情况 YAML 配置

MSELoss 适用于回归任务,如输出 置信度/评分 loss: “MSELoss”

L1Loss 适用于 稀疏数据/稳健损失,如 异常检测 loss: “L1Loss”

SmoothL1Loss MSELoss + L1Loss 结合,适用于鲁棒回归 loss: “SmoothL1Loss”

HingeEmbeddingLoss 适用于对比学习(-1/1 标签) loss: “HingeEmbeddingLoss”

CosineEmbeddingLoss 适用于度量学习,计算向量相似度 loss: “CosineEmbeddingLoss”

3. 如何选择?

✅ 推荐 BCEWithLogitsLoss

loss: “BCEWithLogitsLoss”

确保 MLPClassifier 的最后一层去掉 Sigmoid(),改为:

layers.append(nn.Linear(hidden_sizes[-1], 1))  # 直接输出 logits

✅ 使用 BCELoss

loss: “BCELoss”

确保 MLPClassifier 最后一层是 Sigmoid():

layers.append(nn.Linear(hidden_sizes[-1], 1))

layers.append(nn.Sigmoid())

✅ 适用于置信度评分/回归

loss: “MSELoss”

• 适用于 模型输出回归值,如视频质量评分任务。

4. config.yaml 示例

  • name: “mlp_bce”

  batch_size: 32

  epochs: 50

  lr: 1e-4

  hidden_sizes: [2048, 512, 128]

  dropout: 0.3

  optimizer: “Adam”

  loss: “BCEWithLogitsLoss”  # 推荐

  save_interval: 5

  • name: “mlp_mse”

  batch_size: 16

  epochs: 30

  lr: 5e-5

  hidden_sizes: [1024, 256, 64]

  dropout: 0.2

  optimizer: “SGD”

  loss: “MSELoss”  # 适用于回归

  save_interval: 10

5. 代码如何处理损失函数?

criterion = getattr(nn, config[“loss”])()

可以从 config.yaml 动态选择 loss,无需手动改代码。

总结

二分类任务

• ✅ 推荐 BCEWithLogitsLoss(去掉 Sigmoid())

• ✅ 也可用 BCELoss(保留 Sigmoid())

回归/评分

• ✅ MSELoss / L1Loss

对比学习

• ✅ HingeEmbeddingLoss / CosineEmbeddingLoss

这样,你的 train.py 代码可以兼容多个任务,变得更灵活!🚀

💬 评论