深度学习笔记(五):学习率过大过小对于网络训练有何影响以及如何解决

1.学习率的作用

学习率 (learning rate),作为监督学习以及深度学习中重要的超参,它控制网络模型的学习进度,决定这网络能否成功或者需要多久成功找到全局最小值,从而得到全局最优解,也就是最优参数。换句话说学习率和stride(步长)性质差不多。

2.学习率太大有何影响

首先我们要认识到学习率过大,自然第一反应就是学习的速度或者说忽略了某些阶段直接学到了下一个阶段的东西,这对于计算机来说是不可取的,特别是用于神经网络之中。这就好比在网络模型中我们所需要的最佳的值是50,如果我们学习率正好设置的是50,初始值为0,那么我们可以一步到位,若是设置的是10,多走几步依然可到,但是如果设置的是100,那我们就会直接跳过了50,也就是说忽略了最佳的结果。
那么学习率设置太大会造成网络不能收敛,在最优值附近徘徊,也就是说直接跳过最低的地方跳到对称轴另一边,从而忽视了找到最优值的位置。如下图

在这里插入图片描述

3.学习率太小有何影响

如果学习率设置太小,网络收敛非常缓慢,会增大找到最优值的时间,也就是说从山坡上像蜗牛一样慢慢地爬下去。虽然设置非常小的学习率是可以到达,但是这很可能会进入局部极值点就收敛,没有真正找到的最优解,换句话说就是它步长太小,跨不出这个坑。


在这里插入图片描述

4.如何进行学习率设置

在训练过程中,一般根据训练轮数设置动态变化的学习率。

刚开始训练时:学习率以 0.01 ~ 0.001 为宜。
一定轮数过后:逐渐减缓。
接近训练结束:学习速率的衰减应该在100倍以上。
如果是 迁移学习 ,由于模型已在原始数据上收敛,此时应设置较小学习率 (≤0.0001) 在新数据上进行微调 。

这段内容主要介绍了三种学习率缓减机制,包括其原理、数学表达式、代码实现以及背后的逻辑,以下是详细分析:

1. 学习率缓减机制的重要性

在深度学习训练过程中,学习率是一个关键超参数。如果学习率设置过大,模型可能无法收敛,在训练过程中容易出现振荡甚至发散;而学习率设置过小,会导致训练时间过长,模型收敛速度缓慢。学习率缓减机制就是在训练过程中动态调整学习率,让模型在训练初期能够快速收敛,而在后期能够更加精细地调整参数,以达到更好的性能。

2. 方法 1:每 N 轮学习率减半

  • 原理:学习率按训练轮数增长指数差值递减,即每经过 N 轮训练,学习率就会减半。这种方式简单直观,通过定期降低学习率,使模型在训练后期能够更加稳定地收敛。
  • 图示说明:通过提供的图片(在这里插入图片描述)可以更直观地看到学习率随训练轮数的变化趋势,随着轮数的增加,学习率呈指数式下降。

3. 方法 2:指数衰减

  • 数学表达式decayed_lr = lr0 * (decay_rate ^ (global_steps / decay_steps))
    • decayed_lr:衰减后的学习率,即当前训练实际使用的真实学习率。它是根据初始学习率、衰减率、当前训练步数以及衰减步数计算得出的。
    • lr0:初始学习率,是模型训练开始时设置的学习率大小,它决定了模型在训练初期的参数更新步长。
    • decay_rate:衰减率,每次衰减的比例。它控制着学习率下降的速度,取值通常在 0 到 1 之间,值越小,学习率下降得越快。
    • global_steps:当前训练步数,记录了模型从开始训练到当前时刻已经进行的步数。
    • decay_steps:衰减步数,每隔多少步衰减一次。它决定了学习率更新的频率,通过调整这个参数,可以控制学习率在不同阶段的变化速度。
  • TensorFlow 对应 API
global_step = tf.Variable(0)
lr = tf.train.exponential_decay(
     lr0,
     global_step,
     decay_steps=lr_step,
     decay_rate=lr_decay,
     staircase=True)
- `global_step` 被初始化为 0,它是一个 TensorFlow 变量,用于记录当前训练步数。
- `tf.train.exponential_decay` 函数实现了指数衰减的学习率计算。
- `staircase=True` 参数表示 `global_steps / decay_steps` 取整更新,这意味着每隔 `decay_steps` 步,学习率才会更新一次,呈现出阶梯状的衰减模式。这种方式可以使学习率的更新更加规律,避免过于频繁的微小变化,有助于模型的稳定训练。

4. 方法 3:通过引入 BN 层

  • BN 层原理:BN 层(Batch Normalization,批归一化层)的主要作用是防止网络中间层在训练过程中数据分布发生改变,也就是所谓的“内部协变量偏移”问题。它通过对每一层输入数据进行归一化处理,使其均值为 0,方差为 1,从而加速模型的收敛。
  • 对学习率的影响
    • 由于 BN 算法收敛很快,所以可以采用初始很大的学习率,并且学习率的衰减速度也可以很大。在这种情况下,模型能够在训练初期快速地调整参数,而不会因为学习率过大导致不稳定。
    • 即使选择较小的学习率,由于 BN 层的存在,模型的收敛速度也比没有 BN 层时更快。这是因为 BN 层能够让模型在训练过程中更有效地学习,减少了数据分布变化对模型训练的影响。

总结

这部分内容详细介绍了三种常见的学习率缓减机制,每种方法都有其独特的原理和应用场景。方法 1 简单直接,通过固定轮数减半学习率;方法 2 则通过指数衰减公式更加灵活地控制学习率变化;方法 3 借助 BN 层的特性,允许更大的学习率和更快的衰减速度,同时也能加快模型的收敛。这些方法在深度学习模型训练中都起着重要作用,帮助模型在不同阶段更好地调整参数,提高训练效果和性能。

### LoRA 中学习率对模型性能和训练过程的影响 在LoRA(低秩适应)框架下,学习率的选择至关重要,直接影响到微调过程中模型的收敛速度以及最终性能。较低的学习率有助于更稳定地更新参数,减少过拟合的风险,而较高的学习率则可能加快早期阶段的收敛速度,但也可能导致不稳定或振荡。 #### 学习率训练稳定性的影响 当设定较小的学习率时,每次迭代中的权重变化量相对较少,这使得优化路径更加平滑,减少了陷入局部极小值的可能性[^2]。然而,如果学习率设置得过低,可能会导致训练时间延长,甚至无法有效捕捉数据集特征的变化,从而影响整体效果。 相反,在某些情况下适当增加初始学习率可以加速前期探索进程,使网络更快找到较好的解空间位置。但是需要注意的是,过高学习率容易引起梯度爆炸等问题,特别是在处理复杂任务或多层神经网络结构时更为明显[^1]。 #### 学习率策略调整的重要性 为了平衡上述矛盾并获得最佳实践方案,通常建议采用动态调整机制来控制整个训练周期内的实际使用学习率: - **预热期**:刚开始几轮迭代中逐渐增至目标水平; - **衰减期**:随着epoch数增长逐步降低以精细化调整最后一部分权值差异; - **重启法**:周期性重置回较高起点再重复以上两步操作直至满足终止条件为止。 这种灵活变通的方式不仅能够充分利用高低两端优势特性,而且还可以更好地应对不同类型的数据分布特点及其内在规律性的改变需求[^4]。 ```python import torch.optim as optim from transformers import get_linear_schedule_with_warmup optimizer = optim.AdamW(model.parameters(), lr=initial_learning_rate) scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps=warm_up_steps, num_training_steps=num_train_epochs * steps_per_epoch) for epoch in range(num_train_epochs): for batch in train_loader: optimizer.zero_grad() outputs = model(**batch) loss = outputs.loss loss.backward() optimizer.step() scheduler.step() # Update learning rate schedule ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZZY_dl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值