深度学习之学习率优化


作者Lou Xiao创建时间2021-09-06 20:19:00更新时间2021-09-06 20:50:00

神经网络的调参的一个不可忽略的技巧/工具就是 学习率调节器(又名:退火算法)。
退火思想(概念)借鉴自钢铁的铸造过程:钢水浇筑的铸件从1064℃冷却到室温(20℃)的过程。冷却过程极大影响了钢制铸件的品质。
深度学习常用的调节学习率的算法:有常见的这几种,具体使用还要结合论文和具体模型,从实践中总结经验。

1. CosineAnnealingLR

1.1 重要参数

参数说明
max_lrmax_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

CosineAnnealingLR

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_lrmax_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
CosineAnnealingWarmRestarts

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
OneCycleLR

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

  1. epoch 0~20 这段,学习率慢慢增加,Loss快速下降;
  2. epoch 20~50 这段,学习率处于最大值,Loss剧烈波动;
  3. epoch 50~100这段,学习率慢慢降低(退火),Loss波动趋于平滑。

实验结果

文章目录