余弦退火+周期性重启+warm-up
一、概念
余弦退货:
学习率预热warm-up:开始训练时,使用一个较小的学习率。
- 权重初始化是随机的,若一开始使用一个较大的学习率,可能带来模型的不稳定。
import numpy as np
import matplotlib.pyplot as pltdef lr_schedule_cosine(lr_min, lr_max, per_epochs):
def compute(epoch):
return lr_min + 0.5 * (lr_max - lr_min) * (1 + np.cos(epoch / per_epochs * np.pi))
return compute# 余弦退火策略
draw_x = np.arange(300)
draw_y1 = list(map(lr_schedule_cosine(1e-4, 1e-1, 300), draw_x))
draw_y2 = list(map(lr_schedule_cosine(1e-4, 1e-1, 150), draw_x))
plt.subplot(121), plt.plot(draw_x, draw_y1, "b-")
plt.subplot(122), plt.plot(draw_x, draw_y2, "r-")
plt.show()# 周期性重启
draw_x = np.arange(300)
draw_y = list(map(lr_schedule_cosine(1e-4, 1e-1, 100), draw_x % 100))
plt.plot(draw_x, draw_y, "b-")
plt.show()# 学习率预热warm-up:初始训练时,使用一个较小的学习率
# 这是一个简单的warm-up策略,你可以进一步优化
lr_warm_up_alpha = 1e-2# 学习率的初始warm-up系数
lr_warm_up_schedule = {# warm-up策略
5: 3e-2,# epoch=5时,系数为0.03
10: 1e-1,# epoch=10时,系数为0.1
15: 3e-1,# epoch=15时,系数为0.3
20: 1# epoch=20时,回归cosine,所以系数为1
}
def get_lr(epoch):
global lr_warm_up_alpha
if epoch in lr_warm_up_schedule:
lr_warm_up_alpha = lr_warm_up_schedule[epoch]
lr_select = lr_schedule_cosine(1e-4, 1e-1, 100)(epoch % 100)
return lr_select * lr_warm_up_alpha
draw_x = np.arange(300)
draw_y = list(map(get_lr, draw_x))
plt.plot(draw_x, draw_y, "b-")
plt.show()
【余弦退火+周期性重启+warm-up】可视化结果:
![余弦退火+周期性重启+warm-up](https://img.it610.com/image/info10/5f95118158b34257b507bfca7106559b.jpg)
文章图片
推荐阅读
- 向量余弦夹角
- VMD/NAMD命令/规则
- 智能优化算法(模拟退火、遗传、差分进化算法)笔记
- 如何使用Java模拟退火算法优化Hash函数
- Python数学建模学习模拟退火算法旅行商问题示例解析
- Python数学建模学习模拟退火算法约束条件处理示例解析
- 算法|模拟退火(SA)算法实例介绍(java)
- 新程序员|对话图灵奖得主Jeffrey Ullman(数据库不会进入周期性的坏循环|《新程序员》)
- 新程序员|邹欣对话图灵奖得主Jeffrey Ullman(数据库不会进入周期性的坏循环 |《新程序员》)
- 用周期性的眼光看世界