联系我们
- 地 址:北京市海淀区北四环西路9号 ,主 营:人脸识别,活体检测,身份证识别,银行卡识别,名片识别,车牌识别,OCR识别等及智能识别技术。
- 电 话:13146317170 廖经理
- 传 真:
- 邮 箱:398017534@qq.com
关于AI深度学习中的梯度下降算法
关于AI深度学习中的梯度下降算法
1 引言
梯度降落法是最著名的优化算法之一,也是迄今优化神经网络时最常用的办法。同时,在每一个最新的深度学习库中都包含了各种优化的梯度降落法的完成(例如:参见lasagne,caffe和keras的文档)。但是,这些算法通常是作为黑盒优化器运用,因而,很难对其优点和缺陷的停止实践的解释。
本文旨在让读者对不同的优化梯度降落的算法有直观的认识,以协助读者运用这些算法。在第2局部,我们首先引见梯度降落的不同变形方式。在第3局部,我们将扼要总结在锻炼的过程中所面临的应战。随后,在第4局部,我们将引见最常用的优化算法,包括这些算法在处理以上应战时的动机以及如何得到更新规则的推导方式。在第5局部,我们将简单讨论在并行和散布式环境中优化梯度降落的算法和框架。最后,在第6局部,我们将考虑对优化梯度降落有用的一些其他战略。
梯度降落法是最小化目的函数的一种办法,其中,为模型参数,梯度降落法应用目的函数关于参数的梯度的反方向更新参数。学习率决议到达最小值或者部分最小值过程中所采用的步长的大小。即,我们沿着目的函数的斜面降落的方向,直到抵达谷底。假如你对梯度降落法不熟习,你能够从http://cs231n.github.io/optimization-1/找到引见神经网络优化的资料。
2 梯度降落法的变形方式
梯度降落法有3中变形方式,它们之间的区别为我们在计算目的函数的梯度时运用到几数据。依据数据量的不同,我们在参数更新的精度和更新过程中所需求的时间两个方面做出权衡。
2.1 批梯度降落法
Vanilla梯度降落法,又称为批梯度降落法(batch gradient descent),在整个锻炼数据集上计算损失函数关于参数的梯度:
由于在执行每次更新时,我们需求在整个数据集上计算一切的梯度,所以批梯度降落法的速度会很慢,同时,批梯度降落法无法处置超出内存容量限制的数据集。批梯度降落法同样也不能在线更新模型,即在运转的过程中,不能增加新的样本。
批梯度降落法的代码如下所示:
for i in range(nb_epochs):
params_grad = evaluate_gradient(loss_function, data, params)
params = params - learning_rate * params_grad
1
2
3
关于给定的迭代次数,首先,我们应用全部数据集计算损失函数关于参数向量params的梯度向量params_grad。留意,最新的深度学习库中提供了自动求导的功用,能够有效地计算关于参数梯度。假如你本人求梯度,那么,梯度检查是一个不错的主见(关于如何正确检查梯度的一些技巧能够参见http://cs231n.github.io/neural-networks-3/)。
然后,我们应用梯度的方向和学习率更新参数,学习率决议我们将以多大的步长更新参数。关于凸误差函数,批梯度降落法可以保证收敛到全局最小值,关于非凸函数,则收敛到一个部分最小值。
2.2 随机梯度降落法
相反,随机梯度降落法(stochastic gradient descent, SGD)依据每一条锻炼样本和标签更新参数:
关于大数据集,由于批梯度降落法在每一个参数更新之前,会对类似的样本计算梯度,所以在计算过程中会有冗余。而SGD在每一次更新中只执行一次,从而消弭了冗余。因此,通常SGD的运转速度更快,同时,能够用于在线学习。SGD以高方差频繁地更新,招致目的函数呈现如图1所示的猛烈动摇。
这里写图片描绘
图1:SGD动摇(来源:Wikipedia)
与批梯度降落法的收敛会使得损失函数堕入部分最小相比,由于SGD的动摇性,一方面,动摇性使得SGD能够跳到新的和潜在更好的部分最优。另一方面,这使得最终收敛到特定最小值的过程变得复杂,由于SGD会不断持续动摇。但是,曾经证明当我们迟缓减小学习率,SGD与批梯度降落法具有相同的收敛行为,关于非凸优化和凸优化,能够分别收敛到部分最小值和全局最小值。与批梯度降落的代码相比,SGD的代码片段仅仅是在对锻炼样本的遍历和应用每一条样本计算梯度的过程中增加一层循环。留意,如6.1节中的解释,在每一次循环中,我们打乱锻炼样本。
for i in range(nb_epochs):
np.random.shuffle(data)
for example in data:
params_grad = evaluate_gradient(loss_function, example, params)
params = params - learning_rate * params_grad
1
2
3
4
5
2.3 小批量梯度降落法
小批量梯度降落法最终分离了上述两种办法的优点,在每次更新时运用个小批量锻炼样本:
这种办法,a)减少参数更新的方差,这样能够得到愈加稳定的收敛结果;b)能够应用最新的深度学习库中高度优化的矩阵优化办法,高效地求解每个小批量数据的梯度。通常,小批量数据的大小在50到256之间,也能够依据不同的应用有所变化。当锻炼神经网络模型时,小批量梯度降落法是典型的选择算法,当运用小批量梯度降落法时,也将其称为SGD。留意:在下文的改良的SGD中,为了简单,我们省略了参数。
在代码中,不是在一切样本上做迭代,我们如今只是在大小为50的小批量数据上做迭代:
for i in range(nb_epochs):
np.random.shuffle(data)
for batch in get_batches(data, batch_size=50):
params_grad = evaluate_gradient(loss_function, batch, params)
params = params - learning_rate * params_grad
1
2
3
4
5
3 应战
固然Vanilla小批量梯度降落法并不能保证较好的收敛性,但是需求强调的是,这也给我们留下了如下的一些应战:
选择一个适宜的学习率可能是艰难的。学习率太小会招致收敛的速度很慢,学习率太大会阻碍收敛,招致损失函数在最小值左近动摇以至偏离最小值。
学习率调整[17]试图在锻炼的过程中经过例如退火的办法调整学习率,即依据预定义的战略或者当相邻两代之间的降落值小于某个阈值时减小学习率。但是,战略和阈值需求预先设定好,因而无法顺应数据集的特性[4]。
此外,对一切的参数更新运用同样的学习率。假如数据是稠密的,同时,特征的频率差别很大时,我们或许不想以同样的学习率更新一切的参数,关于呈现次数较少的特征,我们对其执行更大的学习率。
高度非凸误差函数普遍呈现在神经网络中,在优化这类函数时,另一个关键的应战是使函数防止堕入无数次优的部分最小值。Dauphin等人[5]指出呈现这种艰难实践上并不是来自部分最小值,而是来自鞍点,即那些在一个维度上是递增的,而在另一个维度上是递加的。这些鞍点通常被具有相同误差的点包围,由于在恣意维度上的梯度都近似为0,所以SGD很难从这些鞍点中逃开。
4 梯度降落优化算法
下面,我们将罗列一些算法,这些算法被深度学习社区普遍用来处置前面提到的应战。我们不会讨论在实践中不合适在高维数据集中计算的算法,例如诸如牛顿法的二阶办法。
4.1 动量法
SGD很难经过陡谷,即在一个维度上的外表弯曲水平远大于其他维度的区域[19],这种状况通常呈现在部分最优点左近。在这种状况下,SGD摇晃地经过陡谷的斜坡,同时,沿着底部到部分最优点的途径上只是迟缓地行进,这个过程如图2a所示。
这里写图片描绘
图2:来源:Genevieve B. Orr
如图2b所示,动量法[16]是一种协助SGD在相关方向上加速并抑止摇晃的一种办法。动量法将历史步长的更新向量的一个重量增加到当前的更新向量中(局部完成中交流了公式中的符号)
动量项通常设置为0.9或者相似的值。
从实质上说,动量法,就像我们从山上推下一个球,球在滚下来的过程中累积动量,变得越来越快(直抵达到终极速度,假如有空气阻力的存在,则)。同样的事情也发作在参数的更新过程中:关于在梯度点处具有相同的方向的维度,其动量项增大,关于在梯度点处改动方向的维度,其动量项减小。因而,我们能够得到更快的收敛速度,同时能够减少摇晃。
4.2 Nesterov加速梯度降落法
但是,球从山上滚下的时分,自觉地沿着斜率方向,常常并不能令人称心。我们希望有一个智能的球,这个球可以晓得它将要去哪,以致于在重新遇到斜率上升时可以晓得减速。
Nesterov加速梯度降落法(Nesterov accelerated gradient,NAG)[13]是一种可以给动量项这样的预知才能的办法。我们晓得,我们应用动量项来更新参数。经过计算可以通知我们参数将来位置的一个近似值(梯度并不是完整更新),这也就是通知我们参数大致将变为几。经过计算关于参数将来的近似位置的梯度,而不是关于当前的参数的梯度,我们能够高效的求解 :
同时,我们设置动量项大约为0.9。动量法首先计算当前的梯度值(图3中的小的蓝色向量),然后在更新的累积梯度(大的蓝色向量)方向上行进一大步,Nesterov加速梯度降落法NAG首先在先前累积梯度(棕色的向量)方向上行进一大步,计算梯度值,然后做一个修正(绿色的向量)。这个具有预见性的更新避免我们行进得太快,同时加强了算法的响应才能,这一点在很多的任务中关于RNN的性能提升有着重要的意义[2]。
这里写图片描绘
图3:Nesterov更新(来源:G. Hinton的课程6c)
关于NAG的直观了解的另一种解释能够参见http://cs231n.github.io/neural-networks-3/,同时Ilya Sutskever在其博士论文[18]中给出更细致的综述。
既然我们可以使得我们的更新顺应误差函数的斜率以相应地加速SGD,我们同样也想要使得我们的更新可以顺应每一个单独参数,以依据每个参数的重要性决议大的或者小的更新。
4.3 Adagrad
Adagrad[7]是这样的一种基于梯度的优化算法:让学习率顺应参数,关于呈现次数较少的特征,我们对其采用更大的学习率,关于呈现次数较多的特征,我们对其采用较小的学习率。因而,Adagrad十分合适处置稠密数据。Dean等人[6]发现Adagrad可以极大进步了SGD的鲁棒性并将其应用于Google的大范围神经网络的锻炼,其中包含了YouTube视频中的猫的辨认。此外,Pennington等人[15]应用Adagrad锻炼Glove词向量,由于低频词比高频词需求更大的步长。
上一条:什么是AI中的神经网络
下一条:工商营业执照OCR识别技术