在机器学习的模型优化求解中必然用到优化算法,其地位在机器学习领域不可小觑。本文将对常见的优化算法进行简单总结。
1. 梯度下降
梯度下降法(GD,gradient descent)也许是求解无约束最优化问题的最为常用最为经典的一种方法,实现简单,易于理解。该类方法基于梯度负方向搜索最优值,而梯度方向在几何学中直观的解释是曲面中坡度最为陡峭的方向,所以沿着坡度陡峭的方向寻优的思想非常直观的,因此GD算法又称为最速下降法(steepest descent)。下面从数学原理上解释这个优化算法。
考虑无约束优化问题
minxf(x)
,其中
f(x)
是在
RD
上具有一阶连续偏导的函数。GD算法是一种迭代算法,选取适当的初始值
x(0)
,不断迭代并更新
x
的值,进行目标函数的极小化,直到收敛。假设第
k
次迭代值为
x(k)
,则根据目标函数的性质,我们可以将
f(x)
在
x(k)
附件进行一阶泰勒展开:
f(x)=f(x(k))+gTk(x−x(k))
其中
gk=g(x(k))=∇f(x(k))
为
f(x)
在
x(k)
的梯度。欲使下一步的取值
f(x)<f(x(k))
,我们可将上式中的
x−x(k)=−λgk
,其中
λ>0
称为学习率或步长,则很容易得到
f(x)<f(x(k))
。因此下一步的取值为
x(k+1)←x(k)−λgk
上式再次表面GD算法在当前点的负梯度方向
−gk
上,移动一个小的步长
λ
得到下一个优化点,不断迭代使得
f(x)
下降。在机器学习中,我们往往是根据所有训练样本的loss得到一个优化目标函数,当
−gk
是针对所有训练样本的梯度,则这类梯度下降方法称为批量梯度下降(BGD, batch gradient descent);当
−gk
是针对随机的部分训练样本的梯度,则这类梯度下降方法称为随机梯度下降(SGD, stochastic gradient descent)。可知,BGD每次迭代更新都要用到训练集中所有样本计算梯度,当训练集规模较大时,收敛速度会严重变慢;而SGD每次迭代更新随机选择一部分(mini-batch)样本计算梯度,由于噪声干扰,也许SGD的搜索并不都是朝着最优方向,但是它以牺牲部分精确度和更多的迭代次数来换取整体的优化效率。
GD算法基于梯度方向搜索最优值,但值得指出的是:
- GD算法能保证目标函数是凸函数的情况下得到全局最优解,一般情况下只能陷入局部最优。这种情况我们可以设置多组初始解来缓解局部最优。
- 学习率难以自适应确定。据此,Momentum,Adagrad,Adam,Nadam等学习率自适应方法相继提出。基本出发点是加入学习率约束,使得下降初期得到很好的加速,中后期能抑制振荡,从而加快收敛。
- 这类方法收敛速度未必最快,尤其当接近最优区域时,即
gk→0
时,会使收敛速度明显变慢。通过上述的学习率约束能缓解这一问题。
2. 牛顿法
牛顿法(Newton method)和拟牛顿法(quasi Newton method)也是求解无约束最优化问题的常用方法,有收敛速度快的优点。
同样考虑无约束优化问题
minxf(x)
,其中
f(x)
是在
RD
上具有二阶连续偏导的函数。假设第
k
次迭代值为
x(k)
,则根据目标函数的性质,我们可以将
f(x)
在
x(k)
附件进行二阶泰勒展开:
f(x)≈f(x(k))+gTk(x−x(k))+12(x−x(k))H(x(k))(x−x(k))
其中
gk=g(x(k))=∇f(x(k))
为
f(x)
在
x(k)
的梯度,
H(x(k))
是
f(x)
的海塞矩阵(Hesse matrix)
H(x)=[∂2f∂xi∂xj]D×D
在
x(k)
的值。由二阶泰勒展开式得知,用了一个二次曲面去近似真实的
f(x)
,有了
f(x)
的近似表达式,我们只需要取其一阶导数为0的点必为极值点。令
∇f(x)=0
,得
∇f(x)=gk+Hk(x−x(k))=0
这样,第
k+1
步的最优值为
x(k+1)=x(k)−H−1kgk
这就是牛顿法。特别是当
H(x(k))
为正定矩阵时(
H−1k
也为正定矩阵),函数
f(x)
的极值为极小值,因为搜索方向任然是
−gk
负梯度方向,证明如下:因为
x(k+1)=x(k)−H−1kgk
,那么
f(x(k+1))
在点
x(k)
出的一阶泰勒展开为:
f(x(k+1))=f(x(k))−gTkH−1kgk
由于
H−1k
为正定矩阵,因此
gTkH−1kgk>0
,搜索方向仍为下降方向。牛顿法是用一个二次曲面去拟合真实的局部曲面,进而在二次曲面上寻找最优点作为下一个点;而梯度下降方法是用一个平面去拟合,而根据平面的梯度方向增加一个步长作为下一个点;梯度下降法仅考虑了当前点的梯度,而牛顿法还利用二阶导数信息把握了梯度变化的趋势,因而能够确定更合适的搜索方向加快收敛。可知,牛顿法更符合真实的最优下降路径。缺点是:
- 牛顿法对目标函数有比较高的要求,必须一阶二阶可导,海赛矩阵必须正定;
- 计算量比较大,除了计算梯度以外,还要计算海赛矩阵及其逆矩阵;
- 当目标函数不是完全的凸函数时,容易陷入鞍点,导致更新朝着错误的方向移动;
在牛顿法的每一次迭代中都需要计算海塞矩阵的逆矩阵,计算较复杂。考虑用一个
D
阶正定矩阵来近似代替
H−1k
,这就是拟牛顿法的基本思想。下面我们看一下牛顿法迭代中
Hk
满足的条件,由于
∇f(x)=gk+Hk(x−x(k))
,则:
gk+1−gk=Hk(x(k+1)−x(k))
上式即为
Hk
满足的条件,称为拟牛顿条件。若将
Gk
作为
H−1k
的近似,则要求
Gk
满足同样的条件。而在每次迭代中,可以选择更新矩阵
Gk+1
:
Gk+1=Gk+δGk
不同的选择构成了不同的算法,比如DFP,BFGS算法等。
3. 坐标下降法
坐标下降法(coordinate descent)是一种非梯度优化方法,在每步迭代中沿一个坐标方向进行搜索,通过循环使用不同的坐标方向来达到目标函数的极小值。
CD算法思想简单,且不需要计算目标函数的梯度,在每步迭代中仅需求解一维搜索问题,对于某些复杂问题计算较为简单。但若目标函数不光滑,则坐标下降法可能陷入非驻点。CD的思想其实在很多算法中有体现,比如SMO算法等。
4. 共轭梯度法
共轭梯度法(CG, conjuage gradient method)最初由Hesteness和Stiefel于1952年为求解线性方程组而提出的。后来,逐渐用于求解无约束最优化问题,使之成为一种重要的最优化方法。共轭梯度法的基本思想是把共轭性与最速下降方法相结合,利用已知点处的梯度构造一组共轭方向,并沿这组方向进行搜素,求出目标函数的极小点。根据共轭方向基本性质,这种方法具有二次终止性,所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。其介于最速下降法与牛顿法之间的一个方法,仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。 在各种优化算法中,共轭梯度法是非常重要的一种。
共轭方向法的思想就是在
D
维优化问题中,每次沿一个方向优化得到极小值,后面再沿其他方向求极小值的时候,不会影响前面已经得到的沿那些方向上的极小值,所以理论上对
D
个方向都求出极小值就得到了
D
维问题的极小值。这组方向由于两两共轭,即
dTkQdk+1=0
,其中
Q
为正定矩阵,那么称方向
dk
与方向
dk+1
共轭。
扫描二维码关注公众号,回复:
876558 查看本文章
下面考虑如下优化问题:
minxc+bTx+12xTQx
其中
x∈RD
。根据共轭梯度法的步骤,假定某一迭代点
xk
和其搜索方向
dk
,则根据搜索方向
dk
移动一个步长到下一点
x(k+1)
,其中步长可根据line search策略得到;计算点
x(k+1)
处的负梯度
−gk+1
,若该点梯度不为0,则根据
−gk+1
和
dk
构造下一个搜索方向
dk+1
,且必须满足
dk
与
dk+1
关于
Q
共轭。简单来说:
dk+1=−gk+1+βkdk
上式两端同时左乘
dTkQ
得
dTkQdk+1=0=−dTkQgk+1+βkdTkQdk
则
βk=dTkQgk+1dTkQdk
,这样再从点
x(k+1)
出发沿
dk+1
方向搜索,直到收敛;否则收敛,得到最优解
x(k+1)
。注意初始搜索方向
d1
必须初始化为最速下降方向,这一点决不可忽视。
CG算法的另一种解释:首先找到
D
个
Q
-conjugate的向量
{dk}Di=1
;对于空间中任意向量
x=∑Diαidi
,其中
dTiQdj=0
。将此式带入上述的二阶泰勒展开目标函数,那么优化问题变为了对
{αi}Di=1
的问题,对它们分别优化即可。最后我们就能得到
x∗
。CG的基本思想:每一轮把某一方向优化彻底,保证后面的优化不再对这个方向做任何操作,理论上只需要
D
次就得到精确解。所以本质上,就是把目标函数分成许多方向,然后不同方向分别求出极值在综合起来。
这些优化方法都是确定一个搜索方向然后再用一个合适的步长来保证收敛性。不同的是梯度下降在寻找搜索方向的时候只利用了空间中当前点的信息,共轭梯度下降还利用了之前的搜索路径信息梯度下降法每次都直接选取当前点的梯度方向:这次求出的极小值点在之前搜索过的方向上又不是极小值了,这样就导致收敛速度比较慢甚至不收敛。