无约束最优化的常用方法

11/22/2017 12:40:56 PM

优化问题在很多领域有着重要的应用。为了日后查阅方便,本文列举常见的无约束优化方法的计算公式。

需要说明的是,本文的大部分内容选自图书《算法笔记》。

一、梯度下降法

梯度下降法(Gradient Descent Method)也叫做最速下降法(Steepest Descent Method),因为负梯度是函数局部下降最快的方向。

梯度下降

梯度下降法的迭代格式为

\[x_{k+1}=x_{k}-\alpha_k\nabla f(x_k) \]

梯度下降法非常简单,只需要知道如何计算目标函数的梯度就可以写出迭代格式。因此,尽管在不少情况下梯度下降法的收敛速度都很慢,也依然不影响它在工业界的广泛应用。梯度下降法应用到一些具体模型上有时也会被视作一类特定的算法,例如神经网络中的后向传导算法(Back Propagation Algorithm)。

随机梯度下降

在机器学习中经常有\(f(x)=\sum_{i=1}^m \ell_i(x)\),其中\(\ell_i(x)\)是第\(i\)个训练样本的损失函数。这时我们可以使用随机梯度下降法(Stochastic Gradient Descent Method)。其迭代格式为

\[x_{k+1}=x_{k}-\alpha_k\nabla \ell_r(x_k) \]

其中\(r\in \\{1,2,\cdots,m\\}\)为随机数。这种做法可以理解为随机选择一个训练样本,进行一次梯度下降的训练。在机器学习的问题中,我们通常不需要真的求得最优值,这样不精确的迭代,使得算法不容易过拟合。由于随机梯度下降法的普及,与此相对的梯度下降法有时被称为批量梯度下降法(Batch Gradient Descent Method),因为它同时考虑所有训练样本。介于批量梯度下降法和随机梯度下降法之间,还有小批量梯度下降法(Min-Batch Gradient Descent Method),也就是每次迭代选择若干个训练样本。

步长\(\alpha_k\)的选取

梯度下降法可采用BB步长(Barzilai Borwein)。BB步长有两个计算公式,选择其一即可。

\begin{aligned}
\alpha_k&=\frac{(\nabla f(x_k)-\nabla f(x_{k-1}))^T(x_k-x_{k-1})}{(\nabla f(x_k)-\nabla f(x_{k-1}))^T(\nabla f(x_k)-\nabla f(x_{k-1}))}\newline
\alpha_k&=\frac{(x_k-x_{k-1})T(x_k-x_{k-1})}{(x_k-x_{k-1})T(\nabla f(x_k)-\nabla f(x_{k-1}))}
\end{aligned}

BB步长适合我们在对步长选择缺乏经验的时候,它经常会有不错的效果。

二、共轭梯度法

由于每次都是沿着当前的负梯度方向逼近极小值,梯度下降法往往不能很快地收敛到极小值点。改进的方法是,在上一次梯度方向的共轭方向上进行迭代。

在这里,不对原理和公式推导进行过多介绍。下面直接给出迭代的公式。

\[x_{k+1}=x_k+\alpha_k d_k \]

其中,\(d_k\)为迭代方向,它由下面的式子确定

\[d_k=-\nabla f(x_k)+\beta_k d_{k-1} \]

这里使用系数\(\beta_k\)借助上一次的迭代方向\(d_{k-1}\),对迭代方向\(d_k\)进行一个修正。\(\beta_k\)的表达式不止一种,常用的式子如下

\[\beta_k=\frac{(\nabla f(x_k))^T(\nabla f(x_k)-\nabla f(x_{k-1}))}{(\nabla f(x_{k-1}))^T d_{k-1}} \]

三、牛顿法

牛顿方向和梯度方向最大的差别是考虑了Hessian矩阵(我们记\(x_k\)处的Hessian矩阵为\(\nabla^2 f(x_k)\))。

牛顿法的迭代格式为

\[x_{k+1}=x_k-\alpha_k(\nabla^2 f(x_k))^{-1}\nabla f(x_k) \]

这里的步长\(\alpha_k\)有多种取法。但与梯度下降法不同的是,这里步长取\(1\)的效果通常不错。值得注意的是,虽然我们写作\(d_k=-(\nabla^2 f(x_k))^{-1} \nabla f(x_k)\),但在计算\(d_k\)时,并不真正求逆,而是去求解线性方程组\((\nabla^2 f(x_k))d_k=-\nabla f(x_k)\)

假设\(f(x)\)是一元函数,那么上式将变为

\[x_{k+1}=x_k-\alpha\frac{f(x_k)}{f'(x_k)} \]

牛顿法的局限

牛顿法在计算上有一下局限性

  • 计算矩阵\(\nabla^2 f(x_k)\)可能要花费很长时间。
  • 可能没有足够的内存去存储矩阵\(\nabla^2 f(x_k)\)
  • \(\nabla^2 f(x_k)\)不一定可逆,也就是\((\nabla^2 f(x_k))^{-1}\)也就不一定存在。

因此一般只有当问题规模比较小,而且\(f(x_k)\)是严格凸函数的时候,我们才会考虑牛顿法。在其他情形下使用牛顿法,都需要设法进行一些修正。

四、拟牛顿法

牛顿法的局限性基本源于\(\nabla^2 f(x_k)\)。在拟牛顿法中,我们不直接使用\(\nabla^2 f(x_k)\),而是使用\(H_k\)近似代替。

在第一次迭代的时候,我们没有任何有效信息可以用于选取\(H_0\),因此一般直接取\(H_0=I\)。对于\(H_{k+1}\)的确定方法,下面给出两种方法,分别为BFGS(Brotden-Fletcher Goldfard Shanno)和DFP(Davidon Fletcher Powell)公式。为了书写方便,我们令\(s_k=x_{k+1}-x_k\)\(y_k=\nabla f(x_{k+1})-\nabla f(x_k)\)

BFGS公式:

\[H_{k+1}=(I-\frac{s_k y_k^T}{y_k^T s_k})H_{k}(I-\frac{y_k s_k^T}{y_k^T s_k})+\frac{s_k y_k^T}{y_k^T s_k} \]

DFP公式:

\[H_{k+1}=H_k+\frac{s_k s_k^T}{s_k^T y_k}-\frac{H_k y_k y_k^T H_k^T}{y_k^T H_k^T y_k} \]

于是拟牛顿法的迭代公式变为

\[x_{k+1}=x_k+\alpha_k H_k \nabla f(x_k) \]

这里的步长\(\alpha_k\)可以使用某种线搜索方法进行确定。(关于线搜索,有时间写一篇博文)

拟牛顿法很好地解决了Hessian矩阵的计算问题,但是仍然没有解决存储问题。一个很好的解决办法是有限内存BFGS方法。这里不做进一步的介绍。

参考文献

[1] ***瑞,谢研. 电子工业出版社. 2016年. 算法笔记.

本文链接:www.superzhang.site/blog/common-method-of-unconstrained-optimization

posted on 2017-12-06 10:55  SuperZhang828  阅读(4829)  评论(0编辑  收藏  举报

导航