对于刚刚接触深度学习的的童鞋来说,对学习率只有一个很基础的认知,当学习率过大的时候会导致模型难以收敛,过小的时候会收敛速度过慢,其实学习率是一个十分重要的参数,合理的学习率才能让模型收敛到最小点而非局部最优点或鞍点。本文后续内容将会给大家简单回顾下什么是学习率,并介绍如何科学的设置学习率。
首先我们简单回顾下什么是学习率,在梯度下降的过程中更新权重时的超参数,即下面公式中的
θ
=
θ
−
α
∂
θ
∂
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,其思想如下,首先论文中提出了两个参数,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
表示的是当前迭代的步数,注意不是epochs
,step_size
表示的是每隔多少步数进行一次学习率的调整,这个值通常是每个epoch
的步数steps
的2-10倍,例如每个epoch
是500步,那step_size
可以选择2000,三种方法的不同之处就在于scale_fn
:
下图是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 算法会根据网络的表现自动调整学习率。