欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PyTorch torch.optim.lr_scheduler 学习率设置 调参 -- CosineAnnealingLR

程序员文章站 2024-03-22 16:09:58
...

lr_scheduler 学习率

学习率的参数调整是深度学习中一个非常重要的一项,Andrew NG(吴恩达)认为一般如果想调参数,第一个一般就是学习率。作者初步学习者,有错误直接提出,热烈欢迎,共同学习。(感谢Andrew ng的机器学习和深度学习的入门教程)

PyTorch学习率调整策略通过torch.optim.lr_scheduler接口实现。PyTorch提供的学习率调整策略分为三大类,分别是

  1. 有序调整:等间隔调整(Step),按需调整学习率(MultiStep),指数衰减调整(Exponential)和 余弦退火CosineAnnealing。
  2. 自适应调整:自适应调整学习率 ReduceLROnPlateau。
  3. 自定义调整:自定义调整学习率 LambdaLR。
    引用: PyTorch学习之六个学习率调整策略

CosineAnnealingLR 余弦退火调整学习率

相关知识

该方法是出自论文2017 International Conference on Learning Representations (ICLR)上的,论文《SGDR: Stochastic Gradient Descent
Warm Restarts》,作者提供了源码:https://github.com/loshchil/SGDR

作者:Ilya Loshchilov & Frank Hutter;Research Scientist at AAD group with Frank Hutter. Freiburg, Germany.

论文内容

其实它的权重衰减的公式为:
ηt=ηmini+12(ηmaxiηmini)(1+cosTcurTiπ) \eta_t = \eta_{min}^{i}+\frac{1}{2}( \eta_{max}^{i}- \eta_{min}^{i})(1+cos\frac{T_{cur}}{T_i}\pi)

参数 含义
ηmini \eta_{min}^{i} 学习率最小值
ηmaxi \eta_{max}^{i} 学习率的最大值
Tcur T_{cur} 是从last_start开始后已经记录了多少个epoch
Ti T_{i} 是固定的数;一旦Tcur=Ti T_{cur} = T_{i} 代表cos为-1;因此ηt=ηmini \eta_t=\eta_{min}^{i} Ti=50orTi=100orTi=200 T_{i} = 50 or T_{i} = 100 or T_{i} =200

瞅瞅不同参数下的学习率的衰减变化:

PyTorch torch.optim.lr_scheduler 学习率设置 调参 -- CosineAnnealingLR
诶哟吗!这个乱的,可以发现根据自己不同需求设置T_i(也就是torch函数中的T_max);T_mult
PyTorch torch.optim.lr_scheduler 学习率设置 调参 -- CosineAnnealingLR
瞅瞅,最后一个三角形粉色的,拟合的多快。

TORCH 使用

以余弦函数为周期,并在每个周期最大值时重新设置学习率。以初始学习率为最大学习率,以 2∗Tmax2*Tmax2∗Tmax 为周期,在一个周期内先下降,后上升。

torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)

参数:

参数 含义
T_max(int) 一次学习率周期的迭代次数,即 T_max 个 epoch 之后重新设置学习率。
eta_min(float) 最小学习率,即在一个周期中,学习率最小会下降到 eta_min,默认值为 0。
last_epoch 最后一个EPOCH 默认-1,可不设置

OK,可以发现参数名字变了,其实就变成了:


ηt+1=ηmin+(ηmaxηmin)1+cosTcur+1Tmaxπ1+cosTcurTmaxπTcur=(2k+1)Tmax \eta_{t+1} = \eta_{min}+( \eta_{max}- \eta_{min})\frac{1+cos\frac{T_{cur+1}}{T_{max}}\pi}{1+cos\frac{T_{cur}}{T_{max}}\pi},T_{cur}=(2k+1)T_{max}
ηt+1=ηt+(ηmaxηmin)1cos1Tmaxπ2Tcur=(2k+1)Tmax \eta_{t+1} = \eta_{t}+( \eta_{max}- \eta_{min})\frac{1-cos\frac{1}{T_{max}}\pi}{2},T_{cur}=(2k+1)T_{max}

η _max就是初始设置的LR,T_cur是从last epoch的经历的epoch数。这玩意,就是没走一步都会更新lr。