余弦退火重启动学习率机制
共 3055字,需浏览 7分钟
· 2021-09-28
余弦退火重启动学习率机制
【导语】主要介绍在pytorch 中实现了余弦退火重启动学习率机制,支持 warmup 和 resume 训练。并且支持自定义下降函数,实现多种重启动机制。
代码:https://github.com/Huangdebo/CAWB
1. 多 step 重启动
![](https://filescdn.proginn.com/f417543a0bf3b20d860af1c2f01f5a3a/21a0f9c0e85cfbb39c1060a4d0cd2388.webp)
设定 cawb_steps 之后,便可实现多步长余弦退火重启动学习率机制。每次重启动时,开始学习率会乘上一个比例因子 step_scale。调整 step_scale 和 epoch_scale 等参数,可以实现学习率跳变的时候是上升还是下降。也可以调整中间的 step 不用走完一个退火过程,保持较高的学习率,实现更复杂的学习率变化机制。
2. 正常余弦退火机制
![](https://filescdn.proginn.com/7422ffa9e7ea51bf7fed716daa97b14f/7a949c41cef000ef3e86839180ba74e7.webp)
如果 cawb_steps 为 [], 则会实现正常的余弦退火机制,在整个 epochs 中按设定的 lf 机制一直下降
3. warmup
![](https://filescdn.proginn.com/cd6f2a5262aee4a5da9e54817b1061ca/32ca65f2dac67034535a02e72bb955f9.webp)
设定 warmup_epoch 之后便可实现学习率的 warmup 机制。warmup_epoch 结束后则按设定的 cawb_steps 实现重启动退火机制。
4. resume
![](https://filescdn.proginn.com/973e92b12ee34140f384e051ce0a3485/793c359efb8089e0e8333b3bb4ea0caf.webp)
设定 last_epoch 便可实现 resume 训练,接上之前中断的训练中的学习率。
5. 自定义下降函数
![](https://filescdn.proginn.com/28fcdd51ac400dda724e6df13e48360f/6ba31d13ddafabca14fd0d5d3877905b.webp)
可通过自定义下降函数,实现多种重启动机制
# lf = lambda x, y=opt.epochs: (((1 + math.cos(x * math.pi / y)) / 2) ** 1.0) * 0.9 + 0.1
lf = lambda x, y=opt.epochs: (1.0 - (x / y)) * 0.8 + 0.2
scheduler = CosineAnnealingWarmbootingLR(optimizer, epochs=opt.epochs, step_scale=0.7,
steps=opt.cawb_steps, lf=lf, batchs=len(data), warmup_epoch=0)
6. 实验结果
本实验是在 COCO2017中随机选出 10000 图像和 1000 张图像分别作为训练集和验证集。检测网络使用 yolov5s,学习率调整机制分别原版的 cos 和 本文实现的 CAWB。
6.1 学习率:
# yolov5
lf = lambda x: ((1 - math.cos(x * math.pi / steps)) / 2) * (y2 - y1) + y1
scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=lf)
# 本文
lf = lambda x, y=opt.epochs: (((1 + math.cos(x * math.pi / y)) / 2) ** 1.0) * 0.65 + 0.35
scheduler = CosineAnnealingWarmbootingLR(optimizer, epochs=opt.epochs, steps=opt.cawb_steps, step_scale=0.7,
lf=lf, batchs=len(train_loader), warmup_epoch=3, epoch_scale=4.0)
![](https://filescdn.proginn.com/2d2e22a4ca01608df46b44c93267b573/ac2ae19fc8aae9b2a2007d9001a84c8b.webp)
6.2 map:
6.2.1 cos:
![](https://filescdn.proginn.com/ef29e7d859d01dcdd728f758e1e5a3b2/43ddd60cc8c974fc87320719f4c0b85a.webp)
mAP_0.5 = 0.294; mAP_0.5:0.95 = 0.161
6.2.2 CAWB :
![](https://filescdn.proginn.com/0672a724bd46a5820699655922242e29/e1e0ba30e71eed7518aa70835c377bb3.webp)
mAP_0.5 = 0.302; mAP_0.5:0.95 = 0.165
7. 结论
在实验中使用了 CAWB 学习率机制时候,mAP_0.5 和 mAP_0.5:0.95 都提升了一丢丢,而且上升趋势更加明显,增加 epochs 可能提升更大。
改变 CAWB 的参数可以实现更多形式的学习率变化机制。增加学习率突变就是想增加网络跳出局部最优的概率,所以不同数据集可能合适不同的变化机制。小伙伴们在其他数据集上尝试之后,记得来提个 issue 哈...
代码:https://github.com/Huangdebo/CAWB