深度学习优化策略---优化器的学习率调节


深度卷积神经网络(CNN tricks)调参技巧(一)学习率调节
理解深度学习中的学习率及多种选择策略
1cycle策略:实践中的学习率设定应该是先增再降
The 1cycle policy
机器学习算法如何调参?这里有一份神经网络学习速率设置指南
『A DISCIPLINED APPROACH TO NEURAL NETWORK HYPER-PARAMETERS: PART 1』论文笔记
【调参】Cyclic Learning Rates和One Cycle Policy-Keras

tensorflow中常用学习率更新策略
分段常数衰减 : tf中定义了tf.train.piecewise_constant 函数,实现了学习率的分段常数衰减功能
指数衰减: tf中实现指数衰减的函数是 tf.train.exponential_decay()。
自然指数衰减: tf中实现自然指数衰减的函数是 tf.train.natural_exp_decay()
多项式衰减: tf中实现多项式衰减的函数是 tf.train.polynomial_decay()
余弦衰减: tf中的实现函数是:tf.train.cosine_decay()

什么是学习率,以及它是如何影响深度学习的

学习率热身

https://github.com/ildoonet/pytorch-gradual-warmup-lr
训练初期由于离目标较远,一般需要选择大的学习率,但是使用过大的学习率容易导致不稳定性。所以可以做一个学习率热身阶段——在开始的时候先使用一个较小的学习率,然后当训练过程稳定的时候再把学习率调回去。
比如说在热身阶段,将学习率从0调到初始学习率。举个例子,如果我们准备用m个batches来热身,准备的初始学习率是 η ,然后在每个batch i , 1 ≤ i ≤ m i, 1 \leq i \leq m i,1im ,将每次的学习率设为 i η / m i \eta / m iη/m

周期学习率

论文:《Cyclical Learning Rates for Training Neural Networks》
如何找到最优学习率
代码地址:
fastai实现:https://github.com/sgugger/Deep-Learning/blob/master/Cyclical LR and momentums.ipynb
adam的实现:https://github.com/mpyrozhok/adamwr
keras实现:https://github.com/bckenstler/CLR
pytorch实现:https://github.com/anandsaha/pytorch.cyclic.learning.rate/blob/master/cls.py

如下图所示,CLR需要把握几个基本概念:
base_lr : 下界学习率。
max_lr : 上界学习率。
cycle: 学习率从下界学习率(base_lr)到上界学习率(max_lr)再到下界学习率(base_lr),所经历的迭代次数iterations。
stepsize: cycle迭代次数的一半。
在这里插入图片描述

以下内容节选自https://github.com/bckenstler/CLR
The author points out that the best accuracies are typically attained by ending with the base learning rate. Therefore it’s recommended to make sure your training finishes at the end of the cycle.
在原文中,提供了三种周期学习率的方法,用的较多的是triangular策略。

1、triangular

在这里插入图片描述
基本算法

cycle = np.floor(1+iterations/(2*step_size))
x = np.abs(iterations/step_size - 2*cycle + 1)
lr = base_lr + (max_lr-base_lr)*np.maximum(0, (1-x))

2、triangular2

在这里插入图片描述

This method is a triangular cycle that decreases the cycle amplitude by half after each period, while keeping the base lr constant. This is an example of scaling on cycle number.

Basic algorithm:

cycle = np.floor(1+iterations/(2*step_size))
x = np.abs(iterations/step_size - 2*cycle + 1)
lr = base_lr + (max_lr-base_lr)*np.maximum(0, (1-x))/float(2**(cycle-1))

3、exp_range

在这里插入图片描述
This method is a triangular cycle that scales the cycle amplitude by a factor gamma(iterations), while keeping the base lr constant.** This is an example of scaling on iteration.

Basic algorithm:
cycle = np.floor(1+iterations/(2step_size))
x = np.abs(iterations/step_size - 2
cycle + 1)
lr= base_lr + (max_lr-base_lr)np.maximum(0, (1-x))gamma(iterations)

4、One Cycle Policy and Super-Convergence

源码:https://github.com/nachiket273/One_Cycle_Policy/blob/master/OneCycle.py
pytorch应用1circle:https://github.com/nachiket273/One_Cycle_Policy/blob/master/CLR.ipynb
keras实现:https://github.com/titu1994/keras-one-cycle/blob/master/clr.py

在 2017 年的近期工作中<Super-Convergence: Very Fast Training of Neural
Networks Using Large Learning Rates>,LR Range test 和 CLR 的作者将自己的想法推向了极致,其中循环学习率策略仅包含 1 个周期(一个cycle可以有多个epoch),因此称作「一周期」策略

This is a special case of Cyclic Learning Rates, where we have only 1 cycle. After the completion of 1 cycle, the learning rate will decrease rapidly to 100th its initial lowest value。

在keras的实现代码中,可以看出,1个cycle是可以有多个epoch的

        self.epochs = self.params['epochs']
        self.batch_size = self.params['batch_size']
        self.samples = self.params['samples']
        self.steps = self.params['steps']

        if self.steps is not None:
            self.num_iterations = self.epochs * self.steps
        else:
            if (self.samples % self.batch_size) == 0:
                remainder = 0
            else:
                remainder = 1
            self.num_iterations = (self.epochs + remainder) * self.samples // self.batch_size

在这里插入图片描述
在一周期策略中,最大学习率被设置为 LR Range test 中可以找到的最高值,最小学习率比最大学习率小几个数量级。

  • 先使用LR range test中的方法,找到最大的学习速率max_lr。
  • 使用最大学习速度的1/5或1/10作为较低的学习速度。
  • 从较低的学习率到较高的学习率,然后再回到较低的学习率。我们选择这个周期长度略小于要训练的周期总数。
  • 在最后的迭代中,我们将学习率大大低于较低的学习率值(1/10或1/100)。(整个周期(向上和向下)的长度被设置为略小于训练周期的总数,这样循环结束后有残余时间降低学习率,从而帮助模型稳定下来 )

我们可以将这种策略看作是一种探索-开发的权衡,其中周期的前半部分更有可能从某一局部最优跳到另一局部最优,从而有望在最平坦、最广泛的局部最优区域达到稳定。以较大的学习率开始循环的后半部分有助于模型更快地收敛到最优。
一周期策略本身就是一种正则化技术,因此需要对其它正则化方法进行调优才能与此策略配合使用。

  • 通过这一策略,作者演示了「超收敛」,它达到相同的验证准确率只需要 1/5 的迭代。
  • 标记训练数越少 ,相对于其他学习率策略的收敛效果会增加。

5、如何找到合适的学习率范围

调参】如何为神经网络选择最合适的学习率lr-LRFinder-for-Keras
源码:https://github.com/surmenok/keras_lr_finder/blob/master/keras_lr_finder/lr_finder.py
https://github.com/davidtvs/pytorch-lr-finder/blob/master/lr_finder.py

Cosine Learning Decay

学习率衰减大家都懂的,文中给出了一种可能更有效的衰减方式,我感觉之前在看一些代码的时候学习率衰减基本是step decay,多少个epoch后就除以一个数字这样子,论文里面提到的这种Cosine lr decay好像没怎么见到过,打算下次试一试,具体做法是,假设总batch size是T(忽略学习率热身阶段),初始学习率为 \eta ,那么在每个batch t, 将学习率设为:在这里插入图片描述
这个lr decay我看了看,貌似tensorflow里面已经实现了,可以直接拿来用

动态学习率导致的内存暴涨

原因,在设置动态学习率时,在epoch的循环内添加了tensor,导致graph的节点越来越多。内存最终溢出。
在这里插入图片描述
正确的方法参考:https://blog.csdn.net/u013555719/article/details/79334359
在这里插入图片描述

自 Adam 出现以来,深度学习优化器发生了什么变化?
LR Range test + Cyclical LR(《Cyclical Learning Rates for Training Neural Networks》)
SGDR(《SGDR: Stochastic Gradient Descent with Warm Restarts》)
SGDW® and AdamW®(《Decoupled Weight Decay Regularization in Adam》) 源码1:https://github.com/loshchil/AdamW-and-SGDW 源码2:https://github.com/mpyrozhok/adamwr
1-cycle policy and super-convergence(《Super-Convergence: Very Fast Training of Neural Networks Using Large Learning Rates》) https://sgugger.github.io/the-1cycle-policy.html

Leslie N Smith. Cyclical Learning Rates for Training Neural Networks 2015
Leslie N Smith. No more pesky learning rate guessing games. arXiv preprint arXiv:1506.01186,2017.(Cyclical Learning Rates for Training Neural Networks的最新版本)
Leslie N Smith. Cyclical learning rates for training neural networks. In Applications of Computer Vision (WACV), 2017 IEEE Winter Conference on, pp. 464–472. IEEE, 2017.
Leslie N Smith and Nicholay Topin. Super-convergence: Very fast training of residual networks using large learning rates. arXiv preprint arXiv:1708.07120, 2017.
Leslie N Smith.A DISCIPLINED APPROACH TO NEURAL NETWORK HYPER-PARAMETERS: PART 1 – LEARNING RATE,BATCH SIZE, MOMENTUM, AND WEIGHT DECAY,2018

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 深度学习模型训练效果差的原因可能有很多: 1. 数据集问题:数据集不足、数据质量差、数据分布不均等都会影响模型的训练效果。 2. 参数设置问题:模型参数设置不合理,比如学习过大或过小、批次大小不合适等都会影响模型的性能。 3. 模型选择问题:选择的模型不适合解决当前问题,比如模型复杂度过高或过低、模型结构不合理等都会影响模型的训练效果。 4. 训练策略问题:训练过程中使用的策略不合理,比如过拟合或欠拟合、正则化方法不合适等都会影响模型的性能。 5. 硬件问题:硬件设备不足或不合适,比如内存不足、GPU性能不佳等都会影响模型的训练效果。 针对以上问题,可以采取以下措施: 1. 收集更多、更高质量的数据,并且进行数据预处理。 2. 合理调整模型参数,采用合适的优化算法。 3. 根据问题的特点选择合适的模型结构,并进行适当的调整。 4. 采用合适的训练策略,如正则化、dropout、early stopping 等。 5. 购置合适的硬件设备,如更大内存、更好的GPU等。 ### 回答2: 深度学习模型训练效果差可能有以下几个原因。 首先,数据质量不好可能是导致深度学习模型训练效果差的原因之一。如果训练数据集中存在噪声、缺失值或错误的标签,模型在学习和泛化过程中可能会受到干扰,导致效果不佳。 其次,模型架构选择不当也可能导致训练效果差。深度学习模型包含大量的参数和层次结构,合适的模型架构能够更好地捕捉数据中的复杂关系。如果选择的模型架构不适合任务的复杂性或规模,模型可能会出现欠拟合或过拟合等问题,导致训练效果差。 另外,训练策略也是深度学习模型训练效果差的原因之一。例如,学习选择不当、缺乏正则化、过早停止训练或过长的训练时间等都可能导致模型无法充分学习数据的特征。 除此之外,硬件设备的限制也可能是训练效果差的原因之一。深度学习模型的训练通常需要大量的计算资源和时间。如果使用的硬件设备性能较差或不足够,可能会导致训练效果不佳。 最后,优化算法的选择也会影响深度学习模型训练效果。不同的优化算法具有不同的性能和收敛速度。如果选择的优化算法不适合模型或数据集的特点,可能导致训练效果差。 综上所述,深度学习模型训练效果差可能由数据质量、模型架构选择、训练策略、硬件设备限制和优化算法选择等多个因素共同影响。为了改善训练效果,我们可以通过增加高质量的数据、调整模型架构、优化训练策略、升级硬件设备以及尝试不同的优化算法等方式来改进模型的表现。 ### 回答3: 深度学习模型训练效果差可能有以下几个原因: 1. 数据质量不高:深度学习模型对于大量高质量的训练数据的需求非常高。如果训练数据中存在噪声、标签不准确、样本不平衡等问题,会导致模型学习到错误的规律,降低模型性能。 2. 数据量不足:深度学习模型需要大量的训练数据才能学到复杂的特征和模式。如果训练数据量太小,模型可能无法很好地泛化到新的数据上,导致训练效果不佳。 3. 模型复杂度不合适:深度学习模型的复杂度需要合适地匹配任务的复杂度。如果模型过于简单,可能无法捕捉到数据中的复杂特征和模式。而如果模型过于复杂,可能会引发过拟合问题,导致训练集上表现良好但在测试集上泛化能力较差。 4. 训练过程不充分:模型需要通过充分的迭代优化过程来学习数据的特征。可能是由于训练迭代次数不足或优化算法选择不当,导致模型在训练过程中没有达到较好的性能。 5. 超参数选择不当:深度学习模型有很多超参数需要调节,如学习、正则化参数、批大小等。如果超参数选择不当,可能会导致模型在训练过程中收敛缓慢或发散,并且影响模型的泛化性能。 综上所述,深度学习模型训练效果差可能是由于数据质量、数据量、模型复杂度、训练过程和超参数等方面的问题。要提高模型训练效果,需要优化这些因素,并进行实验和调试,找到适合任务的模型和参数设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值