计算机视觉大型攻略 —— 程序猿数学(1) 数值优化(一)无约束非线性优化

计算机视觉算法和机器学习算法大量使用了最优化理论。 这篇文章简单总(fan)结(yi)了一下数值优化[1]这本书的第一章到第四章。包括了数值优化的定义,分类,以及无约束的非线性优化算法概述,介绍了梯度下降法,牛顿法,拟牛顿法,BFGS, LM等几个经典算法。

主要参考文献:

[1] Numerical Optimization. Nocedal, Jorge, Wright, S.
[2] Computer vision: models, learning and inference. Simon J.D. Prince
[3] 最优化理论与方法, 袁亚湘

数值优化

数值优化指的是在一定的条件下,通过选择变量,最小化目标函数。

写成数学语言,  

                              \min _{x\in R^{n}} f(x)        且,       c_{i}(x)=0, i\in \varepsilon ,     c_{i}(x)\geqslant 0, i\in \tau .

其中,

  • 参数向量 x\in R^{n}              
  • 目标函数 f : R^{n}\rightarrow R
  • 等式约束 c_{i\in \varepsilon }: R^{n}\rightarrow R
  • 不等式约束 c_{i\in \tau }: R^{n}\rightarrow R

[1]中举了一个具体的例子,

假设目前需要优化以下函数,

                                \min (x_{1}-2)^{2} + (x_{2}-1)^{2}     s.t.     x_{1}^{2}-x_{2}\leqslant 0,    x_{1}+x_{2}\leqslant 2.

套一下上面的数学符号,

目标函数,

                                 f(x) =(x_{1}-2)^{2} + (x_{2}-1)^{2},  

参数向量,

                                 x=\begin{bmatrix} x_1\\ x_{2} \end{bmatrix},       

约束条件,

                                 c(x)=\begin{bmatrix} c_{1}(x)\\ c_{2}(x) \end{bmatrix} =\begin{bmatrix} -x_{1}^{2}+x_{2}\\ -x_{1}-x_{2}+2 \end{bmatrix},   \tau = \left \{ 1,2 \right \}, \varepsilon =\varnothing   

下图为该问题的几何表示,图中,x^{*} 为最优解,c1,c2分别代表了两个不等式约束,圆形虚线为f的等高线。白色区域为可行域(feasible region),即满足所有约束的点集。灰色区域为不可行域(infeasible region)。   

分类

数值优化问题包含了很多不同角度的分类。在[1]中的第一章有着详细的说明,挑几个列在下面。

线性与非线性

按照目标函数和约束条件的线性非线性可分为,

  • 线性规划问题(Linear programming problem)。目标函数与约束都是线性函数。
  • 非线性规划问题(non-linear programming problem)。目标函数或约束条件是非线性函数。

连续与离散

根据目标函数的连续与离散,可分为,

  • 离散优化(Discrete Optimization)。离散优化的可行集(Feasible set)是有限的,通常也是非凸的,例如组合规划问题,整数规划问题。
  • 连续优化(Continous Optimization)。由于目标函数由连续的,因此其可行集(feasible set)是无限。这类问题通过求导较容易求解。
  • 离散问题也可以重新定义成一组连续优化的问题来求解。

约束和无约束

根据约束条件不同可以分为有约束问题和无约束问题。显然,无约束问题通常容易求解。有约束的问题也可以转换成一组无约束的问题优化。

凸与非凸

根据目标函数凸,非凸的不同,可以分为凸优化,非凸优化

凸函数和非凸函数的区别如下图所示,

                                           

凸函数(Convex)定义,

                              f(\alpha x+(1-\alpha)y)) \leq \alpha f(x) + (1-\alpha)f(y), \; \; \; \; \; \alpha\in \left [ 0,1 \right ]

从上图可以看到,对于凸函数来说,局部最优就是全局最优,因此采用局部优化算法就可以实现全局优化。

                                          

局部最优算法也是非凸函数全局最优算法的一种解决方法,比如说,通过多个初始点,从每个初始点开始做局部优化算法,运气好的话,同样可以达到全局优化的目的。

全局与局部

对于凸函数来说,局部极值就是全局极值。而非凸函数二者还是有明显的不同。上图描述了优化算法中几种极值点。

  • 全局极小点(Global minimum):  f(x^{*}) \leq f(x), x\in \mathbb{R}
  • 严格局部极小点(Strong local minimum): f(x^{*}) < f(x) , x\in N,定义N为x^{*}的邻居集合。
  • 局部极小点(Week local minimum): f(x^{*}) \leq f(x) , x\in N。    

无约束非线性优化

无约束优化问题不需要考虑约束条件c_{i}(x)。通常还需要假设目标函数足够平滑(二阶可微)。这种算法通常分为基于梯度的算法与导数无关算法。显然,基于梯度的算法更趋向于求解局部最优,而导数无关的算法通常可以求解全局最优。

图像处理和机器学习算法采用了大量基于梯度的最优化算法,这类算法通常采用迭代的方式求解,即,给定一个初始点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

迭代函数为 x_{k+1} = x_{k}+\alpha_{k}p_{k}p_{k}定义了下降方向,\alpha_{k}定义了步长。

这类方法又可以分为两大类,线性搜索算法和信赖域算法。

  • 线性搜索(Line search)首先计算方向p_k,然后通过计算\min_{\alpha> 0} f(x_{k}+\alpha p_{k}) 求出α。
  • 信赖域(Trust region)首先选择一个\Delta _{k},使得在||x-x_k||<r范围内(信赖域)。目标函数用n为二次模型来逼近,以此选择一个搜索方向sk, 取xk+1 = xk+sk。

梯度下降法(Steepest descent)

梯度下降法属于线性搜索算法的一种,定义梯度方向为下降方向,

                               p_{k} = - \triangledown f(x_{k})

然后确定\alpha。此时梯度下降法通常不会真正通过优化函数\min_{\alpha> 0} f(x_{k}+\alpha p_{k})\alpha。而是设定一个最大迭代数与固定步长(或者可变步长 ),在迭代过程中检查收敛性,不停的逼近最优解。

吴恩达机器学习课程里的可变步长的一个例子:

                                                         \alpha = \frac{const1}{numIters+const2} 

步长随迭代次数下降。

梯度下降法的每一次迭代考虑的是这一步的最快下降方向,也可说他反映的是一种局部性质。而某些情况下,当前最优的方向未必是全局最优的方向。因此,梯度下降在很多情况下会出现锯齿现象,影响了收敛速度。

牛顿法(Newton Method)

牛顿法在梯度下降法的基础上,增加了二阶导数,改善了上述问题。二阶导数意味着梯度的变化。也就是说牛顿法不仅考虑了梯度本身还考虑了梯度的变化。

如上图所示,红色点和蓝色点的梯度(一阶导数)相同,但是二阶导数不同。红点二阶导数大于蓝色点。也就是说红点的梯度变化更大。如果梯度变化快,那么移动的距离就要小一点。同样的,如果梯度变化慢,那么移动的距离就可以大一点。

将目标函数二阶展开,即可同时考虑梯度和梯度变化。

                                    

为求f 的极值,等式两边对\theta求导,

                                         

得到使f(\theta )最小的\hat{\theta}

                                          

结合梯度法的迭代函数 x_{k+1} = x_{k}+\alpha_{k}p_{k},我们把牛顿法的迭代公式写作,

                                            

因此,下降方向为,

                                            p_{k} = - (\triangledown^{2} f(x_{k}))^{-1} \triangledown f(x_{k})

\lambda 为步长。通常牛顿法的步长可以设置为1。特别的,如果目标函数是一个二次函数,那么可以直接一步迭代得到最优解。

[2]中给出了一组梯度下降法和牛顿法的比较。

目标函数从蓝叉优化到绿叉。图a,和b采用梯度下降法,d和e采用牛顿法。图c为图b锯齿区域的放大示意。可以看到牛顿法的迭代次数比梯度下降法少很多。

然而,牛顿法采用了的二阶导数的逆矩阵,如果Hessian矩阵\triangledown ^{2}f(x_{k})不是正定矩阵,那么牛顿方向不一定是目标函数的下降方向。

由于目标函数在极点的Hessian矩阵是正定的,那么在他附近的点的Hessian矩阵也可以认为是正定的,因此,当初始点在极点附近时,牛顿法有效且收敛速度较快。

拟牛顿(Quasi-Newton)法

拟牛顿法构造了一个对称正定矩阵B_{k} 来近似Hessian矩阵,在牛顿法的基础上进一步完善了优化算法。拟牛顿法的下降方向可记为,

                                             p_{k} = -B^{-1}_{k}\triangledown f(x_{k})

拟牛顿法算法比牛顿法增加了一行,更新H_{k}H_{k} = B_{k}^{-1}H_{k}初始化为单位矩阵。这样每次更新不需要矩阵求逆。

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

常见的B_{k}H_{k}更新公式,

  • 对称秩一校正公式(symmetric-rank-one)

                       

                

  • BFGS校正公式(Broyden, Fletcher, Goldfarb, and Shanno)

                 

              

信赖域(Trust region)法

与上面的几个方法不同,信赖域法第一步不去计算搜索方向,而是首先选择一个长度,定义的邻域,在这个区域内定义二次模型m_{k},并最小化。如果优化结果不能满足精确度要求,那么缩小该区域,重新优化。

即在x_{k}的邻域内,定义和优化

                                                    \min_{p}m_{k}(x_{k}+p)

x_{k}+p 在信赖区(trust region)内,如果该函数不能使f下降,说明当前trust region太大了,此时缩小信赖域,重新求解上面的方程。可以将m_{k}定义为二次函数

                                            m_{k}(x_{k}+p)=f_{k}+g_{k}^{T}p +\frac{1}{2}p^{T}B_{k}p

f_{k} , g_{k}^{T} 点x_{k}的函数值和梯度,B_{k}是Hessian矩阵,或者是他的某种逼近形式。\left \| p \right \| \leq \Delta _{k} , \Delta _{k}是trust region的radius。

下图描述了线性搜索和信赖域法的区别。

                              

 

信赖域方法的首要为题是如何选择\Delta _{k}

定义一个变量\rho _{k}衡量信赖域,

                                     \rho _{k}=\frac{f(x_{k})-f(x_{k}+p_{k})}{m_{k}(0)-m_{k}(p_{k})}

分子为实际下降量,分母为预测下降量。

  • \rho _{k} 小,说明模型m预测的下降量高于模型f实际的下降量,需要缩小信赖域。
  • \rho _{k} 大,说明模型m预测的下降量低于实际模型f的下降量,可以采用此信赖域。

[1] 第四章给出了信赖域的算法伪代码,

典型的信赖度方法有Levenberg-Marquardt,Fletcher的超立方体方法等。下一篇关于最小二乘法的文章中会展开Levenberg-Marquardt法。

下一篇:最小二乘问题

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值