计算机视觉算法和机器学习算法大量使用了最优化理论。 这篇文章简单总(fan)结(yi)了一下数值优化[1]这本书的第一章到第四章。包括了数值优化的定义,分类,以及无约束的非线性优化算法概述,介绍了梯度下降法,牛顿法,拟牛顿法,BFGS, LM等几个经典算法。
主要参考文献:
[1] Numerical Optimization. Nocedal, Jorge, Wright, S.
[2] Computer vision: models, learning and inference. Simon J.D. Prince
[3] 最优化理论与方法, 袁亚湘
数值优化
数值优化指的是在一定的条件下,通过选择变量,最小化目标函数。
写成数学语言,
且,
其中,
- 参数向量
- 目标函数
- 等式约束
- 不等式约束
[1]中举了一个具体的例子,
假设目前需要优化以下函数,
s.t.
套一下上面的数学符号,
目标函数,
,
参数向量,
,
约束条件,
下图为该问题的几何表示,图中, 为最优解,c1,c2分别代表了两个不等式约束,圆形虚线为的等高线。白色区域为可行域(feasible region),即满足所有约束的点集。灰色区域为不可行域(infeasible region)。
分类
数值优化问题包含了很多不同角度的分类。在[1]中的第一章有着详细的说明,挑几个列在下面。
线性与非线性
按照目标函数和约束条件的线性非线性可分为,
- 线性规划问题(Linear programming problem)。目标函数与约束都是线性函数。
- 非线性规划问题(non-linear programming problem)。目标函数或约束条件是非线性函数。
连续与离散
根据目标函数的连续与离散,可分为,
- 离散优化(Discrete Optimization)。离散优化的可行集(Feasible set)是有限的,通常也是非凸的,例如组合规划问题,整数规划问题。
- 连续优化(Continous Optimization)。由于目标函数由连续的,因此其可行集(feasible set)是无限。这类问题通过求导较容易求解。
- 离散问题也可以重新定义成一组连续优化的问题来求解。
约束和无约束
根据约束条件不同可以分为有约束问题和无约束问题。显然,无约束问题通常容易求解。有约束的问题也可以转换成一组无约束的问题优化。
凸与非凸
根据目标函数凸,非凸的不同,可以分为凸优化,非凸优化
凸函数和非凸函数的区别如下图所示,
凸函数(Convex)定义,
从上图可以看到,对于凸函数来说,局部最优就是全局最优,因此采用局部优化算法就可以实现全局优化。
局部最优算法也是非凸函数全局最优算法的一种解决方法,比如说,通过多个初始点,从每个初始点开始做局部优化算法,运气好的话,同样可以达到全局优化的目的。
全局与局部
对于凸函数来说,局部极值就是全局极值。而非凸函数二者还是有明显的不同。上图描述了优化算法中几种极值点。
- 全局极小点(Global minimum): 。
- 严格局部极小点(Strong local minimum): ,定义N为的邻居集合。
- 局部极小点(Week local minimum): 。
无约束非线性优化
无约束优化问题不需要考虑约束条件。通常还需要假设目标函数足够平滑(二阶可微)。这种算法通常分为基于梯度的算法与导数无关算法。显然,基于梯度的算法更趋向于求解局部最优,而导数无关的算法通常可以求解全局最优。
图像处理和机器学习算法采用了大量基于梯度的最优化算法,这类算法通常采用迭代的方式求解,即,给定一个初始点x0,按照某一种迭代规则生成一个个迭代点序列{xk},当该序列为有穷点时,最后一个点为模型最优解,当其为无穷点时,其极限为最优解。
基于梯度的算法算法框架如下,
Choose initial variable x0, k=0
while (not converged)
//choose direction p_k and step length α_k
[p_k, α_k] = compute()
x_k+1 = x_k + α_k p_k
k++
end
迭代函数为 , 定义了下降方向,定义了步长。
这类方法又可以分为两大类,线性搜索算法和信赖域算法。
- 线性搜索(Line search)首先计算方向p_k,然后通过计算 求出α。
- 信赖域(Trust region)首先选择一个,使得在范围内(信赖域)。目标函数用n为二次模型来逼近,以此选择一个搜索方向sk, 取xk+1 = xk+sk。
梯度下降法(Steepest descent)
梯度下降法属于线性搜索算法的一种,定义梯度方向为下降方向,
然后确定。此时梯度下降法通常不会真正通过优化函数求。而是设定一个最大迭代数与固定步长(或者可变步长 ),在迭代过程中检查收敛性,不停的逼近最优解。
吴恩达机器学习课程里的可变步长的一个例子:
步长随迭代次数下降。
梯度下降法的每一次迭代考虑的是这一步的最快下降方向,也可说他反映的是一种局部性质。而某些情况下,当前最优的方向未必是全局最优的方向。因此,梯度下降在很多情况下会出现锯齿现象,影响了收敛速度。
牛顿法(Newton Method)
牛顿法在梯度下降法的基础上,增加了二阶导数,改善了上述问题。二阶导数意味着梯度的变化。也就是说牛顿法不仅考虑了梯度本身还考虑了梯度的变化。
如上图所示,红色点和蓝色点的梯度(一阶导数)相同,但是二阶导数不同。红点二阶导数大于蓝色点。也就是说红点的梯度变化更大。如果梯度变化快,那么移动的距离就要小一点。同样的,如果梯度变化慢,那么移动的距离就可以大一点。
将目标函数二阶展开,即可同时考虑梯度和梯度变化。
为求 的极值,等式两边对求导,
得到使最小的
结合梯度法的迭代函数 ,我们把牛顿法的迭代公式写作,
因此,下降方向为,
为步长。通常牛顿法的步长可以设置为1。特别的,如果目标函数是一个二次函数,那么可以直接一步迭代得到最优解。
[2]中给出了一组梯度下降法和牛顿法的比较。
目标函数从蓝叉优化到绿叉。图a,和b采用梯度下降法,d和e采用牛顿法。图c为图b锯齿区域的放大示意。可以看到牛顿法的迭代次数比梯度下降法少很多。
然而,牛顿法采用了的二阶导数的逆矩阵,如果Hessian矩阵不是正定矩阵,那么牛顿方向不一定是目标函数的下降方向。
由于目标函数在极点的Hessian矩阵是正定的,那么在他附近的点的Hessian矩阵也可以认为是正定的,因此,当初始点在极点附近时,牛顿法有效且收敛速度较快。
拟牛顿(Quasi-Newton)法
拟牛顿法构造了一个对称正定矩阵 来近似Hessian矩阵,在牛顿法的基础上进一步完善了优化算法。拟牛顿法的下降方向可记为,
拟牛顿法算法比牛顿法增加了一行,更新,。初始化为单位矩阵。这样每次更新不需要矩阵求逆。
Choose initial variable x0, k=0,H_0=I
while (not converged)
p_k = -H_k g_k
x_k+1 = x_k + α_k p_k
H_k+1 = update(H_k)
k++
end
常见的,更新公式,
- 对称秩一校正公式(symmetric-rank-one)
- BFGS校正公式(Broyden, Fletcher, Goldfarb, and Shanno)
信赖域(Trust region)法
与上面的几个方法不同,信赖域法第一步不去计算搜索方向,而是首先选择一个长度,定义的邻域,在这个区域内定义二次模型,并最小化。如果优化结果不能满足精确度要求,那么缩小该区域,重新优化。
即在的邻域内,定义和优化
在信赖区(trust region)内,如果该函数不能使下降,说明当前trust region太大了,此时缩小信赖域,重新求解上面的方程。可以将定义为二次函数
, 点的函数值和梯度,是Hessian矩阵,或者是他的某种逼近形式。 , 是trust region的radius。
下图描述了线性搜索和信赖域法的区别。
信赖域方法的首要为题是如何选择。
定义一个变量衡量信赖域,
分子为实际下降量,分母为预测下降量。
- 小,说明模型预测的下降量高于模型实际的下降量,需要缩小信赖域。
- 大,说明模型预测的下降量低于实际模型的下降量,可以采用此信赖域。
[1] 第四章给出了信赖域的算法伪代码,
典型的信赖度方法有Levenberg-Marquardt,Fletcher的超立方体方法等。下一篇关于最小二乘法的文章中会展开Levenberg-Marquardt法。
下一篇:最小二乘问题。