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

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 = η m i n i + 1 2 ( η m a x i − η m i n i ) ( 1 + c o s T c u r T i π ) \eta_t = \eta_{min}^{i}+\frac{1}{2}( \eta_{max}^{i}- \eta_{min}^{i})(1+cos\frac{T_{cur}}{T_i}\pi) ηt=ηmini+21(ηmaxiηmini)(1+cosTiTcurπ)

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

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

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

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 = η m i n + ( η m a x − η m i n ) 1 + c o s T c u r + 1 T m a x π 1 + c o s T c u r T m a x π , T c u r = ( 2 k + 1 ) T m a x \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=ηmin+(ηmaxηmin)1+cosTmaxTcurπ1+cosTmaxTcur+1πTcur=(2k+1)Tmax
η t + 1 = η t + ( η m a x − η m i n ) 1 − c o s 1 T m a x π 2 , T c u r = ( 2 k + 1 ) T m a x \eta_{t+1} = \eta_{t}+( \eta_{max}- \eta_{min})\frac{1-cos\frac{1}{T_{max}}\pi}{2},T_{cur}=(2k+1)T_{max} ηt+1=ηt+(ηmaxηmin)21cosTmax1πTcur=(2k+1)Tmax

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

你可能感兴趣的:(deep,learning,torch,python,pytorch,学习率,调参,CosineAnnealing,深度学习)