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)。spa
在机器学习中常常有\(f(x)=\sum_{i=1}^m \ell_i(x)\),其中\(\ell_i(x)\)是第\(i\)个训练样本的损失函数。这时咱们可使用随机梯度降低法(Stochastic Gradient Descent Method)。其迭代格式为blog
\[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),也就是每次迭代选择若干个训练样本。get
梯度降低法可采用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)}\]
牛顿法在计算上有一下局限性
所以通常只有当问题规模比较小,并且\(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