学习率(Learning Rate)确定方法详解
一、学习率核心作用与问题
问题 | 现象 | 解决方法 |
---|---|---|
学习率过大 | 损失剧烈震荡或爆炸性增长 | 降低学习率(如从1e-3→1e-4) |
学习率过小 | 损失下降缓慢甚至停滞 | 增大学习率(如从1e-5→1e-3) |
学习率不匹配优化器 | 某些优化器需特定范围(如Adam) | 参考优化器推荐值 |
二、基础确定方法
1. 经验初始值法
- 常用基准值(需根据任务调整):
# 不同优化器的典型初始学习率 optimizer = { "SGD": 0.01, # 适用于简单任务 "Adam": 0.001, # 大多数任务的默认选择 "RMSprop": 0.0001 # 适用于RNN/时序数据 }
2. 网格搜索(Grid Search)
- 在小范围内测试多个候选值(如
[1e-5, 1e-4, 1e-3]
),选择损失下降最快的值。 - 代码示例:
for lr in [1e-5, 3e-5, 1e-4, 3e-4, 1e-3]: optimizer = torch.optim.Adam(model.parameters(), lr=lr) # 训练并记录验证集损失
三、高级动态调整策略
1. 学习率范围测试(LR Range Test)
- 方法:从极小值(如
1e-7
)逐步增大学习率,观察损失变化曲线,选择损失下降最快的区域。 - PyTorch实现(需安装
torch-lr-finder
):from torch_lr_finder import LRFinder criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=1e-7) lr_finder = LRFinder(model, optimizer, criterion, device="cuda") lr_finder.range_test(train_loader, end_lr=10, num_iter=100