PyTorch nn 模块提供多种损失函数,适用于不同任务。选择合适的损失函数对模型训练至关重要。
二分类任务损失函数
| 损失函数 | 说明 | 配置 |
|---|
| BCELoss | 配合 Sigmoid 输出使用 | loss: "BCELoss" |
| BCEWithLogitsLoss | 内部包含 Sigmoid,可直接用于 logits | loss: "BCEWithLogitsLoss" |
| CrossEntropyLoss | 适用于多分类(one-hot 标签) | loss: "CrossEntropyLoss" |
推荐:
- 最后一层是 Sigmoid() → 使用 BCELoss
- 最后一层不加 Sigmoid() → 使用 BCEWithLogitsLoss(推荐)
其他任务损失函数
| 损失函数 | 适用情况 | 配置 |
|---|
| MSELoss | 回归任务,输出置信度/评分 | loss: "MSELoss" |
| L1Loss | 稀疏数据/稳健损失,异常检测 | loss: "L1Loss" |
| SmoothL1Loss | MSE + 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
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