当前位置: 首页 > 科技观察

神经网络的奥秘与优化器的使用

时间:2023-03-18 00:58:38 科技观察

上一篇文章介绍了我可以只使用Numpy来创建神经网络。这项具有挑战性的工作大大加深了我对神经网络内部运行过程的理解,也让我认识到影响神经网络性能的因素有很多。精心选择的网络架构,合理的超参数,甚至准确的参数初始化都是其中的一部分。本文将重点讨论可以显着影响学习过程速度和预测准确性的决策——优化策略的选择。本文选取了一些常用的优化器,研究其内部工作机制并进行比较。注意:由于我要涵盖的学习材料范围很广,因此没有列出任何代码片段。但是,您可以在GitHub上找到用于创建可视化项的所有代码。此外,我还准备了一些笔记本来帮助大家更好地理解本文所讨论的问题。代码地址:https://github.com/SkalskiP/ILearnDeepLearning.py优化优化是不断搜索参数以最小化或最大化目标函数的过程。我们通常使用间接优化方法训练机器学习模型,选择一个评估指标(例如准确性、精确度或召回率)来指示模型解决给定问题的程度。然而,我们一直在优化一个不同的成本函数J(θ),希望通过最小化成本函数来提高评价指标。毫无疑问,成本函数的选择通常与要解决的具体问题有关。从本质上讲,这种“有意设计”显示了我们离理想解决方案还有多远。众所周知,这个问题相当复杂,值得再写一篇文章来讨论这个话题。沿途的陷阱事实证明,找到非凸成本函数的最小值通常并不容易。本文应用先进的优化策略来定位最小值。如果你学过微积分,你一定知道局部最小值——优化器很容易掉入的最大陷阱之一。对于那些不了解局部极小值之美的读者,我只能说局部极小值是给定区域内函数取最小值的点集。如上图左半部分所示,优化器定位的点不是全局最优解。“鞍点”问题被认为更具挑战性。当成本函数值几乎不再变化时,平台就会形成,如上图的右半部分所示。在这些点上,任何方向的梯度几乎为零,使得函数不可能逃离这个区域。有时,尤其是在多层网络中,我们必须处理成本函数的陡峭区域。陡峭区域的快速梯度增长(即爆炸梯度)会导致大步跳跃,通常会破坏之前的优化结果。然而,这个问题可以通过梯度裁剪轻松解决。梯度下降在学习高级算法之前,让我们了解一些基本策略。最直接有效的方法之一就是在函数上当前点对应的梯度的反方向前进。公式如下:超参数α代表学习率,代表算法每次迭代的前进步长。学习率的选择在一定程度上代表了学习速度和结果准确性之间的权衡。选择太小的步长不利于算法的求解,增加迭代次数。反之,如果步长过大,则很难找到最小值。具体过程如图2所示,图中展示了不稳定的迭代过程。选择合适的步长后,模型几乎立即找到了最小点。图2图2.大学习率和小学习率的梯度下降过程的可视化。为了便于观察,图中仅显示了前10个步骤的可视化。此外,该算法容易受到鞍点问题的影响。我们无法摆脱平台期,因为后续迭代的步长与计算的梯度成正比。最重要的是,由于要求在每次迭代中使用整个训练集,该算法变得效率低下。这意味着在每个epoch中我们必须考虑所有样本以确保执行下一轮优化。对于只有几千个例子的训练集,这可能不是问题。然而,具有数百万样本的神经网络表现最好。基于此,每次迭代都使用整个数据集是难以想象的,既耗时又占用内存。由于以上原因,在大多数情况下不能使用纯梯度下降。mini-batchgradientdescent图3.gradientdescent和mini-batchgradientdescent的对比图。我们首先尝试解决上一节提到的最后一个问题——效率低下。尽可能地,向量化通过一次处理多个训练样本来加速计算,但在使用数百万数据集时优化过程仍然需要很长时间。在这里,我们尝试一种简单的方法——将完整的数据集拆分成许多小的批次用于后续的训练。图3显示了小批量梯度下降的可视化动画。假设左侧图上的等高线表示要优化的成本函数。如图所示,新算法能够快速完成优化,因为它需要处理的数据较少。下面我们来看看两款车型的运动轨迹对比。当噪声较少时,梯度下降采用较少的步数和相对较大的步长。另一方面,小批量梯度下降更频繁地前进,但由于数据集的多样性,噪声更大。甚至有可能在某个迭代期间,算法向与预期相反的方向移动。然而,mini-batch梯度下降通常会一直向最小值移动。图4.将数据集分成批次。您一定想知道如何选择批量大小?以深度学习为例,batchsize通常不是绝对的,要视具体情况而定。如果batchsize等于整个数据集的大小,那么它和普通的梯度下降没什么区别。另一方面,如果batchsize为1,那么该算法每次迭代只适用于数据集中的1个样本,这也失去了矢量化的意义,这种方法有时也称为随机梯度下降。在实践中,我们通常选择中间值——64到512个样本。Exponentiallyweightedaverage指数加权平均有广泛的应用,比如统计学、经济学,甚至深度学习。即使给定点的梯度为0,指数加权平均也会继续优化,因此许多高级神经网络优化算法都使用了这个概念。图5.不同β值的指数加权平均值(EWA)的图形表示。指数加权平均本质上是对之前的值进行平均,避免局部波动,关注整体趋势。指数加权平均的计算方法如上所示,其中参数β控制要平均的数字范围。在随后的迭代中,该算法将使用1/(1-β)个样本。β值越大,平均样本越多,图像越平滑。另一方面,图形向右缓慢移动,因为较长的平均时间范围使指数加权平均适应新趋势的速度较慢。如图5所示,股票的实际收盘价和其他4条曲线显示了不同β值的指数加权平均。MomentumGradientDescentMomentum梯度下降使用指数加权平均来避免成本函数的梯度趋近于零的问题。简单来说,让算法获得动量,这样即使局部梯度为零,算法也可以根据之前计算的值继续向前推进。因此,动量梯度下降几乎总是优于纯梯度下降。和之前一样,我们使用反向传播计算网络每一层的dW和db值。不过,这次我们没有直接使用计算出的梯度来更新神经网络参数,而是先计算出VdW和Vdb的中间值。然后在梯度下降中使用VdW和Vdb。值得注意的是,实现此方法需要在迭代过程中记录指数加权平均值。你可以在Github中看到整个过程。图6.动量梯度下降。让我们试着想象一下指数加权平均对模型行为的影响,并想象一下成本函数的轮廓。上图是标准梯度下降和动量梯度下降的对比。我们可以看到成本函数图的形状使得优化非常缓慢。以股票市场价格为例,使用指数加权平均可以让算法关注未来趋势而不是噪音。最小值分量被放大,振荡分量逐渐消失。此外,如果在后续更新过程中生成的梯度指向相似的方向,学习率将增加,从而导致更快的收敛和更少的振荡。然而,动量梯度下降的缺点是每次接近最小点时动量都会增加。如果动量增加太多,算法将无法停在正确的位置。RMSPropRMSProp(RootMeanSquaredPropagation)是另一种提高梯度下降性能的策略,也是最常用的优化器。该算法还使用指数加权平均。此外,它是自适应的——它允许独立调整模型每个参数的学习率。随后的参数值基于之前为特定参数计算的梯度值。使用图6和上面的公式,让我们思考一下这个策略背后的逻辑。顾名思义,每次迭代我们都会计算特定参数的成本函数的平方导数。此外,从最近的迭代中获得的值使用指数加权平均值进行平均。最后,在更新网络参数之前,将相应的梯度除以平方和的平方根。这意味着梯度越大,参数学习率下降越快;梯度越小,参数学习率下降越慢。通过这种方式,该算法减少了振荡并避免了主导信号的噪声。为了避免被零除(数值稳定性),我们在分母上添加了一个最小值?。我必须承认,在写这篇文章的过程中,我有两个极度兴奋的时刻——我被本文中提到的优化器的快速发展所震惊。第一次是当我注意到标准梯度下降和小批量梯度下降在训练时间上的差异时。第二次是现在,将RMSprop与我知道的每个优化器进行比较。然而,RMSprop也有缺点。随着公式的分母在每次迭代中变大,学习率逐渐变小,最终可能使模型完全停止。图7.优化器比较。Adam***,我再说说ADAM。与RMSProp类似,ADAM被广泛使用并且性能良好。它利用了RMSProp的最佳优势,并结合动量优化的思想,形成快速高效的优化策略。上图展示了本文讨论的几类优化器在处理函数难点部分时的优化过程。亚当的优秀一目了然。不幸的是,随着优化方法有效性的提高,计算复杂性也随之增加。上面列出的是10个矩阵公式,描述了优化过程的单次迭代。我知道那些数学薄弱的读者肯定不会来劲儿。但别担心,它们并不是什么新鲜事。这里的公式和上面给出的动量梯度下降和RMSProp是一样的。但是这里我们需要同时应用这两种策略的思想。小结希望这篇文章能够浅显易懂的把所有的难点都解释清楚。在这篇文章的写作过程中,我明白了选择合适的优化器的重要性。了解以上算法可以让你自由使用优化器,了解每个超参数如何改变整个模型的性能。原文链接:https://towardsdatascience.com/how-to-train-neural-network-faster-with-optimizers-d297730b3713【本文为机器之心专栏原文翻译,微信♂》《机器之心》(id:almosthuman2014)》】点此阅读作者更多好文