「解析」CosineLRScheduler 调度器

在深度学习的训练过程中,需要配置一些超参数,但是在配置的过程中,往往需要根据经验来设置,这对缺乏经验的小白十分不友好,因此就有了动态调整学习率的算法,统称为 LRScheduler 学习率调度器。在此推荐一种十分受欢迎的 调度器 即:CosineLRScheduler。

⚠️注意:在论文中,这个调度器被称为SGDR,但在实际使用中,它常常被称为cosine调度器。两者大题一致,实现差异很小。

论文中提到的 SGDR 训练图如下:

「解析」CosineLRScheduler 调度器

文章目录

*
1、CosineLRScheduler

+ t_initial
+ t_mul
+ lr_min 最小学习率
+ decay_rate:衰减比例
+ warmup_t 定义热身时代的数量
+ warmup_lr_init 热身期间的初始学习率
+ warmup_prefix
+ cycle_limit
+ t_in_epochs
+ initialize 初始化
2、CosineAnnealingLR
3、CosineAnnealingWarmRestarts

; 1、CosineLRScheduler

from timm.scheduler.cosine_lr import CosineLRScheduler

CosineLRScheduler(  optimizer:Optimizer,  t_initial:int, t_mul:float=1.0, lr_min:float,
                    decay_rate:float=1.0, warmup_t, warmup_lr_init,warmup_prefix=False,
                    cycle_limit, t_in_epochs=True, noise_range_t=None, noise_pct,
                    noise_std=1.0, noise_seed=42, initialize=True) ::Scheduler

CosineLRScheduler 接受 optimizer 和一些超参数。我们将首先看看如何首先使用timm训练文档来使用cosineLR调度器训练模型,然后看看如何将此调度器用作自定义训练脚本的独立调度器。

将cosine调度器与timm训练脚本一起使用
要使用余cosine调度器训练模型,我们只需更新通过传递–sched cosine参数和必要的超参数传递的训练脚本args。在本节中,我们还将了解每个超参数如何更新余cosine调度器。

t_initial

The initial number of epochs。例如,50、100等

t_mul

Defaults to 1.0. Updates the SGDR schedule annealing.

lr_min 最小学习率

默认为1e-5。训练期间要使用的最低学习率。学习率永远不会低于这个值。

decay_rate:衰减比例

When decay_rate > 0 and

「解析」CosineLRScheduler 调度器

; warmup_t 定义热身时代的数量

warmup_lr_init 热身期间的初始学习率

warmup_prefix

默认为False。如果设置为True,那么每个新纪元数都等于epoch = epoch – warmup_t。

cycle_limit

SGDR 中的最大重启次数
The number of maximum restarts in SGDR.

t_in_epochs

If set to False, the learning rates returned for epoch t are None.

initialize 初始化

If set to True, then, the an attributes initial_lr is set to each param group. Defaults to True.

2、CosineAnnealingLR

⚠️Note:
that this only implements the cosine annealing part of SGDR, and not the restarts.

The full version : CosineAnnealingWarmRestarts

Set the learning rate of each parameter group using a cosine annealing schedule, where η m a x η_{max}ηm a x ​ is set to the initial lr and T c u r T_{cur}T c u r ​ is the number of epochs since the last restart in SGDR:

η t = η m i n + 1 2 ( η m a x − η m i n ) ( 1 + c o s ( T c u r T m a x π ) ) , T c u r ≠ ( 2 k + 1 ) T m a x ; η t + 1 = η t + 1 2 ( η m a x − η m i n ) ( 1 − c o s ( 1 T m a x π ) ) , T c u r = ( 2 k + 1 ) T m a x ; \eta_t = \eta_{min} + \frac{1}{2}(\eta_{max}-\eta_{min})\Big( 1+cos\big(\frac{T_{cur}}{T_{max}}\pi\big) \Big) , \qquad T_{cur}\neq(2k+1)T_{max}; \ \quad \ \eta_{t+1} = \eta_{t} + \frac{1}{2}(\eta_{max}-\eta_{min})\Big( 1-cos\big(\frac{1}{T_{max}}\pi\big) \Big) ,\qquad T_{cur}=(2k+1)T_{max};ηt ​=ηm i n ​+2 1 ​(ηm a x ​−ηm i n ​)(1 +c o s (T m a x ​T c u r ​​π)),T c u r ​​=(2 k +1 )T m a x ​;ηt +1 ​=ηt ​+2 1 ​(ηm a x ​−ηm i n ​)(1 −c o s (T m a x ​1 ​π)),T c u r ​=(2 k +1 )T m a x ​;

When last_epoch=-1, sets initial lr as lr. Notice that because the schedule is defined recursively, the learning rate can be simultaneously modified outside this scheduler by other operators. If the learning rate is set solely by this scheduler, the learning rate at each step becomes:

η t = η m i n + 1 2 ( η m a x − η m i n ) ( 1 + c o s ( T c u r T m a x π ) ) \eta_t=\eta_{min}+\frac{1}{2}(\eta_{max}-\eta_{min}) \Big( 1+cos\big( \frac{T_{cur}}{T_{max}}\pi \big) \Big)ηt ​=ηm i n ​+2 1 ​(ηm a x ​−ηm i n ​)(1 +c o s (T m a x ​T c u r ​​π))

from torch.optim import lr_scheduler

lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=- 1, verbose=False)

Parameters:
  optimizer (Optimizer) – Wrapped optimizer.

  T_max (int)       – Maximum number of iterations.

  eta_min (float)   – Minimum learning rate. Default: 0.

  last_epoch (int)  – The index of last epoch. Default: -1.

  verbose (bool)    – If True, prints a message to stdout for each update. Default: False.

  • get_last_lr()
    Return last computed learning rate by current scheduler.

  • load_state_dict(state_dict)
    Loads the schedulers state.

Parameters:
state_dict (dict) – scheduler state. Should be an object returned from a call to state_dict().

  • print_lr(is_verbose, group, lr, epoch=None)
    Display the current learning rate.

  • state_dict()
    Returns the state of the scheduler as a dict.

It contains an entry for every variable in self.dict which is not the optimizer.

3、CosineAnnealingWarmRestarts

from torch.optim import lr_scheduler
lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0, T_mult=1, eta_min=0, last_epoch=- 1, verbose=False)

Parameters
  optimizer (Optimizer) – Wrapped optimizer.

  T_0 (int) – Number of iterations for the first restart.

  T_mult (int, optional) – A factor increases Ti after a restart. Default: 1.

  eta_min (float, optional) – Minimum learning rate. Default: 0.

  last_epoch (int, optional) – The index of last epoch. Default: -1.

  verbose (bool) – If True, prints a message to stdout for each update. Default: False.

Set the learning rate of each parameter group using a cosine annealing schedule, where η m a x η_{max}ηm a x ​ is set to the initial lr, T c u r T_{cur}T c u r ​ is the number of epochs since the last restart and T i T_i T i ​ is the number of epochs between two warm restarts in SGDR:

η t = η m i n + 1 2 ( η m a x − η m i n ) ( 1 + c o s ( T c u r T i π ) ) \eta_t=\eta_{min}+\frac{1}{2}(\eta_{max}-\eta_{min}) \Big( 1+cos\big( \frac{T_{cur}}{T_{i}}\pi \big) \Big)ηt ​=ηm i n ​+2 1 ​(ηm a x ​−ηm i n ​)(1 +c o s (T i ​T c u r ​​π))

When T c u r = T i T_{cur}=T_i T c u r ​=T i ​, set η t = η m i n \eta_t=\eta_{min}ηt ​=ηm i n ​. When T c u r = 0 T_{cur}=0 T c u r ​=0 after restart, set η t = η m a x \eta_t=\eta_{max}ηt ​=ηm a x ​.

  • get_last_lr()
    Return last computed learning rate by current scheduler.

  • load_state_dict(state_dict)
    Loads the schedulers state.

Parameters:
state_dict (dict) – scheduler state. Should be an object returned from a call to state_dict().

  • print_lr(is_verbose, group, lr, epoch=None)
    Display the current learning rate.

  • state_dict()
    Returns the state of the scheduler as a dict.

It contains an entry for every variable in self.dict which is not the optimizer.

  • step(epoch=None)
    Step could be called after every batch update

Step Example

""" called in an interleaved way. """

scheduler = CosineAnnealingWarmRestarts(optimizer, T_0, T_mult)
for epoch in range(20):
    scheduler.step()
scheduler.step(26)
scheduler.step()

Original: https://blog.csdn.net/ViatorSun/article/details/123529445
Author: ViatorSun
Title: 「解析」CosineLRScheduler 调度器



相关阅读

Title: 虚拟变量怎么做回归_当回归分析模型遇到连续型自变量,我该怎么办?

点击学习全部医学统计学与SPSS教程 如何科学的构建回归模型系列

1.一道饕餮大餐来了!手把手教你如何科学地构建回归模型!2.一文汇总三大回归的基本应用条件、诊断与处理方法 3.回归分析时何时设置哑变量?如何设置?
SPSS 教程37 回归模型连续型自变量的处理方式

上一推文,我介绍了自变量是无序分类变量的哑变量设置方法。本文轮到讨论连续型的定量变量了。 很多朋友对于回归建模中自变量是连续型变量的处理,非常简单粗暴,直接将自变量不作任何处理纳入回归分析中。这种方式应该是作为流行的做法。然而最终简单粗暴的方法毫无任何美感。 一个回归分析模型美不美,关键点之一是我们如何对待连续型自变量。这里面有一些技巧,是大家需要重视的。
连续型自变量,首先要要明确,与研究结局Y是否具有线性关系。

关于线性关系,我已经讲了很多次,无论是线性回归、logistic回归和Cox回归,都要明确自变量与结局存在着大致的线性关系。
如何判定自变量与结局是否有线性关系呢?

线性回归分析,一般采用绘制X与Y的散点图,诸位可以学习本推文相应的文章: 线性回归时,你还不会做残差分析?来看基本教程! logistic回归,一般需要借助交互效应来查看线性问题,相应学习文章如下 Logistic 回归简明教程:原理、SPSS操作、结果解读与报告撰写 特别是线性问题,可以看看代表性文章的说法 构建logistic回归模型很简单?高分SCI文章的做法远远比你想的多 Cox回归,同样,我对线性回归条件进行了介绍 生存分析COX回归,小心你的数据不符合应用条件
此外,对于线性关系是否成立,诸位可以通过哑变量设置的方法进行识别。

这种方法,便是将自变量转为有序多分类变量,并且设置最低值或者最大值组为对照组,进行分析。若各哑变量回归系数b值间隔差不多等距,即可以认为线性关系成立。关于哑变量设置与线性关系条件成立的研究,诸位可以查看本系列推文: 回归分析时何时设置哑变量?如何设置?手把手教会SPSS分析 有些时候线性条件成立、有些时候线性条件不成立。现在我根据实际情况,介绍处理连续型自变量的若干种方法。

连续型自变量纳入回归模型的n种方法
1

分析案例

例3:研究究高血压患者血压与性别、年龄、身高、体重、户籍等变量的关系,随机测量了32名40岁以上的血压y、年龄X1、体重指数X2、性别X3,户籍X4试建立多重线性回归方程。数据文件见reg.sav。

「解析」CosineLRScheduler 调度器

本例中年龄和体重指数是连续型变量,本文针对年龄开展分析。对于年龄与高血压的关系,有以下几种方法可以推荐给大家。
2

当自变量与应变量线性关系成立
第一种,当线性关系条件成立,最基本的方法是直接纳入。

直接纳入法是最原始的方法,当然线性关系成立,不用担心这样直接纳入是否合适。本例显示,年龄每增加一岁,血压增加1.697 mmHg。

「解析」CosineLRScheduler 调度器
第二种,线性关系成立时,等级变量法。

当线性关系条件成立,很多时候直接纳入自变量的方法,得到的回归系数,意义不大。比如,年龄每增加一岁,血压增加1.697 mmHg。没有太大的临床意义。如果我们现将年龄进行进行转换,变成有序多分类变量,也是不错的办法。比如,由于年龄在41-65岁之间,我把年龄变为41-45岁,46-50岁,51-55岁,56-60岁,61-65岁一组,然后再开展分析。我们就可以发现,结果解释的大致相同。本例显示,年龄每增加5岁,血压增加8.089 mmHg。这样的说法在临床上更有意义。
本方法有另外一种说法,叫做趋势性检验分析。

本方法需要注意等级变量等距的问题,若不等距,可能会得到错误的结果。

「解析」CosineLRScheduler 调度器
第三种,线性关系成立时,哑变量设置的方法。

这种方法即在第二种方法的基础上进行哑变量设置分析,比如我们以41-45岁作为对照,开展哑变量分析。可以发现,哑变量设置的方法为我们提供了更多关于变量影响的信息。比如研究可以发现,实际上,不是所有的组别都和41-45岁相比,血压都增高的,45-50岁组与41-45岁相比,没有发现统计学差异(P=0.125)。

「解析」CosineLRScheduler 调度器

这种方法也有风险,它需要更大的样本量,它可能会由于各组别样本量不足而导致无统计学差异的结果。很多人会奇怪,比如下面的结果:

「解析」CosineLRScheduler 调度器

诸位可以看到,年龄处于第5等级时,b=25.767,是一个较大值,但是p=0.065, 没有统计学意义。虽然看起来随着年龄增加,血压是在不断上升,但是由于年龄处于第5等级时,样本量过小,抽样误差过大(标准误差=13.68),远远大于其他组别,因此P值也变得很奇怪。碰到这种情况,我还是推荐不设置哑变量的处理方法。
第四种,线性关系成立时,双重法。

同时开展第三种方法(哑变量设置)和第二种方法(趋势检验法)。两者结合,珠联璧合!同时能够体现各亚组的效应,也可以体现总体上的线性关系。强烈推荐!
3

当自变量与应变量线性关系不成立

当线性关系不成立,也有以下若干种方法。
第一种方法,当然线性条件不成立,哑变量设置方法。

哑变量设置的方法是非常基础的方法。我们首先将定量自变量转为等级自变量,然后设置哑变量开展分析。
第二种方法,哑变量设置+趋势性检验方法。

该方法同线性条件成立的第四种方法。很多人觉得奇怪,线性关系不成立,你怎么还用趋势性检验呀?其实很多时候我们在报告结果的时候,读者不知道到底线性条件是否成立,若我们同时展示哑变量设置的分析结果(部分哑变量有统计学效应)和趋势性检验结果(一般是阴性结果),那么我们便可以一方面详细报告我们的结果,而另一方面也告诉读者,自变量与结局线性关系不成立的, 因为趋势性检验结果不成立。
第三种方法,数据转换的方法。

一般将连续型自变量通过x^2转换,或者log转换,或者e^x转换等多种形式建立与y的关系。
下文的关于线性条件的例子来自于《中华流行病学杂志》2019年第8期的文章:

冯国双.观察性研究中的logistic回归分析思路[J].中华流行病学杂志,2019,40(8):1006-1009 举例: 某研究分析老年人高血压(二分类变量,是或否)的危险因素,研究因素包括gender、age、ox-LDL、Adiponectin、ox-LDL IgG和ox-LDL IgM共6个指标。其中gender为二分类变量,其余变量均为连续变量。如果把6个自变量直接纳入统计软件分析,所得结果见表 1。 表 1 统计软件直接给出的高血压影响因素分析结果

「解析」CosineLRScheduler 调度器

可以看出,6个变量均差异无统计学意义。然而对数据重新分析后发现,并不是这些变量对结局均无影响,只是未能发现它们之间的真实关系而已。经仔细观察,发现age和ox-LDL IgM对结局的影响是有统计学意义的,但不是线性影响,而是二次项关系(表 2)。 表 2 高血压影响因素重新分析后的结果

「解析」CosineLRScheduler 调度器 第四种方法,曲线回归的方法。

曲线回归,经典的方法有两种,一种是LOESS回归,一种是限制性立方条样回归。这两种方法的共同特点是,绘制得到的统计图真是好看呀。 公众号之前报道过LOESS回归: LOESS回归听说过吗?浙大附属医院利用它在BMJ杂志发表了新冠论文

「解析」CosineLRScheduler 调度器

而限制性立方条样图,结果也非常不错。下面这张图利用logistic回归计算OR值的立方条样图,怎么样,不错吧?

「解析」CosineLRScheduler 调度器

这两种非线性关系图,有点复杂,请有兴趣的同学们网上搜索研究,非常有意义哦。

第五种方法,各种方法大集合。如果遇到连续型自变量十分关键,我觉得可以多个角度去分析。哑变量设置、趋势性分析、限制性立方条样图结合一起玩一把,放在结果吧,那是非常酷的结果。

好了,关于连续型自变量,我就讲到这里。 对于连续型自变量的处理,一定要打开思路,特别是如果这个自变量非常关键,诸位应考虑多种策略的组合。下一讲,我将进一步详细讲讲大家比较关心的趋势性分析的技术性问题:如何正确开展趋势性检验!

-本文毕-

系列撰写者:郑卫军,浙江中医药大学医学统计学教研室主任。这里不妨广而告之,如果您有一个临床试验项目,正处于设计阶段,并且已经或者将要过医院伦理委员会审核,不妨联系郑老师统计团队,我们可以帮助您更好的改善临床试验。微信号ZZ566665。

「解析」CosineLRScheduler 调度器 支持郑老师, 快来点击”分享” 吧

Original: https://blog.csdn.net/weixin_28965731/article/details/112731884
Author: 七231fsda~~
Title: 虚拟变量怎么做回归_当回归分析模型遇到连续型自变量,我该怎么办?

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/261751/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总