深度学习训练出来的损失不收敛_学习率设置技巧,使用学习率来提升我们的模型...

作者:Vitaly Bushaev编译:ronghuaiyang

导读

学习率是深度学习中非常重要的超参数之一,也是我们会经常调整的超参数,通过这篇文章,我们会了解一些技巧,只是通过对学习率的设置,就能够获得性能的提升,是不是很酷?

I. 介绍

大多数优化算法(如SGD、RMSprop、Adam)都需要设置学习率:这是训练深度神经网络最重要的超参数。选择学习率的简单方法是尝试一堆数字,然后使用看起来效果最好的那个,当训练不再能改善损失时,手动减少它。

在这篇文章中,我解决了在使用这种(或类似的)方法时出现的几个问题,并描述了我从Jeremy Howard那里学到的可能的解决方案。

II. 问题是什么?

当你开始训练你的神经网络时,你可能会遇到一些问题:

  1. 为你的学习率选择正确的值可能会成为一个相当繁琐的过程,有时它更像是一门艺术而不是科学。
  2. 当你为超参数选择正确的值时,你会发现训练深层神经网络需要很长时间。这是深度学习的一个常见问题,与学习率没有直接关系,但是我将展示如何选择更好的学习率策略,通过减少优化器必须进行的迭代次数,从而收敛到一个好的局部最小值,从而帮助你减少训练时间。

让我们一次只关注一个问题。

III. 为学习率选择一个正确的值

虽然有一些很好的指导方针来估计一个学习率的合理起点,但是它们并没有提供找到它的通用算法,而且大多数是基于特定场景的,或者有其他的限制,并且不能应用于所有的情况下。

Leslie N. Smith在他的论文"Cyclical Learning Rates for Training Neural Networks."中写道,第3.3节提出了一种确定的方法来估计一个好的学习率。为了做到这一点,你需要以非常低的学习率运行训练,并在每次迭代中线性(或指数)增加它。当损失功能开始急剧增加时,应停止训练。记录每次迭代的学习速率和损失(或准确性)。

完成后,将学习率与损失(或准确性)进行对比。你可能会看到这样的图:

深度学习训练出来的损失不收敛_学习率设置技巧,使用学习率来提升我们的模型..._第1张图片
深度学习训练出来的损失不收敛_学习率设置技巧,使用学习率来提升我们的模型..._第2张图片

上图:学习率图与损失,下图:学习速率与准确度的对比图。

  1. 如果根据损失函数绘制学习率,你应该看到以下内容:当学习率太小时,损失不会有太大的变化,但是随着学习速率的提高,损失会越来越快地减少,直到不再减少,最终开始增加。我们可以直观地认为,我们想要的学习率对应于最低的损失(上图0.1)。然而,在这一点上损失停止减少,我们很可能不会看到任何改进使用这个值。我们想要的是一个稍微偏左一点的,对应于损失仍然在减少的点(越快越好)(在下图大约是0.01)。
  2. 在绘制准确率图表时,请注意,当准确率降低、参差不齐或开始降低时的学习率,就是你想要的值。在下边的图中大约是0 .005 ~ 0.006。

IV. 循环学习率策略

要理解为什么学习率能以任何方式帮助加速训练过程,我们需要理解训练耗时如此之长的一些原因。为了做到这一点,我们需要知道鞍点是什么。

鞍点是函数的导数为零的点,但它不是所有轴上的局部极值。在3D中是这样的:

深度学习训练出来的损失不收敛_学习率设置技巧,使用学习率来提升我们的模型..._第3张图片

鞍点在(0,0,0),一个轴的局部最小值和另一个轴的局部最大值。

Dauphin 等人认为,使损失最小化的困难来自鞍点,而不是糟糕的局部极小值。Ian Goodfellow 等人在其著作 “Deep Learning”中描述了基于梯度的优化算法为何能够逃脱鞍点的数学证明,但它们确实会减慢训练速度,因为在鞍点附近的曲面要平坦得多,而且梯度往往接近于零。

一般的想法是,不是用一个固定的学习速率值随着时间减少,如果训练不再改善我们的损失,我们将根据某个循环函数f在每次迭代中改变学习速率。根据迭代次数,每个周期都有一个固定的长度。该方法使学习率在合理的边界值之间循环变化。这是有帮助的,因为如果我们被卡在鞍点上,提高学习速率可以更快地遍历鞍点的平缓区域。

Leslie N. Smith提出了一种“三角形”方法,该方法在每个周期内,学习速率从最小值线性增加到最大值,然后再次线性减少到最小值。在周期结束时,最小点和最大点之间的差值可以减半。

深度学习训练出来的损失不收敛_学习率设置技巧,使用学习率来提升我们的模型..._第4张图片
深度学习训练出来的损失不收敛_学习率设置技巧,使用学习率来提升我们的模型..._第5张图片

Leslie N. Smith提出的循环学习速率的“三角”和“三角”方法。在上边的图中,min和max lr保持不变。在下边,在每个周期之后,差值减半。

虽然这看起来似乎与直觉相悖,但研究表明,提高学习速度可能会产生短期的负面影响,但也会产生长期的有益影响。Leslie N. Smith继续研究,表明他的方法允许更快的训练,减少了优化收敛到好的局部最小值之前的迭代次数。

Loshchilov & Hutter在他们的论文 “Sgdr: Stochastic gradient descent with restarts”中提出了另一种方法,称为“余弦退火”,即学习速率从余弦函数后的最大值开始递减,然后在下一个周期开始时以最大值“重启”。作者还建议下一个周期比前一个周期长一个常数因子T_mul

深度学习训练出来的损失不收敛_学习率设置技巧,使用学习率来提升我们的模型..._第6张图片
深度学习训练出来的损失不收敛_学习率设置技巧,使用学习率来提升我们的模型..._第7张图片

SGDR图,迭代次数和学习率,上:T_mul = 1,下:T_mul = 2

尽管我只讨论了训练时间,但实际上使用这些技术还有一个更大的优势。研究表明,训练使用循环学习率而不是的固定值,可以提高分类精度。不需要进行调优,而且通常在更少的迭代中进行调优。那么为什么它能提高我们的准确性呢?

虽然深度神经网络通常不会收敛到全局最小值,但在泛化方面存在“好”和“坏”局部最小值的概念。Keskar 等人认为,具有扁平盆地的局部极小值更易于推广。显而易见的是,显著的最小值并不是最好的,因为权重的微小变化往往会极大地改变模型预测。如果学习速率足够大,跨越梯度步骤的内在随机运动将阻止优化器沿着其优化路径到达任何尖锐的盆地。然而,如果学习速率很小,模型往往收敛到最近的局部最小值。也就是说,不断增加学习率可以帮助优化算法摆脱急剧的最小值,从而收敛到一组“好的”权重。

I. Loshchilov和F. Hutter在他们的论文中指出,通过使用SGDR(带重启的随机梯度下降)方法,他们能够降低流行数据集上的最新模型的错误率。

V. 那些都不是最重要的

SGDR提供了许多优势,实际上它还提供了一个优势。受SGDR启发,Huang Huang和Yixuan Li撰写了一篇后续论文“Snapshots Ensemble: Train 1, get M for free”,在这篇论文中,他们展示了如何在使用梯度下降的‘warm restart’时获得更好的效果。

我们知道,随着参数的增加,局部极小值的数量呈指数增长。而现代的深层神经网络可以容纳数百万个神经元。作者指出,虽然大多数的神经网络都有相似的错误率,但相应的神经网络往往会犯不同的错误。这种多样性可以通过集成化来利用——训练具有不同初始化的多个神经网络。它们收敛于不同的解并不奇怪。对这些模型的预测进行平均,可以大幅降低错误率。

Gao Huang和Yixuan Li 能够以训练单个神经网络为代价得到一组网络。他们是这样做的:在每个周期结束时(至少在以后的周期中),神经网络可以收敛到某个局部极小值,或者接近它。当“重新启动”模型将最有可能跳过并开始收敛到另一个优化。Huang和Yixuan Li用SGDR训练他们的模型,并在每个周期后保存权重。然后他们根据最后的M个周期将M个网络加入到他们的集合中。他们的研究表明,模型收敛到的局部最小值足够多样化,不会在错误分类的例子上重叠。使用这种方法可以进一步提高现有模型的错误率。

VI. 结论

使用我在这篇文章中描述的技术,我们几乎可以完全自动化我们处理学习速率的方式,实际上得到更好的结果。尽管这些技术已经存在一段时间了,Jeremy Howard提到并没有太多的研究真正使用它们,考虑到它们的优势,这是非常糟糕的。

英文原文:https://techburst.io/improving-the-way-we-work-with-learning-rate-5e99554f163b

更多文章,请关注微信公众号:AI公园

你可能感兴趣的:(深度学习训练出来的损失不收敛)