学习率衰减

学习率衰减(learning rate decay)同样也可以让我们的学习算法运行地更快,它能保证损失函数最终摆动时处在离最优值很近的范围内。

为什么需要学习率衰减

前面我们讲过,mini-batch 梯度下降算法可以提高更新权重的速度,让我们及时看到损失函数的情况,但是每个损失函数并不会一直下降,而是在保证整体趋势减小的情况下略微波动,如果用一个等高线图来表示就是这样的:

上图的中心点为最优值点,我们可以看到损失函数渐渐接近最优值,但最后却在最优值附近摆动,这是因为学习率的大小一直不变,如果我们可以让学习率随着损失函数接近最优值或是随着迭代次数的增加而慢慢减小的话,就可以得到下图中的绿线:

可以看到,随着损失函数接近最优值,摆动的幅度也在减小,从而保证最后损失函数在离最优值更近的范围内摆动。

如何实现

我们的目标是让学习率 α \alpha α 随着迭代次数的增加而逐渐减小。先明确迭代这个概念,所谓迭代就是让训练集中的所有数据都输入一次网络,这就是一次迭代。如果训练集被分成了许多个 mini batches,那一次迭代就是所有 mini batches 中的数据都依次输入进网络并更新了权重。因此我们可以这样定义学习率:

α = 1 1 + d e c a y R a t e ⋅ e p o c h N u m ⋅ α 0 \alpha = \cfrac{1}{1 + decayRate · epochNum} · \alpha_0 α=1+decayRateepochNum1α0

其中,

  • decayRate 是衰减率,衰减率越大,学习率就减小得越快
  • epochNum 是迭代次数
  • α 0 \alpha_0 α0 是初始学习率,初始学习率可以设置得大一些,这样可以保证算法一开始的学习速度不会太慢

从这个式子可以明显看出,随着迭代次数 epochNum 的增大, α \alpha α 就会变小。

decayRate 和 α 0 \alpha_0 α0 都是超参数,我们需要在实践中调整这些值以得到满意的结果。

当然还有一些别的方法实现学习率衰减,比如:

α = d e c a y R a t e e p o c h N u m ⋅ α 0 \alpha = decayRate^{epochNum} · \alpha_0 α=decayRateepochNumα0

α = k e p o c h N u m ⋅ α 0 \alpha = \cfrac{k}{\sqrt{epochNum}} · \alpha_0 α=epochNum kα0

还有人会选择手动调整 α \alpha α 的值,比如每个几小时或几天就去手工调整学习率的值,这种方法也是可行的。

以上就是对学习率衰减的简要介绍,其基本思想就是让学习率随着迭代次数的增加而减小,以保证损失函数在离最优值比较近的区域内摆动。

PyTorch学习率衰减是一种优化算法中的策略,用于调整神经网络训练过程中模型参数更新的步长,以便更好地探索损失函数的最小值。学习率衰减的目的是防止模型在训练后期过快收敛或陷入局部最优,从而提高模型的泛化能力。在PyTorch中,常见的学习率衰减方法有以下几种: 1. **固定学习率**:在整个训练过程中保持恒定的学习率,适用于简单模型和小数据集。 2. **指数衰减(Exponential Decay)**:学习率按照指数规律逐渐降低,公式为 `learning_rate * decay_rate ^ (global_step / decay_steps)`。 3. **余弦退火(Cosine Annealing)**:学习率按照余弦曲线周期性地进行调整,通常在每个周期结束后会降低到最小值。 4. **步长衰减(Step Decay)**:每经过一定数量的迭代(步长),将学习率乘以衰减因子。 5. **多阶段衰减**:分段设置多个学习率阶段,不同阶段有不同的衰减率。 6. **学习率调度器(Learning Rate Scheduler)**:在PyTorch中,可以使用`torch.optim.lr_scheduler`模块创建自定义的学习率衰减策略,如`LambdaLR`, `MultiStepLR`, `ReduceLROnPlateau`, 等。 要使用这些策略,你需要在优化器上调用相应的学习率调度器,并在训练循环中定期调用`scheduler.step()`。例如: ```python import torch.optim as optim from torch.optim.lr_scheduler import CosineAnnealingLR optimizer = optim.Adam(model.parameters(), lr=0.001) scheduler = CosineAnnealingLR(optimizer, T_max=100, eta_min=0.0001) for epoch in range(num_epochs): train(...) scheduler.step() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值