【深度学习技巧】学习率-余弦退火

文章目录

  • 1. 理解
    • 1.1. Warm up
    • 1.2 Cosine Anneal
    • 1.3 余弦退火结合
  • 2. 代码
  • 3. 学习率的总结
  • 4. 参考

1. 理解

1.1. Warm up

由于一开始参数不稳定,梯度较大,如果此时学习率设置过大可能导致数值不稳定。使用warm up有助于减缓模型在初始阶段对mini-batch的提前过拟合现象,保持分布的平稳,其次也有助于保持模型深层的稳定性。

1.2 Cosine Anneal

梯度下降算法优化目标函数,使得loss值接近全局最小值,学习率应当变得更小,才能够使其更加容易实现。余弦退火首先使得学习率先缓慢下降,然后再快速下降,可以满足上面的需求。
公式如下:
在这里插入图片描述
其中,ηmax为学习率最大值,ηmin为最小值,Tcur为当前轮次,Tmax为半个周期。

1.3 余弦退火结合

其示意图如下所示:
【深度学习技巧】学习率-余弦退火_第1张图片

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

你可能感兴趣的:(学习,python,深度学习)