1. 理解
1.1. Warm up
由于一开始参数不稳定,梯度较大,如果此时学习率设置过大可能导致数值不稳定。使用warm up有助于减缓模型在初始阶段对mini-batch的提前过拟合现象,保持分布的平稳,其次也有助于保持模型深层的稳定性。
1.2 Cosine Anneal
梯度下降算法优化目标函数,使得loss值接近全局最小值,学习率应当变得更小,才能够使其更加容易实现。余弦退火首先使得学习率先缓慢下降,然后再快速下降,可以满足上面的需求。
公式如下:
其中,ηmax为学习率最大值,ηmin为最小值,Tcur为当前轮次,Tmax为半个周期。
1.3 余弦退火结合
其示意图如下所示:
2. 代码
import math
import torch
from math import cos, pi
def warmup_cosine(optimizer, current_epoch, max_epoch, lr_min=0, lr_max=0.1, warmup_epoch = 10):
if current_epoch < warmup_epoch:
lr = lr_max * current_epoch / warmup_epoch
else:
lr = lr = lr_min + (lr_max-lr_min)*(1 + cos(pi * (current_epoch - warmup_epoch) / (max_epoch - warmup_epoch))) / 2
for param_group in optimizer.param_groups:
param_group["lr"] = lr
# 学习率的设置
lr_max = 0.01
lr_min = 0.0001
max_epoch = 1000
warmup_epoch = 250
for epoch in range(max_epoch):
#训练
warmup_cosine(optimizer=optimizer,current_epoch=epoch, max_epoch=max_epoch, lr_min=lr_min,lr_max=lr_max, warmup_epoch = warmup_epoch)
print(optimizer.param_groups[0]['lr'])
cnt = 0
losssum = 0
model.train()
for image, label, label_p in tqdm(dataloader):
optimizer.zero_grad()
image, label, label_p = image.to(device).float(), label.to(device), label_p.to(device)
out = model(image) # torch.Size([10, 2, 2])
#计算loss
loss = mse(out, label_p) # label_p : torch.Size([10, 2, 2]) batchsize 10
loss.backward()
optimizer.step()
3. 学习率的总结
https://blog.csdn.net/qq_35091353/article/details/117322293
4. 参考
https://blog.csdn.net/qq_40268672/article/details/121145630
https://cloud.tencent.com/developer/article/1749002