关于学习率lr

1.StepLR

这是最简单常用的学习了调整方法,每过step_size轮,将此前的学习率乘以gamma。

scheduler=lr_scheduler.StepLR(optimizer, step_size=50, gamma=0.1)

2.MultiStepLR

MultiStepLR同样也是一个非常常见的学习率调整策略,它会在每个milestone时,将此前学习率乘以gamma。

scheduler = lr_scheduler.MultiStepLR(optimizer, milestones=[30,80], gamma=0.5)

3.ExponentialLR

ExponentialLR是指数下降型学习率调节器,每一轮会将学习率乘以gamma,所以这里千万注意gamma不要设置太大,不然几轮之后学习率会降为0。

scheduler=lr_scheduler.ExponentialLR(optimizer, gamma=0.9) 

4.LinearLR

LinearLR是线性学习率,给定起始factor和最终factor,LinearLR会在中间阶段做线性插值,比如学习率为0.1,起始factor为1,最终factor为0.1,那么第0次迭代,学习率将为0.01,最终轮学习率为0.01。下面设置的总轮数total_iters为80,所以超过80时,学习率恒为0.01。

scheduler=lr_scheduler.LinearLR(optimizer,start_factor=1,end_factor=0.1,total_iters=80)

5.CyclicLR

CyclicLR的参数要更多一些,它的曲线看起来就像是不断地上坡与下坡,base_lr为谷底的学习率,max_lr为顶峰的学习率,step_size_up是从谷底到顶峰需要的轮数,step_size_down是从顶峰到谷底的轮数。简单来说,最佳学习率会在base_lr和max_lr,CyclicLR不是一味衰减而是出现增大的过程是为了避免陷入鞍点。

scheduler=lr_scheduler.CyclicLR(optimizer,base_lr=0.1,max_lr=0.2,step_size_up=30,step_size_down=10)

6.OneCycleLR

OneCycleLR顾名思义就像是CyclicLR的一周期版本,它也有多个参数,max_lr就是最大学习率,pct_start是学习率上升部分所占比例,一开始的学习率为max_lr/div_factor,最终的学习率为,max_lr/final_div_factor,总的迭代次数为total_steps。

scheduler=lr_scheduler.OneCycleLR(optimizer,max_lr=0.1,pct_start=0.5,total_steps=120,div_factor=10,final_div_factor=10)

7.CosineAnnealingLR

CosineAnnealingLR是余弦退火学习率,T_max是周期的一半,最大学习率在optimizer中指定,最小学习率为eta_min。这里同样能够帮助逃离鞍点。值得注意的是最大学习率不宜太大,否则loss可能出现和学习率相似周期的上下剧烈波动。

scheduler=lr_scheduler.CosineAnnealingLR(optimizer,T_max=20,eta_min=0.05)

CosineAnnealingWarmRestarts

这里相对负责一些,公式如下,其中T_0是第一个周期,会从optimizer中的学习率下降至eta_min,之后的每个周期变成前一周期乘以T_mult。

scheduler=lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0=20, T_mult=2, eta_min=0.01)

8.LambdaLR

LambdaLR其实没有固定的学习率曲线,名字中的lambda指的是可以将学习率自定义为一个有关epoch的lambda函数,比如下面定义了一个指数函数,实现ExponentialLR的功能。

scheduler=lr_scheduler.LambdaLR(optimizer,lr_lambda=lambda epoch:0.9**epoch)

9.SequentialLR

SequentialLR可以将多个学习率调整策略按照顺序串联起来,在milestone时切换到下一个学习率调整策略。下面就是将一个指数衰减的学习率和线性衰减的学习率结合起来。

scheduler=lr_scheduler.SequentialLR(optimizer,schedulers=[lr_scheduler.ExponentialLR(optimizer, gamma=0.9),lr_scheduler.LinearLR(optimizer,start_factor=1,end_factor=0.1,total_iters=80)],milestones=[50])

10.ChainedScheduler

ChainedScheduler和SequentialLR类似,也是按照顺序调用多个串联起来的学习率调整策略,不同的是ChainedScheduler里面的学习率变化是连续的。

scheduler=lr_scheduler.ChainedScheduler([lr_scheduler.LinearLR(optimizer,start_factor=1,end_factor=0.5,total_iters=10),lr_scheduler.ExponentialLR(optimizer, gamma=0.95)])

11.ConstantLR

ConstantLR非常简单,在total_iters轮内将optimizer里面指定的学习率乘以factor,total_iters轮外恢复原学习率。

scheduler=lr_scheduler.ConstantLRConstantLR(optimizer,factor=0.5,total_iters=80)

12.ReduceLROnPlateau

ReduceLROnPlateau参数非常多,其功能是自适应调节学习率,它在step的时候会观察验证集上的loss或者准确率情况,loss当然是越低越好,准确率则是越高越好,所以使用loss作为step的参数时,mode为min,使用准确率作为参数时,mode为max。factor是每次学习率下降的比例,新的学习率等于老的学习率乘以factor。patience是能够容忍的次数,当patience次后,网络性能仍未提升,则会降低学习率。threshold是测量最佳值的阈值,一般只关注相对大的性能提升。min_lr是最小学习率,eps指最小的学习率变化,当新旧学习率差别小于eps时,维持学习率不变。

scheduler=lr_scheduler.ReduceLROnPlateau(optimizer,mode='min',factor=0.5,patience=5,threshold=1e-4,threshold_mode='abs',cooldown=0,min_lr=0.001,eps=1e-8)
scheduler.step(val_score)

### 关于学习率 (Learning Rate, LR) 的定义、使用与调整 #### 学习率的定义 学习率是一个超参数,用于控制优化过程中每一步更新权重的程度。它决定了模型在梯度方向上移动的步伐大小。如果学习率过大,则可能导致训练不稳定甚至发散;而过小的学习率会使收敛速度变慢,增加训练时间。 #### 学习率的作用 在机器学习和深度学习中,学习率直接影响到模型的性能以及训练效率。通过适当设置学习率,可以实现更快的收敛并获得更优的结果。例如,在逻辑回归模型中,学习率的选择会影响稀疏性和准确性之间的平衡[^3]。 #### 常见的学习率调整方法 为了提高训练效果,通常采用动态调整学习率的方法来代替固定学习率。以下是几种常见的学习率调整策略: 1. **基于验证集损失的学习率调度** 这种方法允许根据训练期间的表现自动调节学习率。其基本思路是在每个训练周期结束时评估当前状态,并依据预设规则改变学习率。这种方法能够适应不同的数据分布特性,从而提升最终模型的质量[^1]。 2. **余弦退火(Cosine Annealing)** 该技术利用余弦函数的形式逐渐降低学习率至某一最小值 `eta_min` ,然后再重新升高再降的过程重复多次形成多个周期性的变化模式。这种方式有助于跳出局部最优解找到全局最佳点[^2]: \[ \text{lr} = \eta_{\min} + (\eta_{\max}-\eta_{\min}) * (1+\cos(\pi*T/T_{\max})) / 2 \] 3. **指数衰减(Exponential Decay)** 随着迭代次数的增长按一定比例减少初始设定好的基础水平上的数值直到达到目标范围为止。 4. **阶梯型下降(Step Decay)** 当前阶段完成后按照预定间隔大幅度削减现有比率直至满足条件停止进一步变动。 #### 示例代码展示如何实现简单的学习率调度器 下面提供了一个 Python 实现的例子,演示了如何手动创建一个自定义的学习率调度程序: ```python import tensorflow as tf def custom_lr_scheduler(epoch, lr): if epoch < 5: return lr elif epoch < 10: return lr * tf.math.exp(-0.1) else: return lr * tf.math.exp(-0.3) model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.01), loss='mse') callback = tf.keras.callbacks.LearningRateScheduler(custom_lr_scheduler) history = model.fit(x_train, y_train, epochs=20, callbacks=[callback]) ``` 此段脚本展示了怎样构建一个回调函数来自由操控每次循环之后的新旧转换关系以便更好地服务于特定应用场景下的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值