张芷铭的个人博客

PyTorch nn 模块提供多种损失函数,适用于不同任务。选择合适的损失函数对模型训练至关重要。

二分类任务损失函数

损失函数说明配置
BCELoss配合 Sigmoid 输出使用loss: "BCELoss"
BCEWithLogitsLoss内部包含 Sigmoid,可直接用于 logitsloss: "BCEWithLogitsLoss"
CrossEntropyLoss适用于多分类(one-hot 标签)loss: "CrossEntropyLoss"

推荐:

  • 最后一层是 Sigmoid() → 使用 BCELoss
  • 最后一层不加 Sigmoid() → 使用 BCEWithLogitsLoss(推荐)

其他任务损失函数

损失函数适用情况配置
MSELoss回归任务,输出置信度/评分loss: "MSELoss"
L1Loss稀疏数据/稳健损失,异常检测loss: "L1Loss"
SmoothL1LossMSE + L1 结合,鲁棒回归loss: "SmoothL1Loss"
HingeEmbeddingLoss对比学习(-1/1 标签)loss: "HingeEmbeddingLoss"
CosineEmbeddingLoss度量学习,计算向量相似度loss: "CosineEmbeddingLoss"

选择指南

二分类任务

1
loss: "BCEWithLogitsLoss"  # 推荐

确保 MLPClassifier 最后一层去掉 Sigmoid():

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

回归/评分任务

1
loss: "MSELoss"

配置示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
- 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

动态加载

1
criterion = getattr(nn, config["loss"])()

可从配置文件动态选择损失函数,无需修改代码。

总结

任务类型推荐损失函数
二分类BCEWithLogitsLoss(去掉 Sigmoid)或 BCELoss(保留 Sigmoid)
回归/评分MSELoss / L1Loss
对比学习HingeEmbeddingLoss / CosineEmbeddingLoss

Comments