【机器学习】优化算法

参考:机器学习常见的优化算法比较

? ? ? ? ? 最全的机器学习中的优化算法介绍

目录

1. 梯度下降算法

1.1 随机梯度下降(SGD)

1.2 动量优化法

Momentum

1.3 批量梯度下降(mini-batch SGD)

2. AdaGrad算法(适应性梯度算法)

3. RMSProp算法(均方根传播)

4. AdaDelta算法

5. Adam算法

6. 牛顿法


记忆方法:

?

想象你在一个山峰上,在不考虑其他因素的情况下,你要如何行走才能最快的下到山脚?当然是选择最陡峭的地方,这就是梯度下降法的核心思想:它通过每次在当前梯度方向(最陡峭的方向)向前“迈”一步,来逐渐逼近函数的最小值。

当然上面只是一个非常易懂的描写,我们知道函数上升最快的方向为梯度,那么梯度的反方向就是函数值下降最快的方向了,因此梯度下降法实际上利用梯度的反方向不断逼近目标函数的最小值。

梯度下降法的更新公式为:

W_{n} = W_{n-1} - \alpha 	imes dW

其中α为梯度上每次逼近的步长,也就是我们常说的学习率。前边的“-”表示搜索方向为负梯度的方向,dW为参数的梯度(因为前面已经有符号-表示方向了,因此这里是一个标量,表示梯度的大小)。算法更新终止的条件是梯度向量接近于0即可。此外需要特别注意的是,梯度下降法不一定能够找到全局的最优解,很有可能找到的是一个局部最优解。

默认的梯度下降法需要利用训练集所有的数据,这样的优势为:全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。但是显然当数据集很大时,每次计算全部数据的梯度,会导致运算量加大,运算时间变长,容易陷入局部最优解。所以,这就引入了另外一种方法——随机梯度下降。

我们可以更好的理解一下,训练的过程。
输入是(x,y),x表示数据,y表示真实标签。通过一个含有参数w的模型,得到预测的标签y'=f(w,x),损失函数为J(w) = loss(y, y),最简单来说loss就是L2损失。
我们的目标是降低损失J(w),尽快到达上图中曲线的最低点。那怎么样速度最快呢?就是沿着梯度降低最快的方向,即负梯度方向,就是小球的运动方向,运动的箭头就是梯度(矢量)。运动的过程就是更新w的过程,可以看到图的横轴就是w的值。

随机梯度下降法是每次使用一个数据进行梯度的计算,而非计算全部数据的梯度。随机梯度下降可能每次不是朝着真正最小的方向,这样反而可以跳出局部的最优解。

随机梯度下降(SGD)与梯度下降(GD)的关系可以这样理解:随机梯度下降方法以损失很小的一部分精确度和增加一定数量的迭代次数为代价,换取了总体的优化效率的提升。增加的迭代次数远远小于样本的数量。

优点:训练速度很快,即使在样本量很大的情况下,可能只需要其中一部分样本就能迭代到最优解。

缺点:

  • 由于单个样本有很大的随机性,单样本的梯度并不是都向着整体最优化方向,因此更新方向不稳定,波动较大。
  • 所有参数都是用同样的learning rate。
  • 容易收敛到局部最优,并且在某些情况下可能被困在鞍点,如下图。(可以理解为单样本的梯度的随机性,致梯度下降的波动非常大,不断在鞍处反弹,难以降低)

再详细介绍一下图,三维中曲面上某点的梯度等于该点的法向量(二维中曲线上某点的梯度等于切线),因此梯度值相同的点构成了曲面上的等高线(右图)。当优化到山鞍部分的时候,梯度下降沿着峡谷的山脊反弹,向最小的方向移动的速度非常慢。

?

动量优化方法引入物理学中的动量思想,加速梯度下降,有Momentum和Nesterov两种算法。当我们将一个小球从山上滚下来,没有阻力时,它的动量会越来越大,但是如果遇到了阻力,速度就会变小,动量优化法就是借鉴此思想,使得梯度方向在不变的维度上,参数更新变快,梯度有所改变时,更新参数变慢,这样就能够加快收敛并且减少动荡。

Momentum

momentum算法思想:参数更新时在一定程度上保留之前更新的方向,同时又利用当前batch的梯度微调最终的更新方向,简言之就是通过积累之前的动量来加速当前的梯度。我们来讲解一下Momentum的由来,将某一时刻的实际采用的梯度称为m_{n}
(1)在没有动量的情况下,该时刻的梯度就是损失函数对W求导的值dW,即:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?m_{n} = dW_{n}

? ? ? ? 然后权重更新的公式是非常标准的:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? W_{n} =W_{n-1} - \alpha m_{n} = W_{n-1} - \alpha dW_{n}? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
(2)引入动量后,实际的梯度m_{n}不仅与此时刻的计算梯度dW_{n}有关,还与上一时刻的实际梯度m_{n-1}有关,根据指数加权平均计算公式m_{n}等于:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? m_{n} =(1-\beta )m_{n-1} + \beta dW_{n}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?W_{n} =W_{n-1} - \alpha m_{n} = W_{n-1} - \alpha (1-\beta )m_{n-1} - \alpha \beta dW_{n}?

但是在实际中,为了简便计算,m_{n}直接由下式计算,即学习率乘以当前计算梯度dW_{n},加上前一次的实际梯度m_{n-1},μ表示动量因子,通常取值0.9。即可以理解为,在当前梯度dW_{n}的基础上增加上一次的实际梯度m_{n-1}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? m_{n} =\mu m_{n-1} + \alpha dW_{n}

之后有:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? W_{n} =W_{n-1} - m_{n}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? W_{n} =W_{n-1} - \mu m_{n-1} - \alpha dW_{n}

在梯度方向改变时,momentum能够降低参数更新速度,从而减少震荡;在梯度方向相同时,momentum可以加速参数更新, 从而加速收敛。总而言之,momentum能够加速SGD收敛,抑制震荡。

mini-batch优化是BGD与SGD的一种折中算法,其变化只利用batch_size大小的数据来计算梯度,即相比于SGD的一个样本数量要多,但是远远小于总数据,比如样本有10万个,mini-batch大小可以选择为10、50、100。使用更多的样本,即可更好的接近函数真实的梯度值,使得优化时参数可着更好的方向移动,减少迂回次数及不确定性。俗称mini-batchSGD,现在我们说batch_size,一般都指mini-batch_size。


AdaGrad算法是梯度下降法最直接的改进。梯度下降法依赖于人工设定的学习率,如果设置过小,收敛太慢,而如果设置太大,可能导致算法那不收敛,为这个学习率设置一个合适的值非常困难。

AdaGrad算法根据前面所有轮迭代的历史梯度值动态调整学习率,且优化变量向量x的每一个分量都有自己的学习率。参数更新公式为:

其中α是学习率,gt是第t次迭代时参数的梯度向量,下标i表示向量的分量。和标准梯度下降法唯一不同的是多了分母中的这一项,它是i这个分量从第1轮到第t轮梯度的平方和,即累积了到本次迭代为止梯度的历史值信息用于生成梯度下降的系数值

可以看到,此时实质上的学习率由α变成了\frac{\alpha}{\sqrt{\sum g^{2}}},随着迭代的增加,学习率是在逐渐变小的。这在“直观上”是正确的:当我们越接近最优解时,函数的“坡度”会越平缓,我们也必须走的更慢来保证不会穿过最优解。这个变小的幅度只跟当前问题的函数梯度有关,\varepsilon是为了防止0除,一般取1e-7。

优点:

  • 解决了SGD中学习率不能自适应调整的问题,开始训练时学习率较大(激励收敛),中后期学习率越来越小(惩罚收敛);
  • 为不同的参数设置不同的学习率,梯度大的的分量具有较大的学习率,梯度小的分量具有较小的学习率

缺点:

  • 学习率单调递减,在迭代后期学习率会变得特别小而导致收敛及其缓慢,甚至提前停止训练。
  • 同样的,我们还需要手动设置初始α

RMSProp算法由Tieleman&Hinton提出,是对AdaGrad的改进,Adagrad会累加之前所有迭代的梯度平方,用梯度平方的指数加权平均代替了至今全部梯度的平方和,避免了后期更新时更新幅度逐渐趋近于0的问题

计算公式如下,\eta是人工设定的学习率:

E[?g^{2}]是梯度平方的指数平均值(对每个分量分别平方),可以看出E[?g^{2}]仅仅取决于当前的梯度值上一时刻梯度平方和的平均值,相比于Adagrad累加之前所有迭代的梯度平方,学习率的衰减速率大大降低。计算前初始化 ? ? ? \dpi{150} E[g^{2}]_{0} = 0

:有效解决了AdaGrade后期学习率过小导致参数更新过于缓慢的问题
:仍需要手动设置全局学习率\eta


RMSProp和AdaDelta是不同研究者在同年提出的,都是对adagrad的改进,从形式上来说,AdaDelta是对RMSProp的分子作进一步的改进,去掉了对人工设置全局学习率的依赖。RMSProp的计算公式上面已经给出,这里将分母简记为RMS,表示梯度平方和的平均数的均方根的意思?:

此外,还将学习率 η 换成了 RMS[Δθ],这样的话,我们甚至就不需要提前设定学习率了:

其中RMS[Δθ]的计算公式与RMS[g]计算公式类似,等于下式开根号,可以看出学习率是通过梯度的历史值确定的

参数更新的迭代公式为:

在计算前需要初始化两个向量为0:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

\dpi{150} E[g^{2}]_{0} = 0

E[\Delta 	heta ^{2}]_{0} = 0

:完全自适应全局学习率,加速效果好?
:后期容易在小范围内产生震荡?

这里需要额外解释一下adadelta的由来。

在此之前可以去看一下牛顿法及海森矩阵相关内容。我们这里直接给出先决的背景知识:

对于机器学习的目标是优化,即找到最小值。

===>求一阶导数

===>对进行二阶的泰勒展开,求一阶导数并令其等于0,可以求得参数的更新方程为:

? ? ? ? ?(公式1)

上面就是背景知识 。

对公式1,可以看出:

进而有:

(公式2)

此外,对于参数更新,我们一般写为:x_{t+1} = x_{t} - lr * g(公式3),其中g为梯度,也就是一阶导数。对比公式3和公式1可以看到,牛顿算法的迭代步长就是,也就是我们所说的学习率。

就是公式2,因此我们将公式2带入公式1,就有:

简单收束变形一下, 然后用RMS来近似:

即:

?参考:AdaDelta算法

? ? ? ? ? ?自适应学习率调整:AdaDelta


这个算法是 计算每个参数的自适应学习率的方法,相当于 RMSprop + Momentum,

除了像 Adadelta 和 RMSprop 一样存储了过去梯度平方和的指数平均值?,也像 momentum 一样保持了过去梯度 mt 的指数衰减平均值。算法用梯度构造了两个向量m和v,前者为动量项,后者累积了梯度的平方和,用于构造自适应学习率。

?如果 mt 和 vt 被初始化为 0 向量,那它们就会向 0 偏置,所以做了偏差校正,通过计算偏差校正后的 mt 和 vt 来抵消这些偏差:

参数的更新公式为:

可以看到,分母与RMSProp和adadelta一样,只是分子引入了动量momentum。


具体可见:机器学习优化算法:牛顿法以及海森矩阵

首先,选择一个接近函数?f?(x)零点的?x0,计算相应的?f?(x0)?和切线斜率f ?'?(x0)(这里f '?表示函数?f ?的导数)。然后我们计算穿过点(x0, ?f ?(x0))?并且斜率为f?'(x0)的直线和?x?轴的交点的x坐标,也就是求如下方程的解:

我们将新求得的点的?x?坐标命名为x1,通常x1会比x0更接近方程f ?(x) = 0的解。因此我们现在可以利用x1开始下一轮迭代。迭代公式可化简为如下所示:

  已经证明,如果f ?'?是连续的,并且待求的零点x是孤立的,那么在零点x周围存在一个区域,只要初始值x0位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果f ?' (x)不为0, 那么牛顿法将具有平方收敛的性能. 粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。下图为一个牛顿法执行过程的例子。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

  由于牛顿法是基于当前位置的切线来确定下一次的位置,所以牛顿法又被很形象地称为是"切线法"。牛顿法的搜索路径(二维情况)如下图所示:

  牛顿法搜索动态示例图:

  关于牛顿法和梯度下降法的效率对比:

  从本质上去看,牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法就更快。如果更通俗地说的话,比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。(牛顿法目光更加长远,所以少走弯路;相对而言,梯度下降法只考虑了局部的最优,没有全局思想。)

  根据wiki上的解释,从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。

注:红色的牛顿法的迭代路径,绿色的是梯度下降法的迭代路径。

牛顿法的优缺点总结:

优点:二阶收敛,收敛速度快;

缺点:牛顿法是一种迭代算法,每一步都需要求解目标函数的Hessian矩阵的逆矩阵,计算比较复杂。

平台注册入口