码迷,mamicode.com
首页 > 其他好文 > 详细

无约束优化方法

时间:2016-08-02 19:20:12      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:

本文讲解的是无约束优化中几个常见的基于梯度的方法,主要有梯度下降与牛顿方法、BFGS 与 L-BFGS 算法,无约束优化的问题形式如下,对于 $x \in \mathbb{R}^n$ ,目标函数为:

\[\min_xf(x)\]

泰勒级数

基于梯度的方法都会涉及泰勒级数问题,这里简单介绍一下,泰勒级数就是说函数 $f(x)$ 在点 $x_0$ 的邻域内具有 $n+1$ 阶导数,则该邻域内 $f(x)$ 可展开为 $n$ 阶泰勒级数为:

\[f(x) = f(x_0) + \nabla f(x_0)(x-x_0)+\frac{\nabla^2f(x_0)}{2!}(x-x_0)^2+…+\frac{\nabla^nf(x_0)}{n!}(x-x_0)^n\]

梯度下降法

梯度下降法又叫最速下降法,是一种通过迭代来求取极值的方法,它使用目标函数的一阶导数信息,每次迭代取目标函数值下降最快的方向作为搜索方向,目标函数 $f(x)$ 在什么方向下降最快呢?答案无疑是梯度方向了,这里给出一个证明,假设 $x$ 沿方向 $d \in \mathbb{R}^n$ 的方向迭代,这里 $d$ 为单位向量,即 $||d|| = 1$ ,另外给一个步长参数记做 $\alpha$ ,代表每次沿 $d$ 走多大的一步,将 $f(x)$ 在 $x$ 处展开为泰勒展式:

\[f( x + \alpha d) =  f(x)  + \alpha \nabla f(x)d\]

这里严格意义上应该取 “ $\approx$ ” 因为只取了一阶泰勒。目标是为了使得使迭代后目标函数值 $f( x + \alpha d)$ 尽可能减小,即使得 $f(x) – f(x+ad)$ 尽可能大,根据:

\[f(x) – f(x+ad) = – \alpha \nabla f(x) d \]

忽略步长参数 $\alpha$, 可得极大化 $f(x) – f(x+ad)$  等价于:

\[ \min \nabla f(x) d \]

$\nabla f(x)d$ 代表两向量的乘积,当向量大小一致是,方向相反时便能取得最小值,所以要想使得迭代后以目标函数以最快速度下降,$d$ 应该是梯度的反方向,即负梯度方向,也就是说 $x$ 应该沿着 $-\nabla f(x)$ 的方向前进便能得到极小值,于是梯度的算法如下:

\[x^{k+1} := x^{k} – \alpha \nabla  f(x_k)\]

牛顿方法

牛顿方法也是一种迭代的方法,不同于梯度下降,该方法引入了二阶导数信息,假设当前迭代到第 k 次,将目标函数 $f(x)$ 在 $x_k$ 处展开为二阶泰勒级数:

\[ f(x) \approx \phi(x)=  f(x_k)  + \nabla f(x_k) (x-x_k)+ \frac{1}{2} (x –x_k)^T\nabla^2 f(x_k )(x-x_k)\]

在这个关于 $x$ 的二次函数里,另其导数得 $0$ ,得到的点即可作为下一次目标函数迭代的点 $x_{k+1}$  ,人们常说的牛顿方法是曲面拟合,这个曲面正是关于 $x_k$ 邻域的值 $x$ 的二次函数 ,两端同时对 $x$ 求导,即可得:

\[\nabla\phi(x) = \nabla f(x_k) + \nabla^2 f(x_k )(x-x_k)  = 0 \]

即:\[x_{k+1} = x_k -\nabla -2 f(x_k ) ( \nablaf(x_k)  \]

公式里的 $\nabla f$ 为梯度向量 ,$\nabla^2 f$ 为 Hessian 矩阵,方便起见,将 $\nabla f(x_k)$ 记做 $g_k$ ,$\nabla^2 f$  记做 $H_k$ ,形式如下:

\[  g = \nabla f = \begin{bmatrix} \frac{\partial f }{\partial x_1} \\ \frac{\partial f }{\partial x_2} \\ \vdots\\\frac{\partial f }{\partial x_n} \\  \end{bmatrix} \ \ \ \
H = \nabla^2 f = \begin{bmatrix}
\frac{\partial^2 f }{\partial^2 x_1}& \frac{\partial^2 f }{\partial x_1 x_2} & \cdots  &\frac{\partial ^2 f }{\partial x_1x_n} \\
\frac{\partial^2 f }{\partial^2 x_1x_2}& \frac{\partial^2 f }{\partial  x_2^2} &\cdots  &\frac{\partial ^2 f }{\partial x_2x_n} \\
\vdots & \vdots  & \ddots  & \vdots \\
\frac{\partial^2 f }{\partial^2 x_nx_1}& \frac{\partial^2 f }{\partial x_n x_2} &\cdots &\frac{\partial ^2 f }{\partial x_n^2} \\
\end{bmatrix}  \]

牛顿法是二次收敛的,并且收敛阶数是2。一般目标函数在最优点附近呈现为二次函数,于是可以想像最优点附近用牛顿迭代法收敛是比较快的。而在开始搜索的几步,我们用梯度下降法收敛是比较快的。将两个方法融合起来可以达到满意的效果。

  牛顿法要求Hessien 矩阵必须是正定的

这种牛顿法虽然具有二次收敛性,但是要求初始点需要尽量靠近极小点,否则有可能不收敛。计算过程中需要不断计算目标函数的二阶偏导数,计算量大。而且Hesse矩阵无法一直保持正定,会导致算法产生的方向不能保证是f(x)在 xk处的下降方向,从而牛顿法失效(只有Hesse矩阵正定,才能保证fxfx在xkxk处下降)。

牛顿法是二阶收敛,收敛速度更快 牛顿法每次计算都需要计算目标函数的二阶偏导数,难度较大,并且无法保证Hesse矩阵的正定性 牛顿法是用一个二次曲面去拟合当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部平面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路经会更符合真实的最优下降路经 拟牛顿法不需要计算二阶偏导数,用近似矩阵来代替Hesse矩阵

 

拟牛顿法

 

BFGS

L-BFGS

在x_k 的邻域内展开为二阶泰勒,这是关于x 的二次函数,该函数的导数为0的点即这个二次函数的一个极值点。

 

1、根据三个信息:(xk,f(xk))、(xk,f‘(xk))、(xk,f‘‘(xk))得到的拟合曲线,本质就是抛物线(这就是咱们课上我说的“抛物线”的由来,虽然其他文献貌似没这么说——但这个肯定是对的,看一下Taylor展式即可)。
2、由于二阶导f‘‘(xk)可能为0甚至为负,则迭代后的xk+1可能不是下降方向(如果为0,则无法计算)。
3、因为使用了二阶导数,所以可以粗略的认为是二次收敛的——如果精确计算,则计算二次值的比值的极限即可。

 

http://tangxman.github.io/2015/11/19/optimize-newton/

http://www.cnblogs.com/richqian/p/4535550.html

http://www.cnblogs.com/zhangchaoyang/articles/2600491.html

无约束优化方法

标签:

原文地址:http://www.cnblogs.com/ooon/p/5729982.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!