一文通透优化算法:从随机梯度、随机梯度降低法到牛顿法、共轭梯度
1 什么是梯度降低法
常常在机器学习中的优化问题中看到一个算法,即梯度降低法,那到底什么是梯度降低法呢?php
维基百科给出的定义是梯度降低法(Gradient descent)是一个一阶最优化算法,一般也称为最速降低法。 要使用梯度降低法找到一个函数的局部极小值,必须向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索。若是相反地向梯度正方向迭代进行搜索,则会接近函数的局部极大值点;这个过程则被称为梯度上升法。算法
额,问题又来了,什么是梯度?为了不各类复杂的说辞,我们能够这样简单理解,在单变量的实值函数的状况,梯度就是导数,或者,对于一个线性函数,也就是线的斜率。api
1.1 梯度降低法示例app
举个形象的例子吧,好比当咱们要作一个房屋价值的评估系统,那都有哪些因素决定或影响房屋的价值呢?好比说面积、房子的大小(几室几厅)、地段、朝向等等,这些影响房屋价值的变量被称为特征(feature)。在这里,为了简单,咱们假定房屋只由一个变量影响,那就是房屋的面积。机器学习
假设有一个房屋销售的数据以下:svg
面积(m^2) 销售价钱(万元)函数
123 250性能
150 320学习
87 160优化
102 220
… …
插句题外话,顺便吐下槽,这套房屋价格数据在五年前可能还能买到帝都5环左右的房子,但如今只能买到二线城市的房屋了。
咱们能够作出一个图,x轴是房屋的面积。y轴是房屋的售价,以下:
若是来了一个新的房子/面积,假设在房屋销售价格的记录中没有的,咱们怎么办呢?
咱们能够用一条曲线去尽可能准的拟合这些数据,而后若是有新的输入面积,咱们能够在将曲线上这个点对应的值返回。若是用一条直线去拟合房屋价格数据,可能以下图这个样子:
而图中绿色的点就是咱们想要预测的点。
为了数学建模,首先给出一些概念和经常使用的符号。
- 房屋销售记录表 – 训练集(training set)或者训练数据(training data), 是咱们流程中的输入数据,通常称为x
- 房屋销售价钱 – 输出数据,通常称为y
- 拟合的函数(或者称为假设或者模型),通常写作 y = h(x)
- 训练数据的条目数(#training set), 一条训练数据是由一对输入数据和输出数据组成的
- 输入数据的维度(特征的个数,#features),n
而后便是一个典型的机器学习的过程,首先给出一个输入数据,咱们的算法会经过一系列的过程获得一个估计的函数,这个函数有能力对没有见过的新数据给出一个新的估计,也被称为构建一个模型。
咱们用X1,X2..Xn 去描述feature里面的份量,好比x1=房间的面积,x2=房间的朝向等等,咱们能够作出一个估计函数:
θ在这儿称为参数,在这儿的意思是调整feature中每一个份量的影响力,就是究竟是房屋的面积更重要仍是房屋的地段更重要。
若是咱们令X0 = 1,就能够用向量的方式来表示了:
咱们程序也须要一个机制去评估咱们θ是否比较好,因此说须要对咱们作出的h函数进行评估,通常这个进行评估的函数称为损失函数(loss function),描述h函数很差的程度,这里咱们称这个函数为J函数。
换言之,咱们把对x(i)的估计值与真实值y(i)差的平方和做为损失函数,前面乘上的系数1/2是为了方便求导(且在求导的时候,这个系数会消掉)。
如何调整θ以使得J(θ)取得最小值有不少方法,其中有最小二乘法(min square),是一种彻底是数学描述的方法,另一种就是梯度降低法。
1.2 梯度降低算法流程
梯度降低法的算法流程以下:
1)首先对θ赋值,这个值能够是随机的,也可让θ是一个全零的向量。
2)改变θ的值,使得J(θ)按梯度降低的方向进行减小。
为了描述的更清楚,给出下面的图:
这是一个表示参数θ与偏差函数J(θ)的关系图,红色的部分是表示J(θ)有着比较高的取值,咱们须要的是,可以让J(θ)的值尽可能的低,也就是达到深蓝色的部分(让偏差/损失最小嘛)。θ0,θ1表示θ向量的两个维度。
在上面提到梯度降低法的第一步是给θ给一个初值,假设随机给的初值是在图上的十字点。
而后咱们将θ按照梯度降低的方向进行调整,就会使得J(θ)往更低的方向进行变化,以下图所示,算法的结束将是在θ降低到没法继续降低为止。
固然,可能梯度降低的最终点并不是是全局最小点,即也多是一个局部最小点,以下图所示:
上面这张图就是描述的一个局部最小点,这是咱们从新选择了一个初始点获得的,看来咱们这个算法将会在很大的程度上被初始点的选择影响而陷入局部最小点。
下面我将用一个例子描述一下梯度减小的过程,对于咱们的函数J(θ)求偏导J:
下面是更新的过程,也就是θi会向着梯度最小的方向进行减小。θi表示更新以前的值,-后面的部分表示按梯度方向减小的量,α表示步长,也就是每次按照梯度减小的方向变化多少。
一个很重要的地方值得注意的是,梯度是有方向的,对于一个向量θ,每一维份量θi均可以求出一个梯度的方向,咱们就能够找到一个总体的方向,在变化的时候,咱们就朝着降低最多的方向进行变化就能够达到一个最小点,无论它是局部的仍是全局的。
用更简单的数学语言进行描述是这样的:
1.3 梯度降低法是否必定降低最快
梯度降低法并不必定是降低最快的方向,它只是目标函数在当前的点的切平面(固然高维问题不能叫平面)上降低最快的方向。在practical implementation中,牛顿方向(考虑海森矩阵)才通常被认为是降低最快的方向,能够达到superlinear的收敛速度。梯度降低类的算法的收敛速度通常是linear甚至sublinear的(在某些带复杂约束的问题)。
通常解释梯度降低,会用下山来举例。假设你如今在山顶处,必须抵达山脚下(也就是山谷最低处)的湖泊。但让人头疼的是,你的双眼被蒙上了没法辨别前进方向。换句话说,你再也不可以一眼看出哪条路径是最快的下山路径,以下图:
最好的办法就是走一步算一步,先用脚向四周各个方向都迈出一步,试探一下周围的地势,用脚感受下哪一个方向是降低最大的方向。换言之,每走到一个位置的时候,求解当前位置的梯度,沿着梯度的负方向(当前最陡峭的位置向下)走一步。就这样,每要走一步都根据上一步所在的位置选择当前最陡峭最快下山的方向走下一步,一步步走下去,一直走到咱们感受已经到了山脚。
固然这样走下去,咱们走到的可能并不必定是真正的山脚,而只是走到了某一个局部的山峰低处。换句话说,梯度降低不必定可以找到全局的最优解,也有可能只是一个局部最优解。固然,若是损失函数是凸函数,梯度降低法获得的解就必定是全局最优解。
总之,梯度降低法的优化思想是用当前位置负梯度方向做为搜索方向,由于该方向为当前位置的最快降低方向,因此也被称为是“最速降低法”。最速降低法越接近目标值,步长越小,前进越慢。梯度降低法的搜索迭代示意图以下图所示:
正由于梯度度降低法在接近最优解的区域收敛速度明显变慢,因此利用梯度降低法求解须要不少次的迭代。在机器学习中,基于基本的梯度降低法发展了两种梯度降低方法,分别为随机梯度降低法和批量梯度降低法。
2 随机梯度降低
普通的梯度降低算法在更新回归系数时要遍历整个数据集,是一种批处理方法,这样训练数据特别忙庞大时,可能出现以下问题:
- 收敛过程可能很是慢;
- 若是偏差曲面上有多个局极小值,那么不能保证这个过程会找到全局最小值。
2.1 随机梯度降低
为了解决上面的问题,实际中咱们应用的是梯度降低的一种变体被称为随机梯度降低。
上面公式中的偏差是针对于全部训练样本而获得的,而随机梯度降低的思想是根据每一个单独的训练样原本更新权值,这样咱们上面的梯度公式就变成了:
通过推导后,咱们就能够获得最终的权值更新的公式:
有了上面权重的更新公式后,咱们就能够经过输入大量的实例样本,来根据咱们预期的结果不断地调整权值,从而最终获得一组权值使得咱们的算法可以对一个新的样本输入获得正确的或无限接近的结果。
这里作一个对比
设代价函数为
参数更新为:
i是样本编号下标,j是样本维数下标,m为样例数目,n为特征数目。因此更新一个θj只须要一个样本就能够。
下面两幅图能够很形象的对比各类优化方法(图来源:http://sebastianruder.com/optimizing-gradient-descent/):
SGD各优化方法在损失曲面上的表现
从上图能够看出, Adagrad、Adadelta与RMSprop在损失曲面上可以当即转移到正确的移动方向上达到快速的收敛。而Momentum 与NAG会致使偏离(off-track)。同时NAG可以在偏离以后快速修正其路线,由于其根据梯度修正来提升响应性。
SGD各优化方法在损失曲面鞍点处上的表现
2.2 批量梯度降低
参数更新为:
i是样本编号下标,j是样本维数下标,m为样例数目,n为特征数目。因此更新一个θj须要遍历整个样本集
此外,如何优化随机梯度法呢?详情请点击:论文公开课第一期:详解梯度降低等各种优化算法(含视频和PPT下载)。
3 牛顿法
3.1 牛顿法
牛顿法(Newton's method)是一种在实数域和复数域上近似求解方程的方法。方法是使用函数f (x)的泰勒级数的前面几项来寻找方程f (x) = 0的根。牛顿法最大的特色就在于它的收敛速度很快。
具体步骤
首先,选择一个接近函数 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矩阵的逆矩阵,计算比较复杂。
3.2 拟牛顿法
拟牛顿法(Quasi-Newton Methods)是求解非线性优化问题最有效的方法之一,于20世纪50年代由美国Argonne国家实验室的物理学家W.C.Davidon所提出来。Davidon设计的这种算法在当时看来是非线性优化领域最具创造性的发明之一。不久R. Fletcher和M. J. D. Powell证明了这种新的算法远比其余方法快速和可靠,使得非线性优化这门学科在一晚上之间日新月异。
维基百科是这么解释拟牛顿法的
拟牛顿法是一种以牛顿法为基础设计的,求解非线性方程组或连续的最优化问题函数的零点或极大、极小值的算法。当牛顿法中所要求计算的Hessian矩阵难以甚至没法计算时,拟牛顿法即可派上用场。
拟牛顿法的本质思想是改善牛顿法每次须要求解复杂的Hessian矩阵的逆矩阵的缺陷,它使用正定矩阵来近似Hessian矩阵的逆,从而简化了运算的复杂度。
拟牛顿法和最速降低法同样只要求每一步迭代时知道目标函数的梯度。经过测量梯度的变化,构造一个目标函数的模型使之足以产生超线性收敛性。这类方法大大优于最速降低法,尤为对于困难的问题。另外,由于拟牛顿法不须要二阶导数的信息,因此有时比牛顿法更为有效。现在,优化软件中包含了大量的拟牛顿算法用来解决无约束,约束,和大规模的优化问题。
拟牛顿法的基本思想以下。
与牛顿法相同, 拟牛顿法是用一个二次函数以近似目标函数
.
的二阶泰勒展开是
其中,
表示
的梯度 ,
表示Hessian矩阵
的近似. 梯度
可进一步近似为下列形式
令上式等于
,计算出Newton步长
,
而后构造
的近似
知足
上式称做割线方程组 .但当
是定义在多维空间上的函数时, 从该式计算
将成为一个不定问题 (未知数个数比方程式个数多).此时,构造
,根据Newton步长更新当前解的处理须要回归到求解割线方程.几乎不一样的拟牛顿法就有不一样的选择割线方程的方法.而大多数的方法都假定
具备对称性 (即知足
). 另外, 下表所示的方法可用于求解
; 在此,
于某些范数与
尽可能接近.即对于某些正定矩阵
, 以如下方式更新
:
如下为该算法的总结:
4 共轭梯度
共轭梯度法是介于梯度降低法(最速降低法)与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了梯度降低法收敛慢的缺点,又避免了牛顿法须要存储和计算Hessian矩阵并求逆的缺点,共轭梯度法不只是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。
在各类优化算法中,共轭梯度法是很是重要的一种。其优势是所需存储量小,具备逐步收敛性,稳定性高,并且不须要任何外来参数。
下图为共轭梯度法和梯度降低法搜索最优解的路径对比示意图: