人工智能程序员面试笔试宝典
上QQ阅读APP看书,第一时间看更新

2.6 常用梯度下降法与优化器

机器学习中的大部分问题都是优化问题,而绝大部分优化问题都可以使用梯度下降法处理,其数学原理是函数沿梯度方向具有最大的变化率,那么在优化目标函数时沿着负梯度方向去减小函数值,以此达到优化目标。

梯度方向如下:

沿着负梯度方向去减小函数值用表达如下:

以上公式就执行了一步梯度下降,在算法中会重复到满足收敛条件为止。

所以梯度下降是一种优化算法,通过迭代的方式寻找模型的最优参数;最优参数即指使目标函数达到最小值时的参数。如果目标函数是凸函数,那么梯度下降的解是全局最优解,不过在一般情况下,梯度下降无法保证全局最优。

2.6.1 随机梯度下降与小批量随机梯度下降

上面介绍的梯度下降法每次使用所有训练样本的平均损失来更新参数,所以每次对模型参数进行更新时需要遍历所有数据。但如果训练样本的数量太大会消耗相当大的计算资源,所以随机梯度下降(SGD)每次使用单个样本的损失来近似平均损失。

由于随机梯度下降(SGD)只采用一部分样本来估计当前的梯度,所以对梯度的估计准确度不高,常常出现偏差,并导致目标函数收敛不稳定,甚至不收敛。

小批量随机梯度下降就是为了降低随机梯度的方差,使模型迭代更加稳定,所以使用一批随机数据的损失来近似平均损失。通过批量训练还有个优点就是利用高度优化的矩阵运算以及并行计算框架。同时需要注意的是,由于批的大小为2的幂时能充分利用矩阵运算操作,所以批的大小一般取32、64、128、256等。

2.6.2 动量算法

动量方法有点类似于二阶梯度算法,参数更新公式如下:

从形式上看,动量算法引入了变量v充当速度角色,以及相关的超参数αα一般取0.5、0.9、0.99,分别对应最大2倍、10倍、100倍的步长。

动量算法可以用来解决鞍点问题;也可以用于SGD加速,特别是针对高曲率、小幅但是方向一致的梯度对象。动量方法的训练过程更加稳定;同时在鞍点处因为惯性的作用,更有可能离开平缓的梯度部分。

随机梯度下降法每次更新的步长只是梯度乘以学习率;而动量算法的步长还取决于历史梯度序列的大小和排列;当若干连续的梯度方向相同时,步长会被不断增大。

2.6.3 NAG算法(Nesterov动量)

NAG是对参数施加当前速度后才进行梯度计算的。这个设计让算法有了对前方环境预判的能力,换句话讲,NAG算法相当于在标准动量方法中添加了一个修正因子,并且在计算参数的梯度时,在损失函数中减去了动量项。参数更新公式如下:

2.6.4 自适应学习率算法

学习率决定了参数空间搜索的步长,所以非常重要,但也比较难设置。过大的学习率会导致优化的方向变化不稳定,过小的学习率会容易使得模型收敛于局部最优解,因此学习率的设置对模型的性能有显著的影响。而自适应学习率算法就可以根据参数更新的次数来自动调整学习率。在刚开始学习时,由于参数的值距离最优值较远所以使用较大的学习率,后来随着参数值越来越逼近最优值,应使用比较小的学习率。以下介绍3种重要的自适应率学习算法。

(1)AdaGrad

AdaGrad算法虽然可以自动适应学习率,但还需设定一个全局的学习率ε,这并非实际的学习率,而是与以往参数的模的和成反比的,具有损失最大偏导数的参数学习率下降比较快,而具有小偏导数的参数在学习率上下降比较小。具体见公式:

算法的具体步骤如下:

需要预先设定的值:全局学习率,初始参数θ,数值稳定量δ

中间变量:梯度累积量r

迭代过程如公式:

Adagrad更新参数的过程如下:

其中,gt为参数的梯度。

(2)RMSProp

RMSProp算法是AdaGrad算法的升级版,在非凸优化问题上表现很好,因为它使用指数衰减来处理历史信息,可以使得模型在找到凸结构后快速收敛。RMSProp与AdaGrad的区别在于用来控制历史信息获取的衰减系数,算法的具体步骤如下:

需要预先设定的值:全局学习率全局学习率ε,初始参数θ,数值稳定量δ,衰减系数ρ;

中间变量:梯度累积量r

迭代过程如公式:

RMSProp可以解决AdaGrad在多隐层网络中过早结束训练的缺点,适合处理非平稳的目标,但同时也引入了新的超参数衰减系数,并且依旧依赖于全局学习率。

(3)Adam

Adam(Adaptive Moment Estimation)是非常常见的深度学习训练时使用的优化器。相比于AdaGrad算法,Adam能让每次迭代的学习率处在一定范围内,因而比较稳定。

算法的具体过程如下:

需要预先设定的值:步长因子ε,初始参数θ,数值稳定量δ,一阶动量衰减系数ρ1,二阶动量衰减系数ρ2(其中默认的取值:ε=0.001,δ=10-8,ρ1=0.9,ρ2=0.999)。

中间变量:一阶动量s,二阶动量r

迭代过程如下:

优化算法的选择并没有绝对的原则,没有哪个算法具有绝对优势,应根据具体任务来选择。事实上在面对具体问题时可以将Adam和RMSprop都训练一次,比较结果差距,再选择恰当的优化器。

2.6.5 试比较牛顿迭代法与梯度下降法

首先介绍牛顿迭代法的基本思想:在现有极小点的估计值xk的附近,对f(x)做二阶泰勒展开,从该点的附近找到极值点的下一个估计值。这里设xk为当前的估计值,那么f(x)在xk附近的二阶泰勒展开式为(省略关于x-xk的高阶项):

由于求的是最值,由极值的必要条件可知,φ(x)应该满足:

φ′(x)=0

f′(xk)+f′′(xk)(x-xk)=0

从而求得

于是给定初始值x0,就可以得到如下的迭代式

由此产生序列{xk}可以逼近f(x)的极小点。

在二维的情况下,二阶泰勒展开式可以推广,此时

其中∇ff的梯度方向,∇2ff的海森矩阵(Hessian matrix),它们的定义分别是

f(Xk)和∇2f(Xk)则表示取X=Xk时得到的实值向量和矩阵,简记gkHk(这里的g表示gradient,H表示Hessian)。由于极值的必要条件是极值点是φ(X)的驻点,即

φ(X)=0

gk+Hk·(X-Xk)=0

所以若矩阵Hk非奇异,则有

当给定初始值X0,可以得到如下的迭代式

迭代式中的,称为牛顿方向,下面给出完整的牛顿迭代算法:

1)给定初值X0和精度的阈值ε,并令k=0。

2)计算gkHk

3)若,则停止迭代,否则确定搜索方向

4)计算新的迭代点Xk+1=Xk+dk

5)令k=k+1,转到步骤2)。

由上可得梯度下降法与牛顿下降法最大区别是梯度下降法使用的梯度信息是一阶导数,而牛顿法除了一阶导数外,还会使用二阶导数的信息。

牛顿法的优点是收敛速度快,能用更少的迭代次数找到最优解,缺点是每一步都需要求解目标函数的Hessian矩阵的逆矩阵,计算量非常大。

常见面试笔试题:

以下说法错误的一项是( )。

A.相比起AdaGrad算法,RMSProp算法在非凸优化中效果更好

B.当目标函数是凸函数时,梯度下降法的解是全局最优解

C.梯度下降法比牛顿法收敛速度快D.拟牛顿法不需要计算Hesse矩阵

分析:选C。牛顿法需要二阶求导,梯度下降法只需一阶,因此牛顿法比梯度下降法的收敛速度更快。