张芷铭的个人博客

MLP 训练效果取决于超参数配置:学习率、批量大小、优化器、正则化策略缺一不可。

学习率(lr)

学习率决定参数更新步长:

学习率范围问题
> 1e-2训练不稳定,损失震荡
< 1e-6收敛极慢,易陷入局部最优

推荐范围

任务类型学习率
小规模数据集(<10w)1e-3 ~ 5e-3
大规模数据集(>10w)1e-4 ~ 1e-3
预训练模型微调1e-5 ~ 5e-5

默认从 1e-3 开始,配合学习率调度器:

1
2
3
scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(
    optimizer, mode='min', factor=0.5, patience=5
)

批量大小(batch_size)

批量大小影响
≤16梯度噪声大,训练不稳定
≥256收敛慢,需更高学习率

推荐:默认 3264,GPU 资源充足时可增至 128256。

优化器

优化器适用场景推荐
SGD简单任务,需手动调参
SGD + momentum小批量训练
Adam大多数任务,训练稳定✅✅
AdamWTransformer 结构,带权重衰减✅✅
RMSpropRNN 任务

默认选择 AdamAdamW

损失函数

任务类型推荐损失函数
二分类BCELoss
多分类CrossEntropyLoss
回归MSELoss
置信度估计HuberLoss

正则化

Dropout

  • 默认 0.2~0.5
  • 层数少(<3):0.1~0.2
  • 层数多:0.3~0.5

权重衰减(L2 正则)

防止权重过大,推荐 1e-5 ~ 1e-4,配合 AdamW 效果更佳。

BatchNorm

防止梯度消失,加速收敛。通常置于 ReLU 之前:

1
2
3
4
5
6
nn.Sequential(
    nn.Linear(512, 256),
    nn.BatchNorm1d(256),
    nn.ReLU(),
    nn.Dropout(0.3)
)

训练周期(epochs)

推荐 50~200 轮,配合 Early Stopping:

1
2
from torch.optim.lr_scheduler import ReduceLROnPlateau
early_stopping = EarlyStopping(patience=10, delta=0.001)

训练监控

使用 W&B 记录关键指标:

1
2
3
4
5
6
7
wandb.log({
    "Train Loss": train_loss,
    "Train Accuracy": train_accuracy,
    "Test Loss": test_loss,
    "Test Accuracy": test_accuracy,
    "Learning Rate": optimizer.param_groups[0]["lr"]
})

观察:学习率曲线、Train/Test Loss 对比、Test Accuracy 变化。

参考配置

1
2
3
4
5
6
7
8
batch_size: 64
epochs: 100
lr: 1e-3
hidden_sizes: [512, 256, 128, 32]
dropout: 0.3
optimizer: "AdamW"
loss: "BCELoss"
weight_decay: 1e-4

常见问题排查

现象原因解决方案
训练损失不降lr 过大/过小调整至 1e-3 ~ 1e-4
训练降测试升过拟合增加 Dropout,加大 weight_decay
训练慢效果一般模型太小增加隐藏层
训练快效果差模型太大降低层数
后期效果变差过训练加入 Early Stopping

总结

  • lr=1e-3 ~ 1e-4,稳定训练
  • batch_size=32~128,小数据用小批量
  • AdamW + weight_decay=1e-4,防止过拟合
  • Dropout=0.2~0.5,层数多时增加
  • BatchNorm 防止梯度消失
  • Early Stopping + ReduceLROnPlateau 自动调节

Comments