深度学习之学习率优化
作者Lou Xiao创建时间2021-09-06 20:19:00更新时间2021-09-06 20:50:00
神经网络的调参的一个不可忽略的技巧/工具就是 学习率调节器(又名:退火算法)。
退火思想(概念)借鉴自钢铁的铸造过程:钢水浇筑的铸件从1064℃冷却到室温(20℃)的过程。冷却过程极大影响了钢制铸件的品质。
深度学习常用的调节学习率的算法:有常见的这几种,具体使用还要结合论文和具体模型,从实践中总结经验。
1. CosineAnnealingLR
1.1 重要参数
参数 | 说明 |
---|---|
max_lr | max_lr=0.001(示例数值),最大的学习率;最小学习率是0 |
iter_count | 训练的总迭代次数(总共训练多少batch) |
学习率按照余弦曲线从最大的学习率(max_lr)减小为0。迭代次数 iter_count = epoch_count * train_dataset_size
1.2 变化曲线
图中,迭代次数iter_count=1000, max_lr=init_lr=0.001
1.3 实例代码
1.双击鼠标左键复制此行;2.单击复制所有代码。
1
import torch.nn as nn
2
import torch.optim as optim
3
from torch.optim.lr_scheduler import CosineAnnealingLR
4
5
max_lr = 0.001
6
iter_count = 1000
7
8
model = nn.Linear(4, 4)
9
optimizer = optim.Adam(model.parameters(), lr=max_lr)
10
scheduler = CosineAnnealingLR(optimizer, iter_count)
11
12
for i in range(iter_count):
13
optimizer.zero_grad()
14
# forward && backward
15
optimizer.step()
16
scheduler.step()
2. CosineAnnealingWarmRestarts
反复加热-冷却...
2.1 重要参数
参数 | 说明 |
---|---|
max_lr | max_lr=0.001(示例数值),每个周期,最大的学习率;最小学习率是0。 |
iter_count_per_cycle | 重启周期,每个周期:学习率从0逐步增加到最大学习率(max_lr) |
iter_count | 训练的总迭代次数(总共训练多少batch) |
2.2 变化曲线
图中,迭代总次数iter_count=1000, max_lr=0.001, iter_count_per_cycle=300
2.3 实例代码
1.双击鼠标左键复制此行;2.单击复制所有代码。
1
import torch.nn as nn
2
import torch.optim as optim
3
from torch.optim.lr_scheduler import CosineAnnealingWarmRestarts
4
5
max_lr = 0.001
6
iter_count = 1000
7
iter_count_per_cycle = 300
8
9
model = nn.Linear(4, 4)
10
optimizer = optim.Adam(model.parameters(), lr=max_lr)
11
scheduler = CosineAnnealingWarmRestarts(optimizer, T_0=iter_count_per_cycle)
12
13
for i in range(iter_count):
14
optimizer.zero_grad()
15
# forward && backward
16
optimizer.step()
17
scheduler.step()
3. OneCycleLR
3.1 重要信息
参数 | 说明 |
---|---|
max_lr | 训练过程中最大的学习率 |
init_lr | 开始训练的学习率,默认=max_lr/25 |
final_lr | 训练结束是学习率,默认=max_lr/10000 |
iter_count | 整个训练过程的总共迭代次数 |
3.2 变化曲线
图中,迭代总次数iter_count=1000, max_lr=0.001
3.3 实例代码
1.双击鼠标左键复制此行;2.单击复制所有代码。
1
import torch.nn as nn
2
import torch.optim as optim
3
from torch.optim.lr_scheduler import OneCycleLR
4
5
max_lr = 0.001
6
iter_count = 1000
7
8
model = nn.Linear(4, 4)
9
optimizer = optim.Adam(model.parameters(), lr=max_lr)
10
scheduler = OneCycleLR(optimizer, max_lr=max_lr, total_steps=iter_count)
11
12
for i in range(iter_count):
13
optimizer.zero_grad()
14
# forward && backward
15
optimizer.step()
16
scheduler.step()
4. 实验结果
从图中可以看出: epoch_count=100; 当epoch=30时,学习率lr = max_lr = 0.01
- epoch 0~20 这段,学习率慢慢增加,Loss快速下降;
- epoch 20~50 这段,学习率处于最大值,Loss剧烈波动;
- epoch 50~100这段,学习率慢慢降低(退火),Loss波动趋于平滑。
文章目录