常用优化方法及其原理


机器学习的各类算法中,常常需要用到最优化算法来求解参数.
这篇文章将总结一下机器学习中常用到的最优化算法,偏数理.
本文将会提到以下5种最优化算法

梯度下降法


梯度下降方法的导出

梯度下降法最核心的部分在于:”当 点可微时, 的梯度方向是 的值增长最快的方向,且沿该方向的变化率就是梯度的模.”
那么相应的,减少最快的方向就是 的负梯度方向了
下面给出其证明:

  1. 方向导数衡量函数在某特定方向l上的变化率,其定义为:

    其中 为方向 上一点, 的距离

  2. 可以证明(用一阶泰勒展开证),方向导数可表示为梯度与 的方向余弦的内积,即:

    其中,限制 方向上的单位向量,它的模为1; 为梯度向量与 的夹角
    这个其实挺容易理解,就是将 方向上的梯度分解到各坐标轴方向.要看详细证明的可以看<数学分析>"方向导数与梯度"章节.
    注意:要使这个式子成立,有前提: rho趋于0.
    因为求方向导数本来就是求 rho趋于0时的极限.这也是后面讲到的迭代步长要小的原因

  3. 可以看到,为0,即方向为梯度方向时,方向导数取最大值.且为梯度向量的模.
    因此, 的梯度方向为 的值增长最快的方向.
    显然,这是在欧氏度量意义下才正确.但不在欧氏空间下的梯度一般没什么意义.


下面用两个小例题解释一下什么叫” 沿着梯度方向改变”:

看到这应该已经非常直白了,f(x)沿着梯度方向改变,就是指其自变量x沿着梯度方向移动.
注意移动的步长要足够小,因为

很自然推出梯度下降算法:


梯度下降法的收敛性

梯度下降法在”f(x)是连续可微实函数”的条件下是收敛的,且收敛于极值点
严格的数学描述及证明看<最优化理论与算法 第二版=""> 陈宝林 P285

牛顿法

上面讲的梯度下降法,我们提到它是用一阶泰勒展开来证明的
我们看一下它一阶泰勒展开是什么样子:

那如果我们用二阶泰勒展开,又会得到什么呢?我们来看一下

泰勒展开的实质是用多项式去逼近原函数.
对于梯度下降法,它只用了一阶泰勒展开,只有一次多项式的信息,因此要找到极值点只能通过方向导数,或者说斜率来寻找.
而对于二阶泰勒展开,我们有了二次多项.
二次多项式有个特点就是,它包含了极点的信息.由于该二次多项式是原函数的逼近,因此找到二次多项式的极值位置就能大概知道原函数的极值位置!
那我们在每次迭代中找近似函数的极值点就好了.
这样的优化可不是一星半点.我们可以想象,梯度下降就是往周围坡度最陡的方向一步一步走;而牛顿法是根据参照物直接找到了谷底大概在哪,然后一下子就跳了过去.
因此,牛顿法的收敛速度一般比梯度下降法快.
直观的看就是这样:

图中展示了 在x=0.7处的泰勒展开.从x=0.7开始迭代,实际极大值点在C.步长设为0.1

显然牛顿法收敛更快.

牛顿法的导出

根据上面的分析,我们进行下面推导

  1. 对f(x)进行泰勒展开,保留其二阶项,记为:

  2. 对x求偏导并令其为0:


    其中,


    为海赛矩阵

看,迭代公式出来了,就是

牛顿法流程


牛顿法的收敛性

非常值得注意的是,牛顿法的最后结果与初始值的选取有很大关系.
从算法提出过程来看,牛顿法是每次迭代都是为了到达近似函数的极值点,因此可能到达极大值点,也可能到达极小值点.
从迭代目标公式可以看到,迭代方向由”负梯度”与”海赛矩阵”共同构成,因此若海赛矩阵非正定,目标函数值可能会上升.若初始点远离极值点,也可能不收敛.

拟牛顿法

牛顿法收敛速度很快,但也有明显的缺陷.海赛矩阵还有可能是奇异的,根本就就不了逆.就算可逆,每次迭代都需要计算海赛矩阵的逆矩阵.当特征成千上万维的时候,计算量会非常大,是不可接受的.而且于是人们希望找到n阶矩阵来替代海赛矩阵的逆矩阵.这样得到的方法就叫拟牛顿法.不同的替代矩阵就得到不同的算法.
要想替代海赛矩阵的逆矩阵,必须先知道海赛矩阵有什么性质.

  1. 对称.显然海赛矩阵是对称矩阵,那么它的逆矩阵也是对阵矩阵.(
  2. 正定.要保证牛顿法搜索方向是下降方向,必须有海赛矩阵为正定的.当然,其逆矩阵也会是正定的.
  3. 从上面牛顿法的导出中我们有公式(*)

    由于 附近是f(x)的近似,因此令 ,



    令:


    则有:



    公式(1)或公式(2)即为第三个,也是最重要的条件,称为”拟牛顿条件”.

如果能找到矩阵满足上面三个条件,我们就认为可以将其作为海赛矩阵的近似.
假设我们现在已经找到了一个初始的近似矩阵 .由于每轮迭代中,海赛矩阵都会更新,因此我们也要考虑该矩阵 的迭代更新如何进行.
不妨假设:


接下来我们看一下不同的的构造.

在这之前,我们先整理一下思路.在计算 之前,我们已知的有 , , .我们希望构造出来的 与已知变量这些有关.
取正定对称矩阵.最简单的当然是单位矩阵.因此一般取 为单位矩阵.

DFP算法(DFP algorithm)


DFP算法的导出

DFP算法核心在于寻找矩阵去逼近海赛矩阵的逆矩阵
即令其满足公式(2)
的寻找我们可以用待定系数法
由于要求 为对称矩阵,我们不妨假设:

由于这里面有四个未知数,我们对它一无所知.因此不可避免地我们起码需要作四个假设才能把它们找出来.
回过头来看待定的式子, 要满足拟牛顿条件(公式(1)),那我们两边先乘个 看看:

稍微换一下位置:

我们会发现 , 都是常数.
既然是数,我们也不妨添加两个假设:

从这两个假设中我们可以得到:


有了这两个假设,我们的式子变成了这样:

若满足拟牛顿条件,则有:

还需要两个假设,那我们可以大胆地令:

好啦,四个假设用光了,我们将四个假设代回公式(3),我们有:
由于 为对称阵, ,上面的式子可以稍微化简:

这就是我们找到的迭代目标.
只要给出一个正定对称阵作为初始矩阵 ,在之后的迭代里, 都将满足上面的三个条件.认为其可以替代海赛矩阵的逆矩阵.
这就是DFP算法的核心

DFP算法流程

BFGS算法

DFP算法虽然很厉害,但却很快被BFGS算法代替.实践证明BFGS算法性能更好.因此也是目前流行的拟牛顿法.

BFGS算法的导出

BFGS算法核心在于寻找矩阵去逼近海赛矩阵
即令其满足公式(1).
与上面的DFP算法一样,先用待定系数法,假设

两边乘 ,然后作以下四个假设:

我们能得到迭代公式:

BFGS算法流程

L-BFGS算法

L-BFGS算法看名字就知道是BFGS算法的优化.BFGS算法又有什么地方需要优化呢?
显然BFGS算法把计算量降了下来,但仍然需要储存矩阵或者.
这个矩阵是非常大的,我们来计算一下. 假设特征有十万维,每个数字占用4字节.那么这个矩阵占用的内存是:

而十万维在NLP中根本就是稀松平常的事情,甚至说远不止十万维.因此这就是需要优化的地方.
L-BFGS算法的思想是不储存,而是用的时候再通过递推公式计算.因此需要储存的只有, .
甚至仅储存最新的前m个:

具体的计算推导可以参考这篇文章 传送门.

The END

关于优化方法就讲到这啦.总结一下.

  1. 梯度下降法属于一阶优化,利用负梯度找函数最小值点或鞍点.
  2. 牛顿法属于二阶优化,利用泰勒展开获得二次逼近函数,利用逼近函数的极值找函数极值.
  3. 拟牛顿法显然也都是二阶优化,解决了牛顿法计算量大的问题.
    其中L-BFGS算法又解决了拟牛顿法占用内存大的问题.

这些算法都只能找到局部极小值点.
要确保找到的是全局最小值,其充分条件是函数为光滑凸函数(Convex function).
若不是光滑凸函数,可以考虑近似或转换为光滑凸函数.

要想找到任意函数的最小值,可以考虑一些智能优化算法如:

在这里就不展开讲了.

好啦,文章就到这啦.
页面下方有我的邮箱.如果有不当的地方欢迎指出.


E-mail: liangyaorong1995@outlook.com