4-Learning rate自动调整学习率

本文探讨了在机器学习训练中,自适应学习率如何影响模型优化。AdaptiveLearningRate策略如Adagrad、RMSProp和Adam能根据参数梯度的变化动态调整学习率。Adagrad在初期表现良好,但后期学习率降低可能导致震荡。RMSProp和Adam结合了历史梯度信息,提供更好的适应性。学习率调度如LearningRateDecay和WarmUp策略能进一步优化训练过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Adaptive Learning Rate

一、问题描述

image-20211202155459837

当分析训练的loss已经不会随着gradient的更新而变化时,不一定就是local minima或者saddle point,分析norm of gradient ,发现在loss几乎不变的时候,gradient 还在保持着较大幅度的更新,很有可能是走到了左边的峡谷,gradient在两边跳跃,却始终不会降低loss。

image-20211202160505115

学习率过大,就会出现上一张ppt所示的情形,在峡谷两侧摆动;学习率过小,在峡谷的腰部位置,表现得会不错,慢慢移动到谷底,但是当进入平缓之后,学习率过小导致始终无法移到点x处。

二、不同的参数需要不同的学习率

1.参数更新公式
image-20211202162821542

我们需要的是,在梯度变化较大的位置用更小的学习率,而梯度较为平缓的地方使用更大的学习率,希望机器可以自动调节。

2.root mean square均方根———used in Adagrad

简单来讲,设置全局学习率之后,每次通过全局学习率逐参数的除以历史梯度平方和的平方根,使得每个参数的学习率不同。

效果:在参数空间更为平缓的方向,会取得更大的进步(因为平缓,所以历史梯度平方和较小,对应学习下降的幅度较小)

缺点:使得学习率过早,过量的减少

image-20211202163506076

对于同一个参数,gradient的大小会被固定的差不多,但是,如果是同一个参数的同一个更新方向,出现陡坡和平坡,需要自动变化学习率,就需要更加高级的更新办法。

3.RMSProp

更近的gradient有着更大的影响,而过去的gradient有着很小的影响。使得对于同一个参数的同一个移动方向也可以自适应调整学习率。

image-20211202165153288 image-20211202165404960
4.最常用的optimization策略是Adam

Adam=RMSProp+Momentum

三、结果

1.without Adaptive Learning Rate

image-20211202170442984

2.Adagrad

刚开始表现得十分不错,但是为什么在圆圈处出现较大幅度纵轴震荡?因为到了平缓区域,学习率降低,但是随着很多次累加,学习率又将变大,后又慢慢减小,出现下图的情况。

image-20211202170547969
3.解决办法:Learning Rate Schedulingimage-20211202171554296
3.1 Learning Rate Decayimage-20211202171142344

随着时间的进行,我们更加接近目标,于是,我们不断减少学习率。

3.2 Warm Upimage-20211202171255139

先变大,后减少(黑科技),可能性解释,刚开始,机器看到的资料不多,因此用更小的更新速度去探索更多的情报。---->please refer RAdam

四、Summary of Optimization

momentum 和image-20211202172538857不会抵消,因为momentum直接加上过去的所有movement,有考虑方向和正负号,而 却只考虑大小,不考虑方向。

raw/master/img/202112021725879.png" style=“zoom:50%;” />却只考虑大小,不考虑方向。

image-20211202172701856
### CNN 中自动调整学习率的方法 在卷积神经网络(CNN)中,动态调整学习率是一种常见的优化技术,用于提高模型训练效率并改善收敛性能。以下是几种常用的学习率调整策略及其具体实现方式: #### 1. **固定间隔衰减** 这种方法会在特定的 epoch 或迭代次数之后降低学习率。通常会按照一定的比例减少当前学习率。 ```python def adjust_learning_rate(optimizer, epoch, initial_lr, decay_rate=0.1, epochs_decay=[30, 60]): """根据预定义的 epoch 列表调整学习率""" if epoch in epochs_decay: new_lr = initial_lr * (decay_rate ** (epochs_decay.index(epoch) + 1)) for param_group in optimizer.param_groups: param_group['lr'] = new_lr ``` 这种方式简单易用,但在实际应用中可能不够灵活[^4]。 --- #### 2. **基于指标的表现调整学习率** 当验证集上的损失不再下降时,可以通过 `ReduceLROnPlateau` 来动态降低学习率。PyTorch 提供了一个内置工具来简化这一过程。 ```python from torch.optim.lr_scheduler import ReduceLROnPlateau optimizer = optim.SGD(model.parameters(), lr=params["learning_rate"]) scheduler = ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10) for epoch in range(num_epochs): train(...) val_loss = validate(...) scheduler.step(val_loss) ``` 此方法可以根据模型表现自适应调整学习率,从而避免过早停止或过度拟合[^2]。 --- #### 3. **RMSProp 和 Adam 的内部机制** 一些优化器本身已经实现了动态学习率调整的功能。例如 RMSProp 使用指数加权移动平均的方式计算梯度平方的均值,并据此更新学习率[^3]。 ```python optimizer = optim.RMSprop(model.parameters(), lr=params["learning_rate"], alpha=0.99, eps=1e-8) ``` Adam 是另一种常用的优化算法,它结合了 Momentum 和 RMSProp 的优点,在许多场景下表现出色。 ```python optimizer = optim.Adam(model.parameters(), lr=params["learning_rate"], betas=(0.9, 0.999), eps=1e-8) ``` 这些优化器无需额外编写代码即可完成学习率的动态管理。 --- #### 4. **余弦退火调度器** Cosine Annealing Scheduler 可以周期性地改变学习率,帮助模型跳出局部最优解。 ```python from torch.optim.lr_scheduler import CosineAnnealingLR optimizer = optim.SGD(model.parameters(), lr=params["learning_rate"]) scheduler = CosineAnnealingLR(optimizer, T_max=num_epochs) for epoch in range(num_epochs): train(...) scheduler.step() ``` 该方法特别适用于需要长时间训练的任务,因为它能够在后期提供更精细的学习率控制。 --- #### 总结 不同的学习率调整策略各有优劣,选择合适的方法取决于具体的任务需求和数据特性。如果希望手动控制,则可以选择固定间隔衰减;对于自动化的需求,推荐使用 PyTorch 内置的调度器如 `ReduceLROnPlateau` 或 `CosineAnnealingLR`;而像 RMSProp 和 Adam 这样的优化器则提供了开箱即用的解决方案[^1][^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值