对于刚刚接触深度学习的的童鞋来说,对学习率只有一个很基础的认知,当学习率过大的时候会导致模型难以收敛,过小的时候会收敛速度过慢,其实学习率是一个十分重要的参数,合理的学习率才能让模型收敛到最小点而非局部最优点或鞍点。本文后续内容将会给大家简单回顾下什么是学习率,并介绍如何科学的设置学习率。

什么是学习率

首先我们简单回顾下什么是学习率,在梯度下降的过程中更新权重时的超参数,即下面公式中的 θ = θ α θ J ( θ )

学习率越低,损失函数的变化速度就越慢,容易过拟合。虽然使用低学习率可以确保我们不会错过任何局部极小值,但也意味着我们将花费更长的时间来进行收敛,特别是在被困在局部最优点的时候。而学习率过高容易发生梯度爆炸,loss振动幅度较大,模型难以收敛。下图是不同学习率的loss变化,因此,选择一个合适的学习率是十分重要的。

如何设置初始学习率

通常来说,初始学习率以 0.01 ~ 0.001 为宜,但这也只是经验之谈,这里为大家介绍一种较为科学的设置方法。该方法是Leslie N. Smith 在2015年的一篇论文 Cyclical Learning Rates for Training Neural Networks 中的3.3节提出来的一个非常棒的方法来找初始学习率。该方法很简单,首先设置一个十分小的学习率,在每个epoch之后增大学习率,并记录好每个epoch的loss或者acc,迭代的epoch越多,那被检验的学习率就越多,最后将不同学习率对应的loss或acc进行对比。

上图是论文中的实验结果,最小学习率是0,最大学习率是0.02,在大概0.01的位置,模型一开始就收敛的很好,因此可以把初始学习率选择为0.01。

再看下网上找到的另外一张图,从上图可以看到,当学习率从小到大变化的工程中,模型的loss在逐渐减小,但是速度慢,达到某个位置后又会急剧增大,这也对应了我们开头说的学习率小收敛慢,学习率大难以收敛。在这个图中可以很明显的选择一个合适的初始学习率0.1。

要注意一点,选择学习的时候,是从小到大,因为当学习率小的时候对loss影响不会很大,并且学习率比上一轮大,可以看做是在原始数据进行更新,如果一开始学习率很大对loss影响是很大的,这个时候再来选择初始学习率那就是无稽之谈了。

学习率衰减

通常在训练一定epoch之后,都会对学习率进行衰减,从而让模型收敛得更好。学习率衰减有以下三种方式:

  • 轮数衰减:每经过n个epochs后学习率减半
  • 指数衰减:每经过n个epochs后学习率乘以一个衰减率
    α t = 1 + d e l a y _ r a t e e p o c h α t 1

学习率衰减的缺点

虽然采用学习率衰减的方法能让模型收敛的更好,但是如果遇到鞍点的时候,模型就没法继续收敛,如下图所示,黑点即是鞍点,如果学习率此时很小,那将永远无法走出鞍点。

Cyclical Learning Rates(CRL)

那么怎么解决这个鞍点的问题,这叫要回到我们上文说到过的论文中了,这篇论文的主要内容其实就是介绍了一种方法,能在遇到鞍点时尽快从中走出去,该方法称为Cyclical Learning Rates,其思想如下,首先论文中提出了两个参数,base_lr和max_lr,我们继续以之前的图讲解,

在0.005的位置,开始出现了acc的负增长之后并趋于平缓,这个点即可作为max_lr,base_lr通常是设置为max_lr的1/3或1/4,因此0.001可以作为base_lr。

接下来就根据这两个参数进行实时的学习率的计算,论文中提到了三种更新学习率的方法:

  • triangular
  • triangular2
  • exp range

从图中可以看到,第一种方法只是在最大学习率与最小学习率中进行选择,第二种和第三种方法会对max_lr进行衰减。

三种计算方法其实都不复杂且效率很高,计算公式如下

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))*scale_fn(x)

其中iterations表示的是当前迭代的步数,注意不是epochsstep_size表示的是每隔多少步数进行一次学习率的调整,这个值通常是每个epoch的步数steps的2-10倍,例如每个epoch是500步,那step_size可以选择2000,三种方法的不同之处就在于scale_fn

  • triangular
    scale_fn=γsteps

下图是CLR和其他情况的对比,可以看到CLR的收敛速度明显优于其他方法,而其中的acc的波动也是因为学习率变大引起的,但是对最终的结果并没有影响。

Cyclical Learning Rates for Training Neural Networks

前言对于刚刚接触深度学习的的童鞋来说,对学习率只有一个很基础的认知,当学习率过大的时候会导致模型难以收敛,过小的时候会收敛速度过慢,但其实学习率是一个十分重要的参数,合理的学习率才能让模型收敛到最小点而非鞍点。本文后续内容将会给大家简单回顾下什么是学习率,并介绍如何改变学习率并设置一个合理的学习率。什么是学习率首先我们简单回顾下什么是学习率,在梯度下降的过程中更新权重时的超参数,即下面公式中...
1. 什么是学习率(Learning rate)?   学习率(Learning rate)作为监督学习以及深度学习中重要的超参,其决定着目标函数能否收敛到局部最小值以及何时收敛到最小值。合适的学习率能够使目标函数在合适的时间内收敛到局部最小值。   这里以梯度下降为例,来观察一下不同的学习率对代价函数的收敛过程的影响(这里以代价函数为凸函数为例):   回顾一下梯度下降的代码:   当学...
exp_range 将CLR扩展名添加到trainer 。 以下代码中的value_range表示(lr_min, lr_max) 。 注意:优化器的attr的初始值将在CLR初始化中被覆盖。 from clr . training . extensions import CLR policy = 'triangular' step_size = 2000 value_range = ( 0.01 , 0.1 ) trainer . extend ( CLR ( 'lr' , value_range , 2 * step_size , policy ))
1. 什么是学习率 调参的第一步是知道这个参数是什么,它的变化对模型有什么影响。 (1)要理解学习率是什么,首先得弄明白神经网络参数更新的机制-梯度下降+反向传播。参考资料:https://www.cnblogs.com/softzrp/p/6718909.html。 总结一句话:将输出误差反向传播给网络参数,以此来拟合样本的输出。本质上是最优化的一个过程,逐步趋向于最优解。但是每一次更新参数利用...
在机器学习的上下文中,超参数是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据。通常情况下,需要对超参数进行优化,给学习机选择一组最优超参数,以提高学习的性能和效果。 在机器学习的上下文中,超参数是在开始学习过程之前设置值的参数。 相反,其他参数的值通过训练得出。 定义关于模型的更高层次的概念,如复杂性或学习能力。 不能直接从标准模型培训过程中的数据中学习,需要预先定义。
Matlab 学习率减半可以通过以下两种方法实现: 1. 手动减半:你可以手动将学习率的值减半,然后重新运行代码。如果你使用的是 Matlab 的神经网络工具箱,你可以在创建网络对象时指定学习率,并在训练过程中对其进行调整。 例如,如果你将学习率设置为 0.1,你可以将其手动减半为 0.05: ```matlab net = feedforwardnet([10 20]); net.trainParam.lr = 0.1; net = train(net,inputs,targets); ```matlab net.trainParam.lr = 0.05; net = train(net,inputs,targets); 2. 使用自适应学习率算法:自适应学习率算法可以根据网络的表现自动调整学习率。例如,Adaptive Learning Rate 和 AdaGrad 算法就是自适应学习率算法的例子。 如果你使用的是 Matlab 的神经网络工具箱,你可以在创建网络对象时指定自适应学习率算法,并在训练过程中对其进行调整。例如,你可以使用 Adagrad 算法: ```matlab net = feedforwardnet([10 20]); net.trainFcn = 'trainscg'; net.trainParam.lr = 0.1; net.trainParam.mc = 0.9; net.trainParam.show = 50; net.trainParam.epochs = 100; net.trainParam.goal = 0.01; net.divideFcn = 'divideind'; net.divideParam.trainInd = 1:70; net.divideParam.valInd = 71:85; net.divideParam.testInd = 86:100; net.performFcn = 'mse'; net = train(net,X,T); 在这个例子中,我们指定了 Adagrad 算法作为网络的训练函数,并设置了一些其他的参数。在训练过程中,Adagrad 算法会根据网络的表现自动调整学习率